2

ユーザーがテキストを入力して「保存」ボタンをクリックできるC++ MFC CComboBox(VS 2010)があります。これにより、テキストがドロップダウンリストに挿入され、後で呼び出し/使用できるようになります。テキストがボックスに対して長すぎる場合、スクロールバーが必要になるため、リソース ファイルに WS_HSCROLL を設定し、m_Combo.SetHorizo​​ntalExtent(x) を使用します。これは問題なく機能します。

私が抱えている問題は、水平スクロールがある場所で、1 行がカバーされ、垂直スクロール バーがその 1 つの項目にスクロールするように表示されることです。私が試してみました

m_Combo.MoveWindow(&rctDropDown) //rctDropDown was first pulled out and modified
::SetWindowPos() //called after modifying values from ::GetWindowRect()
r.OffsetRect() //where r is from m_Combo.GetDroppedControlRect(&r)

おそらく過去数日以上ですが、水平スクロールを考慮しないドロップダウンの自動サイズ変更を無効にするものは何もないようです。私は MFC を初めて使用し、必死の Google 検索中にこれらの提案をオンラインで見つけました。

要するに、自動高さをオーバーライドまたは拡張する方法はありますか? リソースエディターでサイズを変更する方法は知っていますが、実行時にコードでサイズを変更したいのですが、すべてが無視されているようです。エラーを再現したテストプロジェクトからの私の関数は次のとおりです。

void CtestDlg::StoreClicked()
{
    CString l;
    m_Combo.GetWindowText(l);
    m_Combo.InsertString(0, l);
    m_Combo.SetCurSel(0);
    UpdateList();
}

void CtestDlg::UpdateList()
{
    // Find the longest string in the list box.
    CString     str;
    CSize       sz;
    TEXTMETRIC  tm;
    CDC*        pDC = m_Combo.GetDC();
    CFont*      pFont = m_Combo.GetFont();

    int         x = 0;
    int         y = 0;

    // Select the listbox font, save the old font
    CFont* pOldFont = pDC->SelectObject(pFont);
    // Get the text metrics for avg char width
    pDC->GetTextMetrics(&tm); 

    for(int i = 0; i < m_Combo.GetCount(); i++)
    {
        m_Combo.GetLBText(i, str);
        sz = pDC->GetTextExtent(str);

        // Add the avg width to prevent clipping
        sz.cx += tm.tmMaxCharWidth;

        m_Combo.SetItemHeight(i, sz.cy);

        if (sz.cx > x)
            x = sz.cx;

        y += sz.cy;
    }
    // Select the old font back into the DC
    pDC->SelectObject(pOldFont);
    m_Combo.ReleaseDC(pDC);
    m_Combo.SetHorizontalExtent(x);

    ////////////////////////////////
    //manually change height here?//
    ////////////////////////////////
}
4

1 に答える 1

1

水平スクロールバーを追加して、ドロップされたリストボックスの幅が十分でない場合にスクロールできるようにする代わりに、それに応じてドロップされたリストボックスの幅を設定することができます。

交換

m_Combo.SetHorizontalExtent(x);

m_Combo.SetDroppedWidth(x);
于 2012-06-06T20:09:53.097 に答える