Text in ComboBox mit Right Alignment
-
Hallo,
In meiner WinAPI ComboBox ist der Text links zentriert. Ich brauche aber eine Rechts Zentrierung. Im VS2010 Designer gibt es in den Properties zwar ein Attribut "Right Text Align", aber der verschiebt den Scrollbutton nach links, was ich nicht will.
Wie kann ich den Scrollbutton normal rechts lassen und den Text rechts zentriert?
-
Indem du das Zeichnen selber übernimmst (Stil CBS_OWNERDRAWFIXED).
-
lol. Für so trivialen Mist muss ich selber zeichnen? Oh man, ich hasse die WinAPI

-
Ich wusste doch, irgendwo hatte ich noch was rumliegen:
void DrawComboboxEntry(HWND hwnd,WPARAM wParam,LPARAM lParam) { TCHAR buffer[200]; LPDRAWITEMSTRUCT lpdis = reinterpret_cast<LPDRAWITEMSTRUCT>(lParam); if (lpdis->itemState & ODS_SELECTED) { SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); FillRect(lpdis->hDC,&lpdis->rcItem,GetSysColorBrush(COLOR_HIGHLIGHT)); } else { SetTextColor(lpdis->hDC, GetSysColor(COLOR_BTNTEXT)); SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW)); FillRect(lpdis->hDC,&lpdis->rcItem,GetSysColor(COLOR_WINDOW)); } if(SendDlgItemMessage(hwnd,wParam, CB_GETLBTEXTLEN, lpdis->itemID,0)<sizeof(buffer)) { unsigned int len = SendDlgItemMessage(hwnd, wParam, CB_GETLBTEXT, lpdis->itemID, reinterpret_cast<LPARAM>(buffer)); if(len!=CB_ERR) { SIZE sz; GetTextExtentPoint32(lpdis->hDC,buffer,len,&sz); TextOut(lpdis->hDC, lpdis->rcItem.right-sz.cx, lpdis->rcItem.top, buffer, len); } } }Der Stil CBS_HASSTRINGS muss ebenfalls angegeben worden sein.
case WM_DRAWITEM: if(wParam==/*ID der Combobox*/) DrawComboboxEntry(hwnd,wParam,lParam); break;
-
@yahendrik: Danke. Dein Code zeichnet in der Tat den Inhalt der ComboBox rechtsbündig. Nur leider wirkt der Text irgendwie kleiner und klebt am oberen Rand der ComboBox und nicht mehr am unteren Rand.
Hast du nie Idee wieso?
(PS: Habe GetSysColor(COLOR_WINDOW) durch GetSysColorBrush(COLOR_WINDOW) ausgetauscht)
-
Hallo, zuerst mal:
Matthiaskk schrieb:
Habe GetSysColor(COLOR_WINDOW) durch GetSysColorBrush(COLOR_WINDOW) ausgetauscht)
Okay, ich hatte das gestern schnell getestet und im global verfübar gemachten namespace war eine Funktion namens
void FillRect(HDC hdc, const RECT* pRect, COLORREF clr);zu finden. Mea culpa.
Dein Code zeichnet in der Tat den Inhalt der ComboBox rechtsbündig.
Diese paar Zeilen Code waren eigentlich dazu gedacht, einer Combobox individuelle Farben zu verpassen (und sie keinesfalls rechtsbündig zu zeichnen):
void DrawComboboxEntry(HWND hwnd,WPARAM wParam,LPARAM lParam, COLORREF textcolor = GetSysColor(COLOR_BTNTEXT), usw.);Dass der Text rechtsbündig ausgerichtet ist, liegt allein an
SIZE sz; GetTextExtentPoint32(lpdis->hDC,buffer,len,&sz);und der Textausgabe an entsprechender Position.
Nur leider wirkt der Text irgendwie kleiner und klebt am oberen Rand der ComboBox und nicht mehr am unteren Rand.
Ist er denn wirklich kleiner? Die Größen konnten dank GetTextExtentPoint32 bereits bestimmt werden, also kann er auch unten ausgerichtet werden:
TextOut(lpdis->hDC, lpdis->rcItem.right-sz.cx, lpdis->rcItem.bottom-sz.cy, buffer, len);HTH.
^edit:edit vom edit^