1回顶部 大家都知道如果你想用一个好看的按钮,你通常的做法是两种:1 映射按钮变量 2 .h定义 CExButton m_btn;然后m_btn.SubclassDlgItem 。这两种做法对于小程序,小工程没有问题但是当工程一大,做起来特别费劲而且容易出错,如果你想去掉这些换一种界面无疑是一场噩梦!下面介绍方法原理简单,实用而且方便。 首先: class CLxpSkin CLxpSkin(HWND hDlg); //一个类的实例对应一个对话框 ~CLxpSkin(); public: CList<CXPButton*,CXPButton *>m_btnList;//对应一个窗口下面所有的 button 链表 CList<CEditEx *,CEditEx *>m_edtList;//对应一个窗口下面所有的 edit 链表 CList<CLineStatic *,CLineStatic *>m_lineList;//对应一个窗口下面所有 static 链 表 CList<CFlatComboBox *,CFlatComboBox *>m_cmbList;//对应一个窗口下面所有 ComboBox 链表 CList<CExCheckBox *,CExCheckBox *>m_chkList;//对应一个窗口下面所有 CheckBox 链 表 CList<CExGroupBox *,CExGroupBox *>m_grpList;//对应一个窗口下面所有 CheckBox 链 表 private: 2回顶部 HWND m_hDlg; static BOOL InstallSkin(HWND hDlg); static void UnInstallSkin(HWND hDlg); 使用方法如下: m_hWnd) 对应的Cpp文件如下: 3回顶部 while(pos != NULL) { delete m_chkList.GetNext(pos); } pos=m_grpList.GetHeadPosition(); while(pos != NULL) { delete m_grpList.GetNext(pos); } } BOOL CLxpSkin::InstallSkin(HWND hDlg) { ASSERT(::IsWindow(hDlg)); TCHAR szBuf[256]; HWND hWnd; int nIdFirst; DWORD dwStyle; CLxpSkin * pSkin=new CLxpSkin(hDlg); //将每一个对话框的句柄和每一个类实例映射起来 hWnd=GetWindow(hDlg,GW_CHILD); do //Edit子类化 if( _tcsicmp(szBuf,_T("Edit")) == 0) 4回顶部 //子类化此窗口 pEdit->SubclassWindow(hWnd); } } //button子类化 if(_tcsicmp(szBuf,_T("Button")) == 0) TCHAR szBuf[256]; //PushButton子类化 if( (dwStyle & SS_TYPEMASK) == BS_PUSHBUTTON) //Checkbox子类化 else if( (dwStyle & SS_TYPEMASK) == BS_CHECKBOX ) 5回顶部 } } else if( ( dwStyle & SS_TYPEMASK) == BS_GROUPBOX) { if(CWnd::FromHandlePermanent(hWnd) == NULL) { CExGroupBox *pGrp=new CExGroupBox(); if(pGrp == NULL) return FALSE; pSkin->m_grpList.AddTail(pGrp); pGrp->SubclassWindow(hWnd); } } } //static子类化 if( (_tcsicmp(szBuf,_T("Static")) == 0) SS_ETCHEDHORZ) //ComboBox子类化 if( _tcsicmp(szBuf,_T("ComboBox")) == 0) 6回顶部 { CFlatComboBox *pCmb=new CFlatComboBox(); if(pCmb == NULL) return FALSE; pSkin->m_cmbList.AddTail(pCmb); pCmb->SubclassWindow(hWnd); } } //etc hWnd=GetWindow(hWnd,GW_HWNDNEXT); }while(nIdFirst != GetDlgCtrlID(hWnd)); return TRUE; } 优点:这个类不仅仅可以换界面还可以将工程当中的某些控件功能轻易的改变和还原. |
正在阅读:不用Hook也能实现方面快捷的换肤功能不用Hook也能实现方面快捷的换肤功能
2004-02-14 09:34
出处:PConline
责任编辑:linjixiong