WTL 如何在同一窗口中使用 2 个自定义绘制的 CListViewCtr
WTL how to use 2 custom-draw CListViewCtr in the same window
如何CHAIN_MSG_MAP_MEMBER
用于两个成员?
下面的示例适用于单个列表视图和单个CHAIN_MSG_MAP_MEMBER.
有了这两个我,我都崩溃了。
class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>,
public CMessageFilter, public CIdleHandler
{
public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME)
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
return CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg);
}
BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
COMMAND_ID_HANDLER(ID_FILE_NEW, OnFileNew)
COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
CHAIN_MSG_MAP_MEMBER(m_listView) //<
CHAIN_MSG_MAP_MEMBER(m_listView2) //< ISSUE: crash with both, works with one.
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// create a list box
RECT r = {0,0,182,80};
m_listView.Create(m_hWnd,r,CListViewCtrl::GetWndClassName(),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT, WS_EX_CLIENTEDGE );
RECT r2 = {0,80,182,80+80};
m_listView2.Create(m_hWnd,r2,CListViewCtrl::GetWndClassName(),WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT, WS_EX_CLIENTEDGE );
...
populate
}
}
class MyListView : public CWindowImpl<MyListView, CListViewCtrl>,
public CCustomDraw<MyListView>
{
public:
BEGIN_MSG_MAP(MyListView)
CHAIN_MSG_MAP(CCustomDraw<MyListView>)
END_MSG_MAP()
DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
{
...
}
DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
{
...
}
DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw)
{
...
}
............
}
CCustomDraw
是WTL类,假设你使用BEGIN_MSG_MAP_EX
,而不是ATL的BEGIN_MSG_MAP
。
#include <atlcrack.h>
class MyListView : public CWindowImpl<MyListView, CListViewCtrl>,
public CCustomDraw<MyListView>
{
public:
BEGIN_MSG_MAP_EX(MyListView) // <<--- Here we go
CHAIN_MSG_MAP(CCustomDraw<MyListView>)
END_MSG_MAP()
};
经验法则是,只要您利用 WTL,就永远不要使用BEGIN_MSG_MAP
。
另外,值得一提的是,这种CHAIN_MSG_MAP_MEMBER
的使用对我来说毫无意义。
相关文章:
- flutter:即使shouldRepaint()返回true,自定义画家也不会重新绘制
- 如何在QT中的自定义视频小工具t上绘制矩形
- 如何绘制自定义形状的元素?
- 在 Qt C++ 中在自定义项委托上绘制文本时的性能问题
- 将自定义可绘制对象存储在数组中会导致绘制时出现分割错误
- 绘制QTableView的背景(带有自定义QStyleDitemdelegate)
- MFC GUI 自定义控件:如何绘制光标更新以响应鼠标移动?
- WTL 如何在同一窗口中使用 2 个自定义绘制的 CListViewCtr
- 使用图形可视化绘制自定义 BGL 图
- 禁用 CListCtrl 自定义绘制函数中的行或将其显示为灰色
- 在鼠标光标平面上绘制或创建自定义动画系统光标
- 使用自定义序列点绘制等高线
- Qt-具有自定义参数的可重用绘制函数
- 使用自定义着色器在全屏四边形上从 QGLFramebufferObject 绘制纹理
- 在 qt 中绘制图形和自定义绘图库绘制曲线
- Qt:自定义 LineEditDelegate 的绘制功能
- Win32 自定义绘制树视图控件
- Cocos2d-X:CCDrawNode绘制圆形/自定义形状
- 在Windows XP上自定义绘制的列表视图
- 正确确定自定义绘制的复选框状态