ダイアログとエディットボックスのサイズを同時に変更するには?


SHUN  2004-10-01 06:23:00  No: 54608

CDialogベースでダイアログを作成して, 
そのダイアログにリストボックスを作成しました。 

ですが,ダイアログの大きさを変えても, 
エディットボックスの大きさはそのままで 
サイズ変更がされません。。 
いろいろプロパティをいじっているのですが・・ 

どなたかダイアログサイズを変更すると 
エディットボックスのサイズも変更する方法を 
ご存知の方いらっしゃれば教えて下さい。 
よろしくお願いします。


SHUN  2004-10-01 06:25:22  No: 54609

あと環境はVC++6.0のMFCでWIN2000です。
どうか手取り足取りお願いします。


SHUN  2004-10-01 06:32:07  No: 54610

>そのダイアログにリストボックスを作成しました。 
すいません「そのダイアログにエディットボックスを作成しました。」です


monkey  2004-10-01 07:08:41  No: 54611

ダイアログボックスのサイズが変更されたときのメッセージWM_SIZEのハンドラOnSizeをオーバーライドして、MoveWindow関数によってエディットボックスのサイズ・位置をお望みの値に変更すれば良いです。

// 例
void CxxxDlg::OnSize( UINT nType, int cx, int cy )
{
    CWnd* pEdit = GetDlgItem( IDC_EDIT_X );
    if( pEdit != NULL )
    {
        CRect rect;
        rectに新しいエディットのサイズ・位置を設定

        pEdit->MoveWindow( &rect, TRUE );
    }
}


SHUN  2004-10-01 20:48:53  No: 54612

>ダイアログボックスのサイズが変更されたときのメッセージWM_SIZEのハンドラ>OnSizeをオーバーライドして
この文章がどうしても理解できません。上記を理解できるようなヒントもしくは
参考となるようなHP等ありましたら教えて下さい。

また
monnkeyさんが示したソースを参考に作ってみましたがサイズを変更したとき
関数void CxxxDlg::OnSize()が呼ばれません。この関数を書く位置が間違えて
いるのでしょうか??


REE  2004-10-01 23:02:17  No: 54613

メッセージマップに追加する必要があります。

ClassWizardのメッセージマップタブで
WM_SIZEメッセージのメンバ関数を追加してください。
OnSize()も自動的に作られます。


SHUN  2004-10-02 02:29:37  No: 54614

REE様  解決しました。

>rectに新しいエディットのサイズ・位置を設定
でうまくいきません。たとえば
CRect rect=CRect(50,50,190,250);とするとダイアログのサイズを変更したときにエディットボックスも変化しますが、変化した後元にもどりません。

一般的な方法でどのように対応しているのでしょうか??


monkey  2004-10-02 07:27:55  No: 54615

OnSizeの第2、第3引数(cx,cy)には、サイズ変更後のダイアログボックスのクライアントエリアの幅と高さの値が渡されますので、それらの値を使って、エディットの新しいサイズと位置を計算します。
クライアントエリアのサイズに対して、相対的なサイズ・位置にするということです。
詳細はMSDNのCWnd::OnSizeを参照してください。


SHUN  2004-10-04 18:53:05  No: 54616

なるほど
うまく動きましたが、ダイアログに貼り付けたエディットボックスの座標とかは
どこで参照すればいいのでしょうか?

void CTest_move_windowDlg::OnSize(UINT nType, int cx, int cy) 
{
  CDialog::OnSize(nType, cx, cy);
  CWnd* pEdit = GetDlgItem(IDC_EDIT1);
  if( pEdit != NULL )  
  {
    CRect rectED=CRect(10,10,cx-120,cy-25);
    pEdit->MoveWindow( &rectED, TRUE );

  }

}
いまこんな感じです
cx-120,cy-25も目視でだいたいの値をはじいて書いたのですが、やはり正確な数値がわからないとダイアログのサイズを変更したときに微妙に不自然な動きになります。


SHUN  2004-10-04 19:54:58  No: 54617

つまりダイアログエディタで配置したコントロールの座標を取得したいって
ことなのですが、どなたかご存知ないでしょうか?


シャノン  2004-10-04 21:49:38  No: 54618

pEdit->GetClientRect() で得た座標を、
pEdit->MapWindowPoints() で親ダイアログの座標系に変換して得られます。


monkey  2004-10-05 07:59:33  No: 54619

これでもいけます。

CRect rect;
pEdit->GetWindowRect( &rect ); // スクリーン座標系のエディットの
                               // 矩形領域を取得し、
ScreenToClient( &rect );       // このウィンドウ(ダイアログ)の
                               // クライアント座標系の矩形領域に変更する


SHUN  2004-10-08 23:51:07  No: 54620

ありがとうございます。早速試してみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加