首页 / 软件开发 / C++ / 关于如何换肤、子类化的解决方案
关于如何换肤、子类化的解决方案2010-06-23对于应用程序的换肤及子类化。下面是我尝试过一些方法,以在CAboutDlg中子类化其中的Button为例:第一种:直接用现成的类1、自己写一个类class CButtonXP : public CButton{/*...*/}用MessageMap处理感兴趣的消息。2、用CButtonXP代替CButton来声明变量m_btn;3、在void CAboutDlg:DoDataExchange(CDataExchange* pDX)中加上一句:DDX_Control(pDX, IDB_BUTTON1, m_edit);
或者在 InitDialog() 中加上m_btn.SubclassDlgItem(IDB_BUTTON1, this);
这两种效果差不多的。第二种:在 Hook 中使用现成的类1、自己写一个类 class CButtonXP : public CButton{/*...*/}用 MessageMap 处理感兴趣的消息。2、使用 SetWindowsHookEx 安装一个钩子:g_hWndProcHook = ::SetWindowsHookEx(WH_CALLWNDPROC,WndProcHook,NULL,::GetCurrentThreadId());
3、在 WndProcHook 中处理窗口创建和销毁的消息:LRESULT CALLBACK WndProcHook(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
switch (((CWPSTRUCT*) lParam)->message)
{
case WM_CREATE:
BeginSubclassing(((CWPSTRUCT*) lParam)->hwnd);
break;
case WM_NCDESTROY:
// TODO: clear subclass info.
EndSubclassing(((CWPSTRUCT*) lParam)->hwnd);
break;
default:
break;
}
}
return CallNextHookEx(g_hWndProcHook, code, wParam, lParam);
}
4、在 BeginSubclassing 中用 GetClassName 得到类名,例如 "Button",然后用 CButtonXP 类进行子类化。CButtonXP pButton = new CButtonXP;
VERIFY(pButton ->SubclassWindow(hWnd));