当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 为你的程序换个皮肤
为你的程序换个皮肤 下载源代码 BOOL IRStartup( HINSTANCE hModule, DWORD dwThreadID ){ globalWndHookEx = SetWindowsHookEx( WH_CALLWNDPROC, (HOOKPROC) IRCallWndProc, hModule, dwThreadID ); return TRUE;} 这也是像SkinMagic一类工具的初始化函数。当然在退出时也要释放钩子的。 BOOL IRComplete( void ){ UnhookWindowsHookEx( globalWndHookEx ); return TRUE;} 接下来,就是IRCallWndProc这个回调函数的编写,这是至关重要的一个环节,这个函数就是对所要换肤的类对象进行了监视,并改变其消息处理函数,实现换肤的目的。 LRESULT CALLBACK IRCallWndProc( int nCode, WPARAM wParam, LPARAM lParam ){ PCWPSTRUCT pcs = (PCWPSTRUCT) lParam; HWND hWnd = pcs->hwnd; if( hWnd ) { char sClassName[201] = "\0"; GetClassName( hWnd, sClassName, 200 ); if( strcmp( sClassName, "Button" ) == 0 ) { CWnd *pWnd = CWnd::FromHandle( hWnd ); DWORD dwStyle = pWnd->GetStyle(); if( dwStyle == 0x50010000 ) { WNDPROC WndProc; WndProc = (WNDPROC) GetWindowLong( hWnd, GWL_WNDPROC ); if( CButtonExt::m_cWndProc != NULL && \ WndProc != CButtonExt::m_cWndProc ) { return CallNextHookEx( globalWndHookEx, nCode, wParam, lParam ); } if( WndProc != (WNDPROC) CButtonExt::DefWindowProc ) { WndProc = (WNDPROC) SetWindowLong( hWnd, GWL_WNDPROC, (LONG) CButtonExt::DefWindowProc ); CButtonExt::m_cWndProc = WndProc; } } } } return CallNextHookEx( globalWndHookEx, nCode, wParam, lParam );} 这样就对按钮的消息进行了挂钩处理了,就可以重新来绘制按钮了。紧接着就是给出按钮控件的绘制方法,我是用一个类来实现的,都是使用的静态函数直接调用的。 #define STATUS_BUTTON_NORMAL 0x00000000#define STATUS_BUTTON_HOVER 0x00000001#define STATUS_BUTTON_DOWN 0x00000002class CButtonExt{public: CButtonExt() {} ~CButtonExt() {} static UINT m_nStatus; static WNDPROC m_cWndProc; static LRESULT DefWindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { CWnd *pWnd = NULL; CPoint point; pWnd = CWnd::FromHandle( hWnd ); switch( message ) { case WM_PAINT: return OnPaint( pWnd ); break; case WM_LBUTTONDOWN: point.x = LOWORD(lParam); point.y = HIWORD(lParam); return OnLButtonDown( pWnd, 0, point ); break; case WM_LBUTTONUP: point.x = LOWORD(lParam); point.y = HIWORD(lParam); return OnLButtonUp( pWnd, 0, point ); break; case WM_LBUTTONDBLCLK: point.x = LOWORD(lParam); point.y = HIWORD(lParam); return OnLButtonDblClk( pWnd, 0, point ); break; case WM_MOUSEMOVE: point.x = LOWORD(lParam); point.y = HIWORD(lParam); return OnMouseMove( pWnd, 0, point ); break; defa |