【WM】工作窗口类原理和实现
2010-04-19 21:25
204 查看
通过Remote Spy我们常能见到类名为Worker的窗口(如下图所示),那么工作窗口类是什么呢?
![](http://hi.csdn.net/attachment/201004/19/0_1271684216b101.gif)
其实工作窗口与常规窗口十分相似,只不过我们无需调用RegisterClass()函数注册窗口类,并把我们传入的p参数作为窗口的额外数据保存了起来。想来微软青睐这类不可见的窗口也就是为了简化步骤,提高效率而已。
我们先来看看如何创建工作窗口的。在头文件miscsvcs.h内有CreateWorkerWindow()函数的原型声明:
// *************************************************************************
// CreateWorkerWindow
//
// Purpose:
// Helper function to create a worker window
//
// Parameters:
// pwszClass Class name (NULL preferred, unless you need a unique class)
// pfnWndProc Window proc for worker window
// hwndParent Parent
// dwExStyle WS_EX_* styles
// dwFlags WS_* styles
// pwszTitle Window title
// hmenu Menu or child ID
// p Comes through in lParam of CREATESTRUCT during WM_CREATE processing
//
// Returns:
// HWND of worker window
//
// Side Effects:
// none
// *************************************************************************
HWND CreateWorkerWindow(TCHAR *pwszClass, WNDPROC pfnWndProc, HWND hwndParent,
DWORD dwExStyle, DWORD dwFlags, TCHAR *pwszTitle,
HMENU hmenu, void * p);
下面给出CreateWorkerWindow()函数的实现:
![](http://hi.csdn.net/attachment/201004/19/0_1271684216b101.gif)
其实工作窗口与常规窗口十分相似,只不过我们无需调用RegisterClass()函数注册窗口类,并把我们传入的p参数作为窗口的额外数据保存了起来。想来微软青睐这类不可见的窗口也就是为了简化步骤,提高效率而已。
我们先来看看如何创建工作窗口的。在头文件miscsvcs.h内有CreateWorkerWindow()函数的原型声明:
// *************************************************************************
// CreateWorkerWindow
//
// Purpose:
// Helper function to create a worker window
//
// Parameters:
// pwszClass Class name (NULL preferred, unless you need a unique class)
// pfnWndProc Window proc for worker window
// hwndParent Parent
// dwExStyle WS_EX_* styles
// dwFlags WS_* styles
// pwszTitle Window title
// hmenu Menu or child ID
// p Comes through in lParam of CREATESTRUCT during WM_CREATE processing
//
// Returns:
// HWND of worker window
//
// Side Effects:
// none
// *************************************************************************
HWND CreateWorkerWindow(TCHAR *pwszClass, WNDPROC pfnWndProc, HWND hwndParent,
DWORD dwExStyle, DWORD dwFlags, TCHAR *pwszTitle,
HMENU hmenu, void * p);
下面给出CreateWorkerWindow()函数的实现:
typedef struct tagTEMPPROCPARAMS { LPARAM lParam; WNDPROC pfnWndProc; } TEMPPROCPARAMS, *LPTEMPPROCPARAMS; LRESULT TempWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg != WM_CREATE) { return DefWindowProc(hwnd, uMsg, wParam, lParam); } else { SetWindowLong(hwnd, 0, ((LPTEMPPROCPARAMS)lParam)->lParam); if (((LPTEMPPROCPARAMS)lParam)->pfnWndProc) { SetWindowLong(hwnd, GWL_WNDPROC, (LONG)((LPTEMPPROCPARAMS)lParam)->pfnWndProc); return ((LPTEMPPROCPARAMS)lParam)->pfnWndProc(hwnd, uMsg, wParam, ((LPTEMPPROCPARAMS)lParam)->lParam); } return NO_ERROR; } } HWND CreateWorkerWindow(TCHAR *pwszClass, WNDPROC pfnWndProc, HWND hwndParent, DWORD dwExStyle, DWORD dwFlags, TCHAR *pwszTitle, HMENU hmenu, void * p) { WNDCLASS wc = {0}; wc.style = CS_DBLCLKS; wc.lpfnWndProc = TempWndProc; wc.cbWndExtra = sizeof(LPARAM); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wc.lpszClassName = (pwszClass) ? pwszClass : TEXT("Worker"); RegisterClass(&wc); TEMPPROCPARAMS tempProcParams = {(LPARAM)p, pfnWndProc}; return CreateWindowEx(dwExStyle, wc.lpszClassName, pwszTitle, dwFlags, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hwndParent, hmenu, NULL, &tempProcParams); }
相关文章推荐
- 调试器工作原理之二――实现断点
- hibernate 工作的实现原理步骤
- 调试器工作原理之二——实现断点
- 调试器工作原理(2):实现断点
- AJAX的实现原理和工作流程
- ArrayList工作原理及实现
- 浅析 Linux 中的时间编程和实现原理,第 3 部分: Linux 内核的工作
- Liferay7 BPM门户开发之11: Activiti工作流程开发的一些统一规则和实现原理(完整版)
- Spring IOC/BeanFactory/ApplicationContext的工作流程/实现原理/初始化/依赖注入源码详解
- 浅析 Linux 中的时间编程和实现原理,第 3 部分: Linux 内核的工作
- (转)调试器工作原理(2):实现断点
- 调试器工作原理之二——实现断点
- 浅析 Linux 中的时间编程和实现原理,第 3 部分: Linux 内核的工作
- ArrayList工作原理及实现
- ArrayList工作原理及实现
- Android SwipeRefreshLayout实现工作原理.
- 调试器工作原理(2):实现断点
- Linux调试器工作原理之二——实现断点
- Mybatis实现原理/工作流程
- 浅析 Linux 中的时间编程和实现原理,第 4 部分: Linux 内核的工作