2

コンボボックスの「ドロップダウン」ボタンをクリックすると、コンボボックスのにドロップダウンリストボックスが表示されます。下に十分なスペースがない場合はリストボックスがに表示されます。

下に十分なスペースがある場合でも、リスボックスをコンボボックスのに強制的に表示する可能性があるかどうか疑問に思います。

コンボ ボックスをクリックすると、左側のスクリーン コピーのように、「ドロップ ダウン」リスト ボックスが常に上に表示されるようにします。

ここに画像の説明を入力

4

2 に答える 2

1

これは、コンボ ボックスに「スライド オープン」効果がある場合を除いて、比較的簡単です。ドロップダウン リスト ボックスを一番上に移動し、コンボが上から下にスライドして開くと、奇妙に見えます。したがって、アニメーションを無効にするか、逆にする必要があります。

で呼び出すこの関数では、問題は発生AnimateWindowOnWindowPosChangingていないようですが、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また、リストボックスの高さを減らして、ドロップダウン リストが上に収まるようにすることもできます。

于 2016-04-01T18:02:12.967 に答える