Win32修改ListView控件扩展属性

来源:互联网 发布:mac 10.11.6 官方下载 编辑:程序博客网 时间:2024/06/05 04:51

创建一个ListView,以为就是和一般的控件一样:

m_hLogList = ::CreateWindowEx(LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER, L"SysListView32", NULL, WS_VISIBLE|WS_CHILD|LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS, //|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_AUTOARRANGE|LVS_SINGLESEL0, 0, 0, 0, m_hWnd, NULL, m_hInst, NULL);

结果,创建出来的ListView扩展属性都都有表现出来。使用SPY++抓了一下,发现扩展属性变成了WS_EX_ACCEPTFILES。找到这些定义处:

#define WS_EX_ACCEPTFILES 0x00000010L
#define LVS_EX_HEADERDRAGDROP 0x00000010
呵呵,原来数值是一样的,那么修改ListView的扩展属性一定不是通过CreateWindowEx第一个参数来决定的。接着我又想到了,使用SetWindowLong函数来设置窗口的默认属性:

// SetLastError(0);// LONG lStyleEx = GetWindowLong(m_hLogList, GWL_EXSTYLE);// DWORD dwCode = GetLastError();// SetLastError(0);// LONG ret = SetWindowLong(m_hLogList, GWL_EXSTYLE, lStyleEx|LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER);// dwCode = GetLastError();
结果,函数返回0,系统错误码又是0,真是百思不得其解。。。。

我想到的方法是查看MFC源码,MFC的大部分代码都是把WIN32 SDK包装了一层,查看CListCtrl::SetExtendedStyle(DWORD dwNewStyle)的实现就知道了:

_AFXCMN_INLINE DWORD CListCtrl::SetExtendedStyle(DWORD dwNewStyle){ ASSERT(::IsWindow(m_hWnd)); return (DWORD) ::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM) dwNewStyle); }
果然,修改ListView扩展属性是通过一个特殊的消息来实现的。


这也解开了我的一个疑惑,在 MSDN中对CreateWindow/CreateWindowEx 的介绍中,后面指出了一堆的控件,却没有我们熟悉的ListView。

ListView控件是在comctrl32中定义的,使用时需要加上:

#include <CommCtrl.h>#pragma comment(lib, "comctl32.lib")

创建控件后,设置一些基本属性:

m_hLogList = ::CreateWindowEx(NULL, L"SysListView32", NULL, <span style="white-space:pre"></span>WS_BORDER|WS_VISIBLE|WS_CHILD|LVS_REPORT|LVS_SINGLESEL|LVS_SHOWSELALWAYS|LVS_AUTOARRANGE, <span style="white-space:pre"></span>0, 0, 0, 0, m_hWnd, NULL, m_hInst, NULL);
::SendMessage(m_hLogList, WM_SETFONT, (WPARAM)m_hDefFont, (LPARAM)TRUE);//::SendMessage(m_hBottomWnd, WM_SETFONT, (WPARAM)m_hDefFont, (LPARAM)TRUE);::SendMessage(m_hLogList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM) LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER|LVS_EX_INFOTIP|LVS_EX_GRIDLINES|LVS_EX_UNDERLINEHOT);LV_COLUMN colmn;ZeroMemory(&colmn, sizeof(LV_COLUMN));colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 风格colmn.pszText = L"进程ID";colmn.cx = 60;SendMessage(m_hLogList, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);colmn.pszText = L"状态";SendMessage(m_hLogList, LVM_INSERTCOLUMN, 1, (LPARAM)&colmn);colmn.pszText = L"内容";colmn.cx = 1000; SendMessage(m_hLogList, LVM_INSERTCOLUMN, 2, (LPARAM)&colmn);


最后为了控件漂亮点,我们链接到最新的清单依赖项


#ifdef _UNICODE#if defined _M_IX86#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")#elif defined _M_IA64#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")#elif defined _M_X64#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")#else#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")#endif#endif



PS:软件最重要的是核心业务逻辑的处理(高性能、高并发),界面没那么特别重要。



0 0
原创粉丝点击