私のWeChatパブリックアカウント:CPP Advanced Tourこの記事がお役に立て
ばと思われる場合は、「CPP Advanced Tour」に注目して、より技術的なドライグッズをご覧ください。
Win32はListBoxの自己描画を実現します
1.ListBoxコントロールの要点は自己描画を制御します
- CreateWindowExでウィンドウを作成するときは、LBS_OWNERDRAWFIXED | LBS_HASSTRINGSの2つのプロパティをパラメーターdwStyleに設定する必要があります。また、リストボックスを再描画するには、リストボックスウィンドウの親ウィンドウでWM_DRAWITEMメッセージとWM_MEASUREITEMメッセージを処理する必要があります。
- LBS_OWNERDRAWFIXED:リストボックスの親ウィンドウがそのコンテンツの描画を担当し、リストボックス内のアイテムの高さが同じであることを指定します。リストボックスが作成されると、親ウィンドウはWM_MEASUREITEMメッセージを受信します。リストボックスの外観が変更された場合、親ウィンドウはWM_DRAWITEMメッセージを受信します。
必要に応じて、LBS_OWNERDRAWFIXEDをLBS_OWNERDRAWVARIABLEに置き換えることもできます。LBS_OWNERDRAWVARIABLEは、リストボックスにも使用される親ウィンドウがそのコンテンツの描画を担当し、リストボックス内のアイテムの高さが可変であることを指定します。 - LBS_HASSTRINGS:LBS_HASSTRINGSが設定されていない場合、LB_GETTEXTメッセージまたはListBox_GetTextメソッドを介して取得された文字列が文字化けします
2、ListBoxコントロールの自己描画キーコード
//创建listbox
HWND hwndListBox =CreateWindowEx(0, WC_LISTBOX, L"",
WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_BORDER | WS_TABSTOP | LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS,//如果不设定LBS_HASSTRINGS,那么GetText取得的将是乱码
20, 20, 360, 240, hWnd, nullptr,GetModuleHandle(nullptr), nullptr);
//添加数据
for (int i = 0; i < 10; i++) {
WCHAR itemText[256];
ZeroMemory(itemText, sizeof(itemText));
wsprintf(itemText, L"item %d", i);
ListBox_AddString(hwndListBox, itemText);
}
//在父窗口中处理WM_DRAWITEM消息实现列表条目的自绘
case WM_DRAWITEM:
{
DRAWITEMSTRUCT* pdis = (DRAWITEMSTRUCT*)lParam;
if (pdis->itemAction != ODA_DRAWENTIRE && pdis->itemAction != ODA_SELECT)
break;
LPDRAWITEMSTRUCT pDI = (LPDRAWITEMSTRUCT)lParam;
HBRUSH brsh = CreateSolidBrush(RGB(255 - 30 * pDI->itemID, 128 + 40 * pDI->itemID, 128 + 40 * pDI->itemID));//yellow
FillRect(pDI->hDC, &pDI->rcItem, brsh);
DeleteObject(brsh);
// text
SetBkMode(pDI->hDC, TRANSPARENT);
WCHAR szText[260];
SendMessage(hwndListBox, LB_GETTEXT, pDI->itemID, (LPARAM)szText);
const DWORD dwStyle = DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS;
DrawText(pDI->hDC, szText, wcslen(szText), &pDI->rcItem, dwStyle);
} break;
3.完全なコード
https://download.csdn.net/download/siyacaodeai/15452147
4.重要な注意事項
私の個人的なWeChatパブリックアカウントをフォローして、クライアント/サーバー開発の専門知識、筆記試験の面接の質問、プログラマーの職場での経験、経験の共有をご覧ください。