下面的代码计算将文本保存到复选框的矩形的大小。当我使用具有不同屏幕分辨率的显示器的固定计算机时,代码工作正常。但是当我在连接了外接显示器的笔记本电脑上运行完全相同的代码时,盒子太小了。笔记本电脑的屏幕分辨率为1680x1050,显示器为1920x1080。
pclRect具有相同的值,无论我在哪台计算机上运行它。
任何人都知道如何解决这个问题?
结果:
void CForm::SetSize(CWnd *pCWnd, CRect *pclRect)
{
CDC *pclDC = m_pclPanel->GetDC();
CFont* font = pCWnd->GetFont();
LOGFONT logFont;
font->GetLogFont(&logFont);
CString str;
pCWnd->GetWindowText(str);//Get controller text
CClientDC dc(pCWnd);
dc.SelectObject(font);
int iWidth;
int iHeight;
long lFontSize = -MulDiv(logFont.lfHeight, GetDeviceCaps(pclDC->m_hDC, LOGPIXELSY), 72);
iWidth = dc.GetTextExtent(str).cx; //Get controller text length
iWidth += GetExtraWidth(); //This adds 18 to the width since it's the width of the checkbox itself
iHeight = abs(lFontSize) + GetExtraHeight();
pclRect->bottom = pclRect->top + iHeight;
pclRect->right = pclRect->left + iWidth;
pCWnd->MoveWindow(pclRect);
}
答案 0 :(得分:2)
如果目标窗口是Vista或更高版本,请使用BCM_GETIDEALSIZE查找最小尺寸。但复选框不能有多行标记(BS_MULTILINE
)。例如
m_checkBox.SetWindowText(L"long text xxx xxx xxx xxx xxx xxx");
SIZE sz;
if (Button_GetIdealSize(m_checkBox.m_hWnd, &sz) && sz.cx > 0 && sz.cy > 0)
{
m_checkBox.SetWindowPos(0, 0, 0, sz.cx, sz.cy, SWP_NOZORDER|SWP_NOMOVE);
}
else
{
//use another method ...
}
否则,请修改您的代码,而不是为复选框宽度提供18
像素,请使用
GetSystemMetrics
找到复选框宽度(这会导致默认DPI为15像素,因此您必须为文本填充添加更多像素)。
如果主题有效,请使用GetThemePartSize
。例如:
CClientDC dc(this);
SIZE sz;
HTHEME ht = OpenThemeData(m_hWnd, L"Button");
if (ht)
{
GetThemePartSize(ht, dc, BP_CHECKBOX, CBS_CHECKEDNORMAL, NULL, TS_TRUE, &sz);
CloseThemeData(ht);
//sz.cx is 13 pixels in default DPI
}
else
{
sz.cx = GetSystemMetrics(SM_CXMENUCHECK);
//sz.cx is 15 pixels in default DPI
}
屏幕分辨率与此无关。发布的图像表明两个显示器具有相同的DPI设置。请注意,如果DPI设置发生变化,而您的应用程序为DPI aware,那么sz.cx
将会有所不同。