( 経由で) 2 つのペインを持つプログラムを作成していますCSplitter
が、各フレームのコントロールのサイズを変更する方法を理解するのに問題があります。CEdit
簡単にするために、単一のコントロールを持つ基本的なフレームに対してどのように行うか教えてもらえますか?
私はそれがCEdit::OnSize()
機能に関係しているとかなり確信しています...しかし、私は本当にどこにも行きません...
ありがとう!:)
ウィンドウは、サイズが変更された直後にWM_SIZEメッセージ(MFCのOnSizeハンドラーによって処理されます)を受信するため、CEdit::OnSizeは探しているものではありません。
フレームクラスとこのハンドラー内にOnSizeハンドラーを追加する必要があります。これは、Robがフレームのクライアント領域の幅と高さを取得することを指摘した後、コントロールのサイズと位置を調整するコードを追加する必要があります。
このようなもの
void MyFrame::OnSize(UINT nType, int w, int h)
{
// w and h parameters are new width and height of your frame
// suppose you have member variable CEdit myEdit which you need to resize/move
myEdit.MoveWindow(w/5, h/5, w/2, h/2);
}
フレームが OnSize メッセージを受け取ると、新しい幅と高さが得られます。これらの値を渡す CEdit SetWindowPos メソッドを呼び出すだけです。
CMyPane がスプリッター ペインであり、OnCreate で作成した m_wndEdit という CEdit が含まれているとします。
void CMyPane::OnSize(UINT nType, int cx, int cy)
{
m_wndEdit.SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // 実際に移動、サイズ変更などを行うことができます
SetWindowPos は、この目的のために少し負担が大きいです。MoveWindow には、必要なものだけが揃っています。
WM_SIZE は、その時点で子コントロールを処理してサイズ変更する必要があるメッセージであると指摘する人もいます。WM_SIZE は、サイズ変更が終了した後に送信されます。
サイズ変更の進行中に送信される WM_SIZING メッセージを処理することもできます。これにより、ユーザーがまだマウスをドラッグしている間に、子ウィンドウのサイズを積極的に変更できます。WM_SIZING を処理するために厳密に必要というわけではありませんが、ユーザー エクスペリエンスを向上させることができます。
CodeGuru の CResize クラスを使用して、すべてのコントロールのサイズを自動的に変更します。各コントロールのサイズを変更する方法を指定すると、それが自動的に実行されます。
サイズ変更パラダイムは、ダイアログのサイズが変更されたときにコントロールの各辺がどれだけ移動するかを指定することです。
SetResize(IDC_EDIT1, 0, 0, 0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0, 1, 1);
多数のダイアログ コントロールがある場合に非常に便利です。
ウィンドウ サイズの変更に関しては、関心のあるウィンドウ メッセージが 3 つあります: ON_WM_SIZE()
、ON_WM_SIZING()
、およびON_WM_GETMINMAXINFO()
。
公式ドキュメントが言うように:
ON_WM_SIZE
::OnSize()
CWnd のサイズが変更された後にメッセージ ハンドラーがトリガーされます。ON_WM_SIZING
::OnSizing()
クリップボード ビューアー ウィンドウのクライアント領域のサイズが変更されたときに、そのメッセージ ハンドラーがトリガーされます。ON_WM_GETMINMAXINFO
そのメッセージ ハンドラーは::OnGetMinMaxInfo()
、ウィンドウが最大化された位置やサイズ、または最小または最大のトラッキング サイズを知る必要があるたびにトリガーされます。のサイズをcwnd
ある範囲に制限したい場合は、メッセージを参照してくださいON_WM_GETMINMAXINFO
。サイズの変化をリアルタイムで取得したい場合は、他の 2 つのメッセージを参照してください。