坎坷WTL行(一)重绘CListViewCtrl

刚刚上手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 DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);

    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*/) {};
};


你可能感兴趣的:(WTL)