如何在 WM_DRAWITEM 中绘制多列 ListView
How To Draw Multi Column ListView in WM_DRAWITEM
我有一个 3 列的 ListView(我没有包括下面的列和项目插入代码,因为这些部分有效):
hwndListbox = CreateWindow(
WC_LISTVIEW,
"",
WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT|LVS_OWNERDRAWFIXED,
100, 100,600, 300,
hwnd,
(HMENU)1,
NULL,
NULL);
现在我正在尝试使用 WM_DRAWITEM
根据第一列中的文本更改背景颜色:
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)(lParam);
HDC hDC = pDIS->hDC;
RECT rc = pDIS->rcItem;
// initialize brushes
HBRUSH bgRed = CreateSolidBrush (RGB(255,0,0));
HBRUSH bg = (HBRUSH)(GetStockObject(WHITE_BRUSH));
// declare strings for the sub-items' text
TCHAR text_col1[256];
TCHAR text_col2[256];
TCHAR text_col3[256];
// get the text from sub-items
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 0 ,text_col1, 256);
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 1 ,text_col2, 256);
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 2 ,text_col3, 256);
// fill the row
if(strcmp(text_col1,"Random_Name") == 0)
{
FillRect(hDC,&rc,bgRed);
}
else
{
FillRect(hDC,&rc,bg);
}
// How to draw text of 2nd and 3rd columns within columns' boundaries?
DrawText(hDC, text_col1, strlen(text_col1), &rc, DT_SINGLELINE|DT_LEFT);
}
return 0;
如何绘制第二列和第三列的文字?我可以用其他字符串调用 DrawText()
,但由于它们都被绘制到同一个矩形上,它们不符合列边界,而是根据我在中指定的格式标志在矩形上自由移动最后一个参数。我该如何解决这个问题?
如果有一种方法可以在不使用 WM_DRAWITEM
的情况下获得相同的效果,或者将每一列定义为单独的矩形或任何其他解决方案,我很想听听。
您可以使用 ListView_GetSubItemRect
宏来检索子项目的矩形。
void ListView_GetSubItemRect(
hwnd,
iItem,
iSubItem,
code,
prc
);
我有一个 3 列的 ListView(我没有包括下面的列和项目插入代码,因为这些部分有效):
hwndListbox = CreateWindow(
WC_LISTVIEW,
"",
WS_VISIBLE | WS_BORDER | WS_CHILD | LVS_REPORT|LVS_OWNERDRAWFIXED,
100, 100,600, 300,
hwnd,
(HMENU)1,
NULL,
NULL);
现在我正在尝试使用 WM_DRAWITEM
根据第一列中的文本更改背景颜色:
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)(lParam);
HDC hDC = pDIS->hDC;
RECT rc = pDIS->rcItem;
// initialize brushes
HBRUSH bgRed = CreateSolidBrush (RGB(255,0,0));
HBRUSH bg = (HBRUSH)(GetStockObject(WHITE_BRUSH));
// declare strings for the sub-items' text
TCHAR text_col1[256];
TCHAR text_col2[256];
TCHAR text_col3[256];
// get the text from sub-items
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 0 ,text_col1, 256);
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 1 ,text_col2, 256);
ListView_GetItemText( pDIS -> hwndItem , pDIS -> itemID , 2 ,text_col3, 256);
// fill the row
if(strcmp(text_col1,"Random_Name") == 0)
{
FillRect(hDC,&rc,bgRed);
}
else
{
FillRect(hDC,&rc,bg);
}
// How to draw text of 2nd and 3rd columns within columns' boundaries?
DrawText(hDC, text_col1, strlen(text_col1), &rc, DT_SINGLELINE|DT_LEFT);
}
return 0;
如何绘制第二列和第三列的文字?我可以用其他字符串调用 DrawText()
,但由于它们都被绘制到同一个矩形上,它们不符合列边界,而是根据我在中指定的格式标志在矩形上自由移动最后一个参数。我该如何解决这个问题?
如果有一种方法可以在不使用 WM_DRAWITEM
的情况下获得相同的效果,或者将每一列定义为单独的矩形或任何其他解决方案,我很想听听。
您可以使用 ListView_GetSubItemRect
宏来检索子项目的矩形。
void ListView_GetSubItemRect(
hwnd,
iItem,
iSubItem,
code,
prc
);