2012-02-27 6 views
2

リソースファイルで定義されているダイアログクライアント領域のサイズを調べる必要があります。リソースファイルで定義されているダイアログサイズを取得する

GetClientRectは、デザインサイズをデスクトップのサイズでクリップします。画面単位で設計されたサイズが必要です。私はthisは、サイズをダイアログリソースから取得することを目的としていますが、悲しいことにMFCを使用しています。

私はダイアログを開いて、そのHWNDとそのIDを持っています。どのようにMFCのものを使用せずに画面単位でdsignのサイズを取得できますか?

+0

ダイアログコードのリソースIDを使用してCreateDialogを呼び出した後、GetClientRectを呼び出すのと同じことです。おそらく実際にリソース内のテンプレートを解析する必要があります。 – pezcode

+0

@pezcode:FindResource、LoadResource、LockResourceを使用してDLGTEMPLATEで始まるダイアログリソースへのポインタを取得し、そこからcxとcyまたはダイアログボックス単位のサイズを取得します。次に、GetDialogBaseUnitsを使用して画面単位に変換しますか?プロセスの生存期間中、リソースはロックされたままですか?私はそれを何度もロックするのを避けるべきですか? –

+0

クラシックXY質問です。あなたが知っているとすれば、その情報を使って正確に何をするつもりですか? –

答えて

1
SIZE GetDialogSize(INT nResourceId, BOOL bApproximateCalcMethod = FALSE, LPCTSTR strDllName = NULL) 
{ 

    SIZE dlgSize = {0}; 
    HINSTANCE hModule = 0; 

    if(strDllName != NULL) 
     hModule= ::LoadLibrary(strDllName);    
    else 
     hModule = ::GetModuleHandle(NULL); 

    HRSRC hRsrc = ::FindResource(hModule, MAKEINTRESOURCE(nResourceId), RT_DIALOG); 

    HGLOBAL hTemplate = ::LoadResource(hModule, hRsrc); 

    DLGTEMPLATE* pTemplate = (DLGTEMPLATE*)::LockResource(hTemplate); 

    if (bApproximateCalcMethod) // the approximate method of calculating 
    { 
     LONG dlgBaseUnits = GetDialogBaseUnits(); 
     int baseunitX = LOWORD(dlgBaseUnits), baseunitY = HIWORD(dlgBaseUnits); 
     dlgSize.cx = MulDiv(pTemplate->cx, baseunitX, 4); 
     dlgSize.cy = MulDiv(pTemplate->cy, baseunitY, 8); 
    } 
    else // the accurate method of calculation 
    { 
     HWND hDlg = ::CreateDialogIndirect(0, pTemplate, NULL, DialogProc);   
     RECT rc = {0}; 
     ::GetWindowRect(hDlg, &rc); 
     ::DestroyWindow(hDlg); 

     dlgSize.cx = rc.right - rc.left; 
     dlgSize.cy = rc.bottom - rc.top; 
    } 

    UnlockResource(hTemplate); 
    ::FreeResource(hTemplate); 

    if(strDllName != NULL) 
     ::FreeLibrary(hModule); 

    return dlgSize; 
} 
+0

ありがとう! pezcodeのヒントを使って多かれ少なかれこれをドープしましたが、ダイアログユニットからスクリーンユニットへの変換はまだ問題であり、クリーンアップコードは非常に便利です。ダイアログがデスクトップよりも大きければ、正確なメソッドはクリップされたサイズを返しませんか? –

+0

MapDialogRectを使ってダイアログユニットからスクリーンユニットに変換すると、非常に良い結果が得られました。 –

+0

MapDialogRectは、ダイアログユニットを画面単位に変換する際に私にとって完璧に機能します。私の場合、私はHWNDのダイアログを持っていたので、それはまっすぐだった。 hellkni9htのコードでは、 "正確な計算方法"でGetWindowRectを置き換えることができます。 –