Hallo Martijn,
Het resterende probleem is hoe door de eigenaar getekende onderdelen hun tekst krijgen. Met SBT_OWNERDRAW, negeert de statusbalk de tekenreeks die u doorgeeftSB_SETTEXT; het slaat alleen die waarde op en geeft deze later aan u terug als DRAWITEMSTRUCT.itemData. U moet uw tekst in een stabiele opslag bewaren, er een aanwijzer (of een ID) aan doorgeven in SB_SETTEXT, en de tekst zelf tekenen in WM_DRAWITEM. Als de aanwijzer naar een tijdelijke (van .c_str() een tekenreeks die later wordt verplaatst) is, worden de delen 2-4 leeg weergegeven.
Minimaal patroon:
// Persistent data
struct PartData { std::wstring text; COLORREF fg, bg; };
std::vector<PartData> parts = { /* ... */ };
// Tell the status bar each part is owner-draw and hand it a stable pointer
SendMessageW(hStatus, SB_SETTEXTW,
part | SBT_OWNERDRAW,
(LPARAM)&parts[part]); // pointer must remain valid
// WM_DRAWITEM handler (parent window)
auto dis = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
auto data = reinterpret_cast<const PartData*>(dis->itemData);
SetBkColor(dis->hDC, data->bg);
SetTextColor(dis->hDC, data->fg);
FillRect(dis->hDC, &dis->rcItem, CreateSolidBrush(data->bg));
RECT r = dis->rcItem;
DrawTextW(dis->hDC, data->text.c_str(), -1, &r,
DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX | DT_END_ELLIPSIS);
return TRUE; // you did the drawing
Zorg ervoor dat u WM_DRAWITEM in de bovenliggende statusbalk omgaat, gebruik het rcItem meegeleverde onderdeel en houd die PartData objecten in leven. Daarna worden alle onderdelen gerenderd met de juiste kleuren en tekst.
Hartelijke groeten
Fin.