您的位置:首页 > 其它

【WM】工作窗口类原理和实现

2010-04-19 21:25 204 查看
通过Remote Spy我们常能见到类名为Worker的窗口(如下图所示),那么工作窗口类是什么呢?


其实工作窗口与常规窗口十分相似,只不过我们无需调用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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: