1.4 公共模块设计(2)
代码贴士
SetBkMode:设置背景模式,值为TRANSPARENT时进行透明处理。
CreateFont:初始化用指定特性定义的CFont对象。
InvalidateRect:屏蔽一个窗口客户区的全部或部分区域,会导致窗口在事件期间部分重画。
SendMessage:将指定的消息发送到一个或多个窗口,此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。
然后,定义一个新的定义按钮窗口函数,取代按钮默认的窗口函数,对一些消息进行特殊处理。代码如下:
- LRESULT __stdcall DefWindowProc1(HWND hWnd,UINT Msg,
WPARAM wParam, LPARAM lParam ) - {
- CPoint pt;
- CDrawButton *pButton=(CDrawButton*)GetWindowLong
(hWnd,GWL_USERDATA); //获得窗口信息 - switch (Msg)
- {
- case WM_LBUTTONDBLCLK: //屏蔽双击事件
- {
- return TRUE;
- break;
- }
- case WM_PAINT: //绘制窗口事件
- {
- if (pButton->m_Style>0)
- return pButton->OnPaint( hWnd);
- else
- return CallWindowProc
(pButton->m_OldProc, hWnd,Msg,wParam,lParam); - break;
- }
- case WM_LBUTTONDOWN: //鼠标左键按下事件
- {
- pt.x = LOWORD(lParam); //鼠标按下的横坐标
- pt.y = HIWORD(lParam); //鼠标按下的纵坐标
- if (pButton->m_Style>0)
- return pButton->OnLButtonDown( hWnd, 0, pt );
- else
- return CallWindowProc(pButton-
>m_OldProc, hWnd,Msg,wParam,lParam); - break;
- }
- case WM_LBUTTONUP: //鼠标左键抬起事件
- {
- pt.x = LOWORD(lParam); //鼠标按下的横坐标
- pt.y = HIWORD(lParam); //鼠标按下的纵坐标
- if (pButton->m_Style>0)
- return pButton->OnLButtonUp( hWnd, 0,pt );
- else
- return CallWindowProc(pButton-
>m_OldProc, hWnd,Msg,wParam,lParam); - break;
- }
- case WM_MOUSEMOVE: //鼠标移动事件
- {
- pt.x = LOWORD(lParam); //鼠标按下的横坐标
- pt.y = HIWORD(lParam); //鼠标按下的纵坐标
- if (pButton->m_Style>0)
- return pButton->OnMouseMove(hWnd,0, pt);
- else
- return CallWindowProc(pButton->
m_OldProc, hWnd,Msg,wParam,lParam); - break;
- }
- case WM_DESTROY: //销毁窗口
- {
- WNDPROC procOld=pButton->m_OldProc;
- SetWindowLong(hWnd,GWL_WNDPROC,
(long)procOld); //恢复原来的窗口函数 - CWnd* pWnd = ::CWnd::FromHandle(hWnd);
//将按钮对象与控制块分离 - if (pWnd)
- {
- pWnd->Detach();
- }
- pButton->m_Flag = 1;
- return 1;
- }
- default :
- {
- break;
- }
- }
- return CallWindowProc(pButton->m_OldProc, hWnd,
Msg, wParam, lParam ); - }