Winapi 如何控制组合框中下拉列表框的宽度

Winapi 如何控制组合框中下拉列表框的宽度,winapi,mfc,atl,Winapi,Mfc,Atl,在win32中是否还有控制组合框下拉列表宽度的方法?我的应用程序类中有一个公共方法: void CSoundRotaApp::UpdateComboDroppedWidth(CComboBox& rCombo) { int iWidth = theApp.GetRequiredComboDroppedWidth(rCombo); if (iWidth > rCombo.GetDroppedWidth()) rCombo.SetDroppedWidth

在win32中是否还有控制组合框下拉列表宽度的方法?

我的应用程序类中有一个公共方法:

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;
}
int CSoundRotaApp::GetRequiredComboDroppedWidth(CComboBox和rCombo)
{
CString-str;
中船重工;
int dx=0;
textmetricTM;
CDC*pDC=rCombo.GetDC();
CFont*pFont=rCombo.GetFont();
//选择列表框字体,保存旧字体
CFont*pOldFont=pDC->SelectObject(pFont);
//获取平均字符宽度的文本度量
pDC->GetTextMetrics(&tm);
对于(int i=0;iGetTextExtent(str);
//添加平均宽度以防止剪切
sz.cx+=tm.tmAveCharWidth;
如果(sz.cx>dx)
dx=sz.cx;
}
//将旧字体选择回DC
pDC->选择对象(pOldFont);
rCombo.ReleaseDC(pDC);
//调整垂直滚动条和左右边框的宽度。
dx+=::GetSystemMetrics(SM_CXVSCROLL)+2*::GetSystemMetrics(SM_CXEDGE);
返回dx;
}

希望这能有所帮助。

。除了这一点之外,我还做了SendDlgItemMessage(m_hWnd,IDC_MYCOMBO,CB_SETDROPPEDWITH,width,0);这里的宽度是以像素为单位的。@MyDeveloperDay应该是CB_SETDROPPEDWIDTH+1,你不必调用你的
UpdateComboDroppedWidth
,你可以在下拉事件处理程序中执行它。这段代码对我来说很合理,但我想知道你为什么需要使用它。我从来不需要自定义组合框的放置宽度。它总是在开箱即用的情况下做正确的事情,即使您正在动态地添加或删除其中的项目@CodyGray对我来说,由于本地化等原因而提出的问题,而且下拉列表不够广泛。它默认为组合的宽度,而不是扩展宽度。那是我的经历。嗯,那是不寻常的。下拉列表的宽度通常不限于组合框控件本身的宽度。我认为本地化可能是一个问题的唯一原因是,如果您使用的显示字体不支持该语言所需的所有glyph,这会使窗口管理器的正常宽度计算中断。当然,如果这是真的,那么这段代码似乎无法修复它,因为它使用相同的显示字体进行计算。在没有实际看到测试用例的情况下不能说。但我猜什么是有效的,有效的。我想澄清一下我的问题不是关于如何找到字符串内容的长度,或者如何调用MFC SetDroppedWidth()函数,而是了解如何对组合框窗口句柄执行此操作。感谢@IInspectable,我错过了这个显而易见的CB_XXX电话,也没有像你们一样通过谷歌搜索找到它,但还是感谢大家。然而,上述代码无疑也会很有用。谢谢大家。