C++ 工程图列表按WM_DRAWITEM查看项目
我需要在win32 api中设置列表视图项的高度,因此我使用C++ 工程图列表按WM_DRAWITEM查看项目,c++,listview,winapi,C++,Listview,Winapi,我需要在win32 api中设置列表视图项的高度,因此我使用LVS\u OWNERDRAWFIXED获取WM\u MEASUREITEM 消息并设置项目的高度。但是当我在创建列表时在CreateWindow()中使用LVS\u OWNERDRAWFIXED时, 通过ListView\u InsertItem()插入的所有项目均未被搜索 在这种情况下,我读过当WM_DRAWITEM被发送到父窗口过程时应该绘制项目。我知道在lParam中有一个指向DRAWITEMSTRUCT结构的指针,但我不知道如
LVS\u OWNERDRAWFIXED
获取WM\u MEASUREITEM
消息并设置项目的高度。但是当我在创建列表时在CreateWindow()中使用LVS\u OWNERDRAWFIXED
时,
通过ListView\u InsertItem()
插入的所有项目均未被搜索
在这种情况下,我读过当WM_DRAWITEM
被发送到父窗口过程时应该绘制项目。我知道在lParam
中有一个指向DRAWITEMSTRUCT
结构的指针,但我不知道如何强制它显示项目
我在WinMain()
中有以下代码:
这些是CreateItem()
和WndProc()
:
请说明如何绘制和显示项目?要处理WM_DRAWITEM,您需要使用WinAPI GDI调用实际绘制每个项目!
作为起点,以下内容可能会给你一些线索:
case WM_DRAWITEM: { //I dont know what to do
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)(lParam);
HDC hDC = pDIS->hDC;
RECT rc = pDIS->rcItem;
HBRUSH bg = (HBRUSH)(::GetStockObject(LTGRAY_BRUSH));
HPEN pn = (HPEN)(::GetStockObject(BLACK_PEN));
::SelectObject(hDC, bg);
::SelectObject(hDC, pn);
::SetTextColor(hDC, RGB(0, 0, 0));
const wchar_t *text = L"Dummy Text";
::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
::DrawText(hDC, text, wcslen(text), &rc, DT_SINGLELINE | DT_VCENTER);
}
break;
显然,在现实世界的程序中,您还需要做很多事情,比如获取项目的实际文本,根据选择状态更改文本和背景的颜色等。您可以从传递的DRAWITEMSTRUCT
的各个成员处获得所需的大部分信息
如果这有帮助,请告诉我,我们可以考虑进一步改进。但是,先试试这个“虚拟运行”,看看它是否有效,你就能理解发生了什么。首先,你需要在使用char
或wchar\u t
时保持一致-不要把它们混在一起,只需将一个转换成另一个!谢谢你这么多作品完美…请你告诉我如何删除项目周围的边框?简单!在调用::Rectangle(…)
时,您正在使用选定的背景笔刷和笔。我给了你一个BLACK_PEN
的库存对象,但你可以使用NULL_PEN
不获取边框(好吧,一个不可见的边框)。亲爱的Adrian,我需要获取列表项的实际文本并绘制它。我尝试了这个LPTSTR text=(LPTSTR)”;ListView_GetItemText(pDIS->HwnItem,pDIS->itemID,0,text,1000);rc.left=12;::DrawText(hDC、文本、wcslen(文本)和rc、DT|U单线| DT|U VCENTER)代码>但我遇到运行时异常。请问我做错了什么?有更好的方法吗?Thanks@Zahra19977-其中您有LPTSTR text=(LPTSTR)“代码>您正在创建长度为1个字符的文本缓冲区!但是,在您的\u GetItemText()
呼叫中,您告诉系统您有1000个字符的缓冲区!尝试使用TCHAR文本[1000]代码>取而代之。但是,您自己发现了如何使用pDIS->itemID
是件好事。
int CreateItem(HWND hwndList, char* Text)
{
LVITEM lvi = {0};
lvi.mask = LVIF_TEXT | LVCF_FMT | LVCFMT_LEFT;
lvi.pszText = (LPWSTR)Text;
return ListView_InsertItem(hwndList, &lvi);
}
LRESULT CALLBACK WndProc( HWND hwnd , UINT msg , WPARAM wParam , LPARAM lParam)
{
switch(msg){
case WM_DRAWITEM:{ //I dont know what to do
}
break;
case WM_MEASUREITEM:{
MEASUREITEMSTRUCT* m= (MEASUREITEMSTRUCT*) lParam;
m->itemHeight=25;
}
break;
case WM_CLOSE:
DestroyWindow( hwnd );
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc( hwnd , msg , wParam , lParam );
}
return 0;
}
case WM_DRAWITEM: { //I dont know what to do
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)(lParam);
HDC hDC = pDIS->hDC;
RECT rc = pDIS->rcItem;
HBRUSH bg = (HBRUSH)(::GetStockObject(LTGRAY_BRUSH));
HPEN pn = (HPEN)(::GetStockObject(BLACK_PEN));
::SelectObject(hDC, bg);
::SelectObject(hDC, pn);
::SetTextColor(hDC, RGB(0, 0, 0));
const wchar_t *text = L"Dummy Text";
::Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom);
::DrawText(hDC, text, wcslen(text), &rc, DT_SINGLELINE | DT_VCENTER);
}
break;