CDialogベースでダイアログを作成して,
そのダイアログにリストボックスを作成しました。
ですが,ダイアログの大きさを変えても,
エディットボックスの大きさはそのままで
サイズ変更がされません。。
いろいろプロパティをいじっているのですが・・
どなたかダイアログサイズを変更すると
エディットボックスのサイズも変更する方法を
ご存知の方いらっしゃれば教えて下さい。
よろしくお願いします。
あと環境はVC++6.0のMFCでWIN2000です。
どうか手取り足取りお願いします。
>そのダイアログにリストボックスを作成しました。
すいません「そのダイアログにエディットボックスを作成しました。」です
ダイアログボックスのサイズが変更されたときのメッセージ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 );
}
}
>ダイアログボックスのサイズが変更されたときのメッセージWM_SIZEのハンドラ>OnSizeをオーバーライドして
この文章がどうしても理解できません。上記を理解できるようなヒントもしくは
参考となるようなHP等ありましたら教えて下さい。
また
monnkeyさんが示したソースを参考に作ってみましたがサイズを変更したとき
関数void CxxxDlg::OnSize()が呼ばれません。この関数を書く位置が間違えて
いるのでしょうか??
メッセージマップに追加する必要があります。
ClassWizardのメッセージマップタブで
WM_SIZEメッセージのメンバ関数を追加してください。
OnSize()も自動的に作られます。
REE様 解決しました。
が
>rectに新しいエディットのサイズ・位置を設定
でうまくいきません。たとえば
CRect rect=CRect(50,50,190,250);とするとダイアログのサイズを変更したときにエディットボックスも変化しますが、変化した後元にもどりません。
一般的な方法でどのように対応しているのでしょうか??
OnSizeの第2、第3引数(cx,cy)には、サイズ変更後のダイアログボックスのクライアントエリアの幅と高さの値が渡されますので、それらの値を使って、エディットの新しいサイズと位置を計算します。
クライアントエリアのサイズに対して、相対的なサイズ・位置にするということです。
詳細はMSDNのCWnd::OnSizeを参照してください。
なるほど
うまく動きましたが、ダイアログに貼り付けたエディットボックスの座標とかは
どこで参照すればいいのでしょうか?
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も目視でだいたいの値をはじいて書いたのですが、やはり正確な数値がわからないとダイアログのサイズを変更したときに微妙に不自然な動きになります。
つまりダイアログエディタで配置したコントロールの座標を取得したいって
ことなのですが、どなたかご存知ないでしょうか?
pEdit->GetClientRect() で得た座標を、
pEdit->MapWindowPoints() で親ダイアログの座標系に変換して得られます。
これでもいけます。
CRect rect;
pEdit->GetWindowRect( &rect ); // スクリーン座標系のエディットの
// 矩形領域を取得し、
ScreenToClient( &rect ); // このウィンドウ(ダイアログ)の
// クライアント座標系の矩形領域に変更する
ありがとうございます。早速試してみます。
ツイート | ![]() |