如何实现控件自绘?
情况一:WTL下的控件自绘
WTL下,有现成的CButton、CEdit等控件,定义新的控件类时,只需要有选择的继承自它们,然后在新控件类的WM_PAINT中做绘制处理即可。例如:
- class CButtonImpl :
- public CWindowImpl<COwnerDrawBtnImpl, CButton>
- {
- public:
- CButtonImpl(void) { }
- ~CButtonImpl(void) { }
- BEGIN_MSG_MAP(CButtonImpl)
- MESSAGE_HANDLER(WM_PAINT, OnPaint)
- DEFAULT_REFLECTION_HANDLER()
- END_MSG_MAP()
- LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled)
- {
- ……
- }
- };
在Win32下,没有现成的控件(实际上WTL是对Win32进行了封装),如果需要绘制控件,需要先进行子类化。例如现在要对一个按钮IDC_BUTTON进行自绘。
- WNDPROC preProc;
- preProc= (WNDPROC)SetWindowLong(GetDlgItem(hWnd, IDC_BUTTON), GWL_WNDPROC, (LONG)ButtonPro);
- LRESULT CALLBACK ButtonPro(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- HPEN hPen, hOldPen;
- hPen = NULL;
- hOldPen = NULL;
- switch(message)
- {
- case WM_PAINT:
- {
- ……//绘制处理
- }
- break;
- ……
- }
- return CallWindowProc(preProc, hWnd, message, wParam, lParam); //其他的交给默认的窗口过程处理
- }
这样就能实现控件自绘了。