コンボボックスの「ドロップダウン」ボタンをクリックすると、コンボボックスの下にドロップダウンリストボックスが表示されます。下に十分なスペースがない場合はリストボックスが上に表示されます。
下に十分なスペースがある場合でも、リスボックスをコンボボックスの上に強制的に表示する可能性があるかどうか疑問に思います。
図
コンボ ボックスをクリックすると、左側のスクリーン コピーのように、「ドロップ ダウン」リスト ボックスが常に上に表示されるようにします。
これは、コンボ ボックスに「スライド オープン」効果がある場合を除いて、比較的簡単です。ドロップダウン リスト ボックスを一番上に移動し、コンボが上から下にスライドして開くと、奇妙に見えます。したがって、アニメーションを無効にするか、逆にする必要があります。
で呼び出すこの関数では、問題は発生AnimateWindow
しOnWindowPosChanging
ていないようですが、100% 確実ではありません。
class CComboBox_ListBox : public CListBox
{
public:
CWnd *comboBox;
void OnWindowPosChanging(WINDOWPOS *wndpos)
{
CListBox::OnWindowPosChanging(wndpos);
if (comboBox && wndpos->cx && wndpos->cy && !(wndpos->flags & SWP_NOMOVE))
{
CRect rc;
comboBox->GetWindowRect(&rc);
//if listbox is at the bottom...
if (wndpos->y > rc.top) {
//if there is enough room for listbox to go on top...
if (rc.top > wndpos->cy) {
wndpos->y = rc.top - wndpos->cy;
BOOL animation;
SystemParametersInfo(SPI_GETCOMBOBOXANIMATION, 0, &animation, 0);
//if combobox slides open...
if (animation) {
//we have to set the x coordinate otherwise listbox
//is in the wrong place when parent window moves
SetWindowPos(0, wndpos->x, wndpos->y, 0, 0,
SWP_NOSENDCHANGING | SWP_HIDEWINDOW | SWP_NOSIZE);
AnimateWindow(100, AW_VER_NEGATIVE);
}
}
}
}
}
DECLARE_MESSAGE_MAP()
};
使用法:
COMBOBOXINFO ci = { sizeof(COMBOBOXINFO) };
comboBox.GetComboBoxInfo(&ci);
CComboBox_ListBox *listBox = new CComboBox_ListBox;
listBox->comboBox = &comboBox;
listBox->SubclassWindow(ci.hwndList);
SetMinVisibleItems
また、リストボックスの高さを減らして、ドロップダウン リストが上に収まるようにすることもできます。