Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 工程图列表按WM_DRAWITEM查看项目_C++_Listview_Winapi - Fatal编程技术网

C++ 工程图列表按WM_DRAWITEM查看项目

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结构的指针,但我不知道如

我需要在win32 api中设置列表视图项的高度,因此我使用
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;