3.取色精灵V2.0-非模态对话框自建消息队列、VS2008风格对话框、使用Common Controls、悬浮透明窗口、使用SLIDER控件

取色精灵主要用于屏幕取色

主要界面:

取色框


取色设置


软件设置


取色历史



在这里记下一些主要和通用功能的实现

1.非模态对话框自建消息队列

在本程序中主界面是非模态对话框,如果在WinMain函数中直接使用CreateDialog函数创建非模态对话框然后ShowWindnow发现对话框秒退,这是因为非模态对话框是没有自己的消息队列的。在一般的程序中是由主线程消息队列对其消息进行分发的,所以我们创建一个消息队列以分发非模态对话框消息。

代码如下

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	HWND hwndSettingDlg;
	MSG msg;

	/************************************************************************/
	/* 创建非模态对话框                                                     */
	/************************************************************************/
	hwndSettingDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_SETTING), NULL, SettingDlgProc);
	ShowWindow(hwndSettingDlg, SW_NORMAL);
	
	/************************************************************************/
	/*直接开启消息循环                                                      */
	/************************************************************************/
    while (GetMessage (&msg, NULL, 0, 0))
    {
		if(hwndSettingDlg==0 || !IsDialogMessage(hwndSettingDlg, &msg))//分发消息到非模态对话框
		{
			TranslateMessage (&msg);
			DispatchMessage (&msg);
		}
    }
	
    return msg.wParam;
}

2.VS2008风格对话框

如果使用VS2008编写程序发现在对话框设计器中设计的窗体及控件外观比较漂亮,但是编译程序后弹出的对话框却还是比较老式 的对话框窗体和控件,这是由于链接的控件版本过低的缘故,使用内嵌的manifest程序清单修改链接的控件版本即可即可,代码如下

/*确保生成的是VS2008风格的对话框*/
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

3.使用Common Controls

除去基本控件,Windows还提供一些通用控件供我们使用,但是这些控件需要动态链接进来

引入动态链接库

#include <commctrl.h>

#pragma comment(lib,"ComCtl32.lib")
指定要链接的控件类型

// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;			//指定要链接的控件类型
InitCommonControlsEx(&InitCtrls);

4.悬浮透明窗口

在有些程序中,需要使用悬浮透明窗口,如本程序的取色框界面。一般采用对话框,修改其为无Border,使用如下函数

/************************************************************************/
/* 设置窗口为悬浮窗口                                                   */
/************************************************************************/
void SetWindowToSuspend(HWND hwnd)
{
	SetWindowLong(hwnd, GWL_STYLE, WS_POPUP);							//悬浮窗口无边界,一旦附加WS_VISVIBLE窗口立即显示
	SetWindowLong(hwnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED);	//设置悬浮窗口为所有窗口顶端并且为分层窗口
	SetLayeredWindowAttributes(hwnd, 0, 255, LWA_ALPHA);				//设置窗口透明度
}

由于这时候对话框没有了标题栏,故无法完成鼠标拖动功能,我们可以在鼠标点击客户区时伪装成标题栏消息来完成拖动功能

	case WM_LBUTTONDOWN:
		SendMessage(hDlg, WM_NCLBUTTONDOWN, HTCAPTION, 0);//左键拖动窗口
		return (TRUE);

5.使用SLIDER控件

SLIDER控件是Common Control,但是在MSDN中查看Control Library是看不到Slider Control的,其实Windows将它划分为TrackBar了,使用TrackBar的相关消息宏

设置范围

SendMessage(GetDlgItem(hDlg, IDSL), TBM_SETRANGE, TRUE, (LPARAM)MAKELONG(0, 255));

设置当前位置

SendMessage(GetDlgItem(hDlg, IDSL), TBM_SETPOS, TRUE, 0);

处理滚动和获得当前位置(水平在WM_HSCROLL消息中处理,竖直在WM_VSCROLL消息中处理)

case WM_VSCROLL:
	//获得滚动条值
	curPos = SendMessage(GetDlgItem(hDlg, IDSL), TBM_GETPOS, 0, 0);
	return (TRUE);


最新的取色精灵源代码和可执行文件 链接

原创,转载请注明来自 http://blog.csdn.net/wenzhou1219

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值