Alles ist möglich, und Sie brauchen nicht die Kontrolle „von Grund auf“ zu implementieren.
Zuerst können Sie den ListBox-Teil Ihrer ComboBox ableiten, um die vollständige Kontrolle darüber zu erhalten, wie in MSDN erläutert. Sie können eine von CListBox abgeleitete Klasse mithilfe des Klassenassistenten erstellen. Sie müssen nur WM_WINPOSITIONCHANGING
Handler darin implementieren:
void CTopListBox::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
CListBox::OnWindowPosChanging(lpwndpos);
if ((lpwndpos->flags & SWP_NOMOVE) == 0)
{
lpwndpos->y -= lpwndpos->cy + 30;
}
}
hier der Einfachheit halber werde ich die Box nach oben durch die (Höhen + 30) zu bewegen. Sie können die Höhe Ihrer ComboBox anstelle meiner 30
erhalten.
Dann deklarieren Sie eine Membervariable in der Dialogklasse:
CTopListBox m_listbox;
und Unterklasse es wie folgt aus:
HBRUSH CMFCDlgDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_LISTBOX)
{
if (m_listbox.GetSafeHwnd() == NULL)
{
m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
CRect r;
m_listbox.GetWindowRect(r);
m_listbox.MoveWindow(r);
}
}
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
Bitte beachte, dass ich m_listbox.MoveWindow(r)
es nenne; es wird benötigt, weil zuerst die Nachricht WM_CONTROLCOLOR
für dieses Listenfeld kommt, nachdem es positioniert ist, also das allererste Mal, dass es anstatt nach oben fallen würde.
Haftungsausschluss: Dies ist keine sehr saubere Lösung, da, wenn Sie Windows-Animation aktiviert haben, Sie sehen, dass die Liste von oben nach unten entrollt.
Alternativ können Sie die Combobox "täuschen", dass es zu nahe am unteren Bildschirmrand ist; dann wird es von selbst fallen. Ich lasse es als eine Übung für die Leser :)
Nicht möglich von dem, was ich weiß ... dies wird von der Steuerung, die die Liste malt behandelt. Jetzt können Sie dieses Steuerelement immer ableiten und die Paint-Methode überschreiben ... –
So behandelt Windows das Kombinationsfeld und die Menüs, das können Sie nicht ändern. Überschreiben der Farbe oder des Zeichens wird es nicht ändern. Möglicherweise müssen Sie Ihr eigenes benutzerdefiniertes Steuerelement von Grund auf neu schreiben. Lass die Idee fallen! – Ajay