刚刚上手WTL,对C++GUI编程不熟悉的我倍加痛苦。下载WTL最新版8.1,可以自己在网上找。汉化WTL向导,然后放置在VS安装目录中。
新建一个MDI工程,为了方便添加类的成员函数,切记要创建.CPP文档。
不使用view,然后想添加内容,习惯的拖拽控件的我倍感手足无措。
重新建一个工程,加入ListViewCtrl视图。把使用类的部分COPY到上一个项目中,然后重新定义自己的CListViewCtrl类。
终于可以使用listviewctrl做为视图使用了。首先在OnCreate中给列表设置样式,并添加列:
this->SetExtendedListViewStyle(this->GetStyle()|LVS_EX_GRIDLINES | LVS_REPORT | LVS_EX_DOUBLEBUFFER);
this->ModifyStyle(0, LVS_SINGLESEL);//单选
执行后发现列表没有反应。但是在CChildFrame::OnCreate中给其添加数据是可以显示的。调试一下,发现代码执行过,但就是出不来,头大呀:google之,发现要在OnCreate中做一些处理:
LRESULT result = DefWindowProc();
if(result == -1)
{
return -1;
}
这样就可以正常显示了,接下来开始按MFC方式重绘。结果木有反应。看了WTL的教程,发现WTL重绘需要继承public COwnerDraw,然后又搞了半天 COwnerDraw。重载其中的如下三个成员函数:
void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/) {};
在MeasureItem里可以控制行高。
重载之后还是木有反应,于是翻来覆去搞到半夜,未果,然后了经过大量的搜索,在CChildFrame类中添加了一行代码:
BEGIN_MSG_MAP(CChildFrame)
MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
CHAIN_MSG_MAP(CMDIChildWindowImpl
REFLECT_NOTIFICATIONS() //消息反射通知宏 必须要加的,这个东西折磨了我好多天了,哈哈
END_MSG_MAP()
搞定,终于出来了,重绘成功。效果如下:
类示例代码:
class CMdListViewCtrl : public CWindowImpl,public COwnerDraw
{
public:
CMdListViewCtrl();
DECLARE_WND_SUPERCLASS(NULL, CListViewCtrl::GetWndClassName())
BOOL PreTranslateMessage(MSG* pMsg);
BEGIN_MSG_MAP(CMdListViewCtrl)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
//MESSAGE_HANDLER(WM_PAINT, OnPaint)
CHAIN_MSG_MAP_ALT(COwnerDraw , 1)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled);
public:
void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/) {};
};