MFC界面编程之 关于如何换肤、子类化的解决方案

本文属于第35期, 适合中级读者

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

第三种 在Hook中使用窗口过程

1、自己写一个按钮的窗口过程

WNDPROC oldProc;

LRESULT CALLBACK ProcButton(HWND hWnd,
   UINT uMsg,
   WPARAM wParam,
   LPARAM lParam)
{
 ASSERT(oldProc != 0);
 if (oldProc == 0) return TRUE;

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值