【问题标题】:How do you control the width of the dropdown listbox in a ComboBox如何控制 ComboBox 中下拉列表框的宽度
【发布时间】:2017-04-26 13:37:20
【问题描述】:

win32中是否有控制COMBOBOX下拉列表宽度的方法?

【问题讨论】:

  • 只是补充一点,我最终做了 SendDlgItemMessage(m_hWnd,IDC_MYCOMBO,CB_SETDROPPEDWITH,width,0);这里的宽度以像素为单位。
  • @MyDeveloperDay 应该是 CB_SETDROPPEDWIDTH

标签: winapi mfc atl


【解决方案1】:

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

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,而不必打电话给你的UpdateComboDroppedWidth,你可以让它发生在下拉事件处理程序中。
  • 这段代码在我看来是合理的,但我想知道为什么你需要使用它。我从来不需要自定义组合框的下拉宽度。它总是开箱即用地做正确的事情,即使您正在动态添加或删除项目!
  • @CodyGray 对我来说是由于本地化等引起的问题,并且下拉列表不够宽。它默认为组合的宽度,而不是扩展宽度。这是我的经验。
  • 嗯,这很不寻常。下拉菜单的宽度通常不限于组合框控件本身的宽度。我认为本地化可能是一个问题的唯一原因是,如果您使用的字体显示不支持该语言所需的所有字形,这会导致窗口管理器的正常宽度计算失效。当然,如果这是真的,那么这段代码似乎不会修复它,因为它使用相同的显示字体进行计算。不能说没有实际看到一个测试用例。但我猜什么有效,有效。
  • 只是为了澄清我的问题不是关于如何查找字符串内容的长度,或者如何调用 MFC SetDroppedWidth() 函数,而是了解如何对组合框窗口执行此操作处理。感谢@IInspectable,我错过了这个明显的 CB_XXX 电话,没有多少谷歌搜索让我像你们在这里所做的那样,但同样感谢大家。然而,上面的代码无疑也很有用。谢谢大家。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2014-04-07
  • 2012-04-24
  • 2012-12-05
  • 1970-01-01
  • 2010-09-09
  • 2014-04-28
相关资源
最近更新 更多