2016-12-11 9 views
1

とにかくwin32のCOMBOXOXのドロップダウンリストの幅を制御することはできますか?どのようにコンボボックスのドロップダウンリストボックスの幅を制御しますか

+11

[CB_SETDROPPEDWIDTH](https://msdn.microsoft.com/en-us/library/windows/desktop/bb775901.aspx) – IInspectable

+1

これをちょっと追加すると、SendDlgItemMessage(m_hWnd、IDC_MYCOMBO、CB_SETDROPPEDWITH、width、0)の処理が終了しました。ここでの幅はピクセル単位です。 – MyDeveloperDay

答えて

3

私は自分のアプリケーションクラスのパブリックメソッドがあります。

void CSoundRotaApp::UpdateComboDroppedWidth(CComboBox& rCombo) 
{ 
    int iWidth = theApp.GetRequiredComboDroppedWidth(rCombo); 
    if (iWidth > rCombo.GetDroppedWidth()) 
     rCombo.SetDroppedWidth(iWidth); 
} 

このメソッドを呼び出します。

int CSoundRotaApp::GetRequiredComboDroppedWidth(CComboBox& rCombo) 
{ 
    CString str; 
    CSize  sz; 
    int  dx = 0; 
    TEXTMETRIC tm; 
    CDC*  pDC = rCombo.GetDC(); 
    CFont*  pFont = rCombo.GetFont(); 

    // 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 < rCombo.GetCount(); i++) 
    { 
     rCombo.GetLBText(i, str); 
     sz = pDC->GetTextExtent(str); 

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

     if (sz.cx > dx) 
      dx = sz.cx; 
    } 
    // Select the old font back into the DC 
    pDC->SelectObject(pOldFont); 
    rCombo.ReleaseDC(pDC); 

    // Adjust the width for the vertical scroll bar and the left and right border. 
    dx += ::GetSystemMetrics(SM_CXVSCROLL) + 2 * ::GetSystemMetrics(SM_CXEDGE); 

    return dx; 
} 

は、この情報がお役に立てば幸いです。

+1

+1であり、 'UpdateComboDroppedWidth'を呼び出す代わりに、ドロップダウンイベントハンドラで行うことができます。 – acraig5075

+2

このコードは私にとっては妥当ですが、なぜそれを使用する必要があるのでしょうか?私はコンボボックスのドロップ幅をカスタマイズする必要はありませんでした。動的に項目を追加したり削除していても、常に適切な処理を行います。 –

+0

@CodyGrayはローカリゼーションなどの理由で問題が発生しましたが、ドロップリストは十分に幅がありませんでした。コンボの幅にデフォルト設定されていて、幅を拡張していませんでした。それは私の経験でした。 –

関連する問題