文章目录
1.CPaintManagerUI类
- 1.CPaintManagerUI类
- 2.作者答疑
如果读者从网上复制过代码,然后生成过项目,就是一定首当其冲的面对过这个类,这个类是WindowImplBase基类的一个成员变量,如下所示:
CPaintManagerUI m_pm;
所以每一个继承至WindowImplBase基类的窗口对象,都有一个单独的CPaintManagerUI成员,从字面意思就很清楚,这是一个与绘制息息相关的类。接着查看下它的源代码。它的源代码比较多,先将其中一部分列出,如下所示:
class UILIB_API CPaintManagerUI : public CIDropTarget
{
public:
CPaintManagerUI();
~CPaintManagerUI();
public:
void Init(HWND hWnd, LPCTSTR pstrName = NULL);
......
void Invalidate();
void Invalidate(RECT& rcItem);
......
private:
CDuiString m_sName;
HWND m_hWndPaint; //所附加的窗体的句柄
HDC m_hDcPaint;
HDC m_hDcOffscreen;
HDC m_hDcBackground;
HBITMAP m_hbmpOffscreen;
BYTE* m_pOffscreenBits;
HBITMAP m_hbmpBackground;
COLORREF* m_pBackgroundBits;
......
//
CControlUI* m_pRoot;
CControlUI* m_pFocus;
CControlUI* m_pEventHover;
CControlUI* m_pEventClick;
CControlUI* m_pEventKey;
CControlUI* m_pLastToolTip;
......
bool m_bMouseTracking;
bool m_bMouseCapture;
bool m_bIsPainting;
bool m_bUsedVirtualWnd;
bool m_bAsyncNotifyPosted;
//
CStdPtrArray m_aNotifiers;
CStdPtrArray m_aTimers;
CStdPtrArray m_aTranslateAccelerator;
CStdPtrArray m_aPreMessageFilters;
CStdPtrArray m_aMessageFilters;
CStdPtrArray m_aPostPaintControls;
CStdPtrArray m_aNativeWindow;
CStdPtrArray m_aNativeWindowControl;
CStdPtrArray m_aDelayedCleanup;
CStdPtrArray m_aAsyncNotify;
CStdPtrArray m_aFoundControls;
CStdPtrArray m_aFonts;
CStdPtrArray m_aNeedMouseLeaveNeeded;
CStdStringPtrMap m_mNameHash;
CStdStringPtrMap m_mWindowCustomAttrHash;
CStdStringPtrMap m_mOptionGroup;
......
// 拖拽
bool m_bDragMode;
HBITMAP m_hDragBitmap;
//
static HINSTANCE m_hInstance;
static HINSTANCE m_hResourceInstance;
static CDuiString m_pStrResourcePath;
static CDuiString m_pStrResourceZip;
static CDuiString m_pStrResourceZipPwd;
static HANDLE m_hResourceZip;
static bool m_bCachedResourceZip;
static int m_nResType;
static TResInfo m_SharedResInfo;
static bool m_bUseHSL;
static short m_H;
static short m_S;
static short m_L;
static CStdPtrArray m_aPreMessages;
static CStdPtrArray m_aPlugins;
};
从以上代码中,可以得知它继承至CIDropTarget。一个拖拽对象,它支持拖拽的基本功能,比如文件拖拽至窗口。窗口在这个过程中的接口处理。采用RegisterDragDrop函数就可以将窗口注册为drop目标。 这部分最大的功能还是处理窗口的绘制。首先是所有绘制的共享信息,即类的静态成员变量,m_hInstance:模块的实例句柄,m_pStrResourcePath:资源的路径,ZIP压缩资源,m_nResType:资源类型。回到WindowImplBase基类里,查看消息处理函数,如下所示:
LRESULT WindowImplBase::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT lRes = 0;
BOOL bHandled = TRUE;
switch (uMsg)
{
case WM_CREATE: lRes = OnCreate(uMsg, wParam, lParam, bHandled); break;
case WM_CLOSE: lRes = OnClose(uMsg, wParam, lParam, bHandled); break;
case WM_DESTROY: lRes = OnDestroy(uMsg, wParam, lParam, bHandled); break;
#if defined(WIN32) && !defined(UNDER_CE)
case WM_NCACTIVATE: lRes = OnNcActivate(uMsg, wParam, lParam, bHandled); break;
case WM_NCCALCSIZE: lRes = OnNcCalcSize(uMsg, wParam, lParam, bHandled); break;
case WM_NCPAINT: lRes = OnNcPaint(uMsg, wParam, lParam, bHandled); break;
case WM_NCHITTEST: lRes = OnNcHitTest(uMsg, wParam, lParam, bHandled); break;
case WM_GETMINMAXINFO: lRes = OnGetMinMaxInfo(uMsg, wParam, lParam, bHandled); break;
case WM_MOUSEWHEEL: lRes = OnMouseWheel(uMsg, wParam, lParam, bHandled); break;
#endif
case WM_SIZE: lRes = OnSize(uMsg, wParam, lParam, bHandled); break;
case WM_CHAR: lRes = OnChar(uMsg, wParam, lParam, bHandled); break;
case WM_SYSCOMMAND: lRes = OnSysCommand(uMsg, wParam, lParam, bHandled); break;
case WM_KEYDOWN: lRes = OnKeyDown(uMsg, wParam, lParam, bHandled); break;
case WM_KILLFOCUS: lRes = OnKillFocus(uMsg, wParam, lParam, bHandled); break;
case WM_SETFOCUS: lRes = OnSetFocus(uMsg, wParam, lParam, bHandled); break;
case WM_LBUTTONUP: lRes = OnLButtonUp(uMsg, wParam, lParam, bHandled); break;
case WM_LBUTTONDOWN: lRes = OnLButtonDown(uMsg, wParam, lParam, bHandled); break;
case WM_MOUSEMOVE: lRes = OnMouseMove(uMsg, wParam, lParam, bHandled); break;
case WM_MOUSEHOVER: lRes = OnMouseHover(uMsg, wParam, lParam, bHandled); break;
default: bHandled = FALSE; break;
}
if (bHandled) return lRes;
lRes = HandleCustomMessage(uMsg, wParam, lParam, bHandled);
if (bHandled) return lRes;
//进入CPaintManagerUI的消息处理
if (m_pm.MessageHandler(uMsg, wParam, lParam, lRes))
return lRes;
return CWindowWnd::HandleMessage(uMsg, wParam, lParam);
}
在窗口基类里,调用了成员m_pm的消息处理。
2.作者答疑如有疑问,请留言。