取色精灵主要用于屏幕取色
主要界面:
取色框
取色设置
软件设置
取色历史
在这里记下一些主要和通用功能的实现
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