WEB开发网
开发学院软件开发VC 关于如何换肤、子类化的解决方案 阅读

关于如何换肤、子类化的解决方案

 2010-06-23 20:40:47 来源:WEB开发网   
核心提示:对于应用程序的换肤及子类化,下面是我尝试过一些方法,关于如何换肤、子类化的解决方案,以在CAboutDlg中子类化其中的Button为例:第一种:直接用现成的类1、自己写一个类class CButtonXP : public CButton{/*...*/}用MessageMap处理感兴趣的消息,2、用CButtonX

对于应用程序的换肤及子类化。下面是我尝试过一些方法,以在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));

1 2 3 4 5 6  下一页

Tags:关于 如何 子类

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接