Joã*_*ito 0 c++ winapi listbox ownerdrawn
我没有成功地绘制我自己的列表框,继承人的代码:
LRESULT CALLBACK ListBoxProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DRAWITEM:
LPDRAWITEMSTRUCT Item;
Item = (LPDRAWITEMSTRUCT)lParam;
if (Item->itemState == ODS_SELECTED)
{
FillRect(Item->hDC, &Item->rcItem, CreateSolidBrush(0));
SetTextColor(Item->hDC, 0x0000FF);
}
else
{
SetBkColor(Item->hDC, 0);
FillRect(Item->hDC, &Item->rcItem, (HBRUSH)GetStockObject(BLACK_BRUSH));
SetTextColor(Item->hDC, 0xFFFFFF);
}
LPSTR lpBuff;
SendMessageA(Item->hwndItem , LB_GETTEXT, Item->itemID, (LPARAM)lpBuff);
TextOutA(Item->hDC, Item->rcItem.left, Item->rcItem.top, (lpBuff), strlen(lpBuff)-1);
if (Item->itemState & ODS_FOCUS)
{
DrawFocusRect(Item->hDC, &Item->rcItem);
}
return true;
break;
case WM_MEASUREITEM:
break;
default:
DefWindowProcA(hwnd, msg, wParam, lParam);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我像这样创建ListBox:
lbLogs = CreateWindowExA(0, "LISTBOX", "", WS_VISIBLE + WS_CHILD + WS_BORDER + LBS_HASSTRINGS + LBS_NOINTEGRALHEIGHT + WS_TABSTOP, 15, 115, 515, 180, hwnd, (HMENU)1005, hInstance, NULL);
//-----------------------------
SetWindowLong(lbLogs, GWL_WNDPROC, (LONG)&ListBoxProcedure);
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释它有什么不对吗?我正在尝试制作一个包含黑色bg和红色文本的列表框,当一个项目被选中时,它的文本会转换为白色.但是列表框只是不添加任何内容.
您正在创建一个列表框,然后安装自己的WNDPROC来处理发送到列表框的邮件.但是,所有者绘制列表框会向其所有者发送WM_MEASUREITEM和WM_DRAWITEM消息,因此您需要在父窗口的WNDPROC中处理这些消息,而不是列表框WNDPROC.
此外,即使子类化是正确的方法(在这种情况下不是这样),您的子类WNDPROC应该将未处理的消息传递给原始列表框WNDPROC,而不是DefWindowProc().绕过原始列表框WNDPROC很可能会造成麻烦.
归档时间: |
|
查看次数: |
2538 次 |
最近记录: |