14

( 経由で) 2 つのペインを持つプログラムを作成していますCSplitterが、各フレームのコントロールのサイズを変更する方法を理解するのに問題があります。CEdit簡単にするために、単一のコントロールを持つ基本的なフレームに対してどのように行うか教えてもらえますか?

私はそれがCEdit::OnSize()機能に関係しているとかなり確信しています...しかし、私は本当にどこにも行きません...

ありがとう!:)

4

8 に答える 8

11

ウィンドウは、サイズが変更された直後に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);
}
于 2008-09-24T14:46:16.197 に答える
10

フレームが 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);
}
于 2008-09-24T14:28:10.200 に答える
5

GetDlgItem(IDC_your_slidebar)->SetWindowPos(...) // 実際に移動、サイズ変更などを行うことができます

于 2008-09-24T14:36:00.620 に答える
3

SetWindowPos は、この目的のために少し負担が大きいです。MoveWindow には、必要なものだけが揃っています。

于 2008-09-24T14:32:49.177 に答える
2

WM_SIZE は、その時点で子コントロールを処理してサイズ変更する必要があるメッセージであると指摘する人もいます。WM_SIZE は、サイズ変更が終了した後に送信されます。

サイズ変更の進行中に送信される WM_SIZING メッセージを処理することもできます。これにより、ユーザーがまだマウスをドラッグしている間に、子ウィンドウのサイズを積極的に変更できます。WM_SIZING を処理するために厳密に必要というわけではありませんが、ユーザー エクスペリエンスを向上させることができます。

于 2008-09-24T15:39:28.250 に答える
1

CodeGuru の CResize クラスを使用して、すべてのコントロールのサイズを自動的に変更します。各コントロールのサイズを変更する方法を指定すると、それが自動的に実行されます。

サイズ変更パラダイムは、ダイアログのサイズが変更されたときにコントロールの各辺がどれだけ移動するかを指定することです。

SetResize(IDC_EDIT1, 0,   0,   0.5, 1);
SetResize(IDC_EDIT2, 0.5, 0,   1,   1);

多数のダイアログ コントロールがある場合に非常に便利です。

ソースコード

于 2008-09-24T21:23:25.243 に答える
0

ウィンドウ サイズの変更に関しては、関心のあるウィンドウ メッセージが 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 つのメッセージを参照してください。

于 2019-01-08T07:51:16.880 に答える