3

ダイアログのピクセル単位でデフォルトのサイズを設定したいと思います。たとえば、幅640ピクセル、高さ384ピクセルです。つまりdefault、が最初にCXXXDlg::OnSize(UINT nType, int cx, int cy)呼び出されたときの値cxは640、の値cyは384です。シーンダイアログのデフォルトサイズはダイアログ単位であり、MapDialogRect()を使用して変換できます。ピクセルへのダイアログユニット、どうすればその逆を行うことができますか?MoveWindow()およびはSetWindowPos()ダイアログのサイズを設定できますが、デフォルトのサイズは設定できません。また、次のようにGetDialogBaseUnits()を試しました。

DWORD dw = GetDialogBaseUnits();
WORD m_duXx4 = LOWORD(dw);
WORD m_duYx8 = HIWORD(dw);
int dialogUnitX = MulDiv(640, 4, m_duXx4);
int dialogUnitY = MulDiv(384, 8, m_duYx8);

dialogUnitXis320dialogUnitYisであることが判明しました192が、ダイアログユニットをに設定すると320 * 192、取得したのはでCXXXDlg::OnSize(UINT nType, int cx, int cy)はありませ640 * 384560 * 336。何か案は?

4

1 に答える 1

4

ウィンドウは、クライアントエリアクライアントエリアで構成されます。

クライアント領域は、アプリケーションがテキストやグラフィックスなどの出力を表示するウィンドウの一部です。

タイトルバー、メニューバー、ウィンドウメニュー、最小化および最大化ボタン、サイズ変更境界線、およびスクロールバーは、まとめてウィンドウの非クライアント領域と呼ばれます。

Window Rectは、ウィンドウ全体を含む領域を指定します。これには、クライアント領域と非クライアント領域が含まれます。を呼び出すことで取得できますGetWindowRect(またはそのMFCと同等)。MoveWindowまたはのような関数への入力としても使用されますSetWindowPos

Client Rectは、非クライアント領域によって占有されていないウィンドウの領域です。を呼び出すことで照会できますGetClientRectWM_SIZEクライアントのrectディメンションがメッセージハンドラーに渡されます。

AdjustWindowRectアプリケーションがクライアント領域に特定のサイズを必要とする場合は、またはを呼び出すことでそれぞれのウィンドウrectを計算できますAdjustWindowRectEx

ウィンドウの長方形は通常、画面の座標で表されますが、クライアントの長方形はクライアントの座標を使用します。両方の座標系はデバイスのピクセルを表します。原点は、画面座標の場合はプライマリディスプレイの左上隅にあり、クライアント座標の場合はクライアント領域の左上隅にあります。アプリケーションが使用する座標系間で変換するには、ClientToScreenまたはScreenToClient

ダイアログテンプレートは、ダイアログテンプレートユニットの寸法と位置を指定します。ダイアログテンプレートユニットは、ダイアログのフォントに直接関連しています。ダイアログテンプレートユニットとデバイスピクセルの間で変換するために、アプリケーションはを呼び出しますMapDialogRect。逆を計算するためのAPI呼び出しはありません。アプリケーションは手動で計算を実行する必要があります。

width  = MulDiv(width,  4, baseunitX);
height = MulDiv(height, 8, baseunitY);

アプリケーションがウィンドウサイズを動的に制限したい場合は、WM_GETMINMAXINFOメッセージを処理し、MINMAXINFO構造に必要なサイズを設定できます。このメッセージは、ウィンドウのサイズまたは位置が変更されようとしているときにウィンドウに送信されます。

于 2013-07-23T23:21:24.377 に答える