どうも。
ダイアログサイズを変更したときに、ダイアログ上のコントロール全ての座標も変更し
たいのですが、現在は、GetWindowRect( )でRECT構造体に座標位置を取得し、
SetWindowPos( )で移動するという方法をとっていますが、この方法では1つ1つのコン
トロールに対して行わなければならず少し効率が悪いように感じてしまいます。
もっとよいやり方を知っているという方は教えていただけませんか?
お手数ですが、よろしくお願いいたします。
自己レスです。
開発環境を記載し忘れていたので、以下に記載します。
Windows XP
Visual C++ .NET MFC
暇つぶしに作ってみました。(SDI/ダイアログとかはダイアログを選択)
1.ダイアログの *.h の class 宣言の前に以下内容追記
#include <afxtempl.h>
typedef struct
{
UINT nID ;
RECT rect ;
}rectInfo_t;
2.クラス定義の最後の方に下記内容追記
protected:
RECT m_dlgRect ;
CArray<rectInfo_t,rectInfo_t> m_rectArray ;
3.ダイアログのOnInitDialog処理に下記内容追記
// ダイアログサイズ保持
GetWindowRect( &m_dlgRect );
// 画面部品情報保持
rectInfo_t r ;
CWnd* pWnd = GetWindow(GW_CHILD) ;
while(pWnd)
{
r.nID = pWnd->GetDlgCtrlID() ;
pWnd->GetWindowRect( &r.rect );
m_rectArray.Add( r );
pWnd = pWnd->GetWindow(GW_HWNDNEXT) ;
}
4.クラスウィザードで WM_SIZE の OnSize を追加して下記内容追記
// 倍率算出
double bairituX = double(cx) / double(m_dlgRect.right) ;
double bairituY = double(cy) / double(m_dlgRect.bottom) ;
// 倍率変更
for( int i=0; i<=m_rectArray.GetUpperBound(); i++ )
{
RECT rect ;
rect.top = long( double(m_rectArray[i].rect.top) * bairituY ) ;
rect.bottom = long( double(m_rectArray[i].rect.bottom) * bairituY ) ;
rect.left = long( double(m_rectArray[i].rect.left) * bairituX ) ;
rect.right = long( double(m_rectArray[i].rect.right) * bairituX ) ;
GetDlgItem(m_rectArray[i].nID)->MoveWindow(&rect) ;
}
※普段 double って使わないんで、やたらとキャスト入ってますがご勘弁。
一応、これでダイアログサイズ変更に画面部品が同じようにのびたり、ちぢんだりします。
よくみたら、「.net」なんですね。
自分は VC6なんで出来なかったら仕方ないってことで。
ありがとうございます。
参考にさせていただきます。