gpt4 book ai didi

c++ - 使用水平滚动条手动设置 MFC CComboBox 下拉高度

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:59:40 29 4
gpt4 key购买 nike

我有一个 C++ MFC CComboBox (VS 2010),用户可以在其中输入文本并单击“保存”按钮,这会将他们的文本插入到下拉列表中以供以后调用/使用。当文本对于框来说太长时,我需要一个滚动条,所以我在资源文件中设置 WS_HSCROLL 并使用 m_Combo.SetHorizo​​ntalExtent(x),效果很好。

我遇到的问题是,在有水平滚动的地方,一行被它覆盖,并且垂直滚动条似乎滚动到该项目。我试过了

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?//
////////////////////////////////
}

最佳答案

与其添加水平滚动条并在拖放列表框不够宽时允许滚动,不如相应地设置拖放列表框的宽度。

替换

m_Combo.SetHorizontalExtent(x);

m_Combo.SetDroppedWidth(x);

关于c++ - 使用水平滚动条手动设置 MFC CComboBox 下拉高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10920790/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com