取色精灵主要用于屏幕取色
主要界面:
取色框
取色设置
软件设置
取色历史
在这里记下一些主要和通用功能的实现
在本程序中主界面是非模态对话框,如果在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; }
如果使用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
引入动态链接库
#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);
/************************************************************************/ /* 设置窗口为悬浮窗口 */ /************************************************************************/ 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);
设置范围
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);