2016-05-18 7 views
2

以下のコードは、テキストをチェックボックスで保持している矩形のサイズを計算しています。コードは、画面解像度の異なるモニタを備えた固定コンピュータを使用しているときに問題なく動作します。しかし、外付けモニターを接続したノートパソコンで全く同じコードを実行すると、ボックスが小さすぎます。ノートパソコンの画面解像度は1680x1050で、モニタは1920x1080です。ラップトップと固定コンピュータの結果が異なります

pclRectは、どのコンピュータで実行しても同じ値を持ちます。

誰もがこの問題を解決する方法を知っていますか?

結果:

enter image description here enter image description here

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); 
} 

答えて

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 ... 
} 

それ以外の場合は例えば、 GetSystemMetricsは(あなたは、いくつかのより多くを追加する必要がありますので、これは、デフォルトのDPIで15個のピクセルになり、チェックボックスの幅を見つけるために使用、あなたのコードを変更し、代わりにチェックボックスの幅のため18ピクセルを供給テキストパディング用のピクセル)。

テーマが有効な場合は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は異なることに注意してください。

+0

応答いただきありがとうございます、これは多くの役に立ちます。しかし、私は 'BS_MULTILINE'を使用しているので、私は最初の部分を試していません。しかし、私が答えの2番目の部分を実行するとき、私は 'ht'に対して別の結果を得ます。しかし、 'sz.cx'はどちらの場合も13です。何か不足していますか? – Mangs

+0

左のイメージでは、テーマが有効になっているようです。したがって、 'ht'は有効で、' sz.cx'は13になります。右のイメージは、テーマが有効になっていないようです。したがって、 'ht'は' NULL'で 'sz.cx'は15になります。 –

+0

あなたは' ht'、有効、 'NULL'について正しいですが、' sz.cx'は有効かどうかは13です。しかし、あなたは多くの助けをしてくれました。私はここから進むことができます。本当にありがとう、ありがとう! – Mangs

関連する問題