ダイアログサイズ変更後のコントロールの表示位置について – プログラミング – Home

ダイアログサイズ変更後のコントロールの...
 
通知
すべてクリア

[解決済] ダイアログサイズ変更後のコントロールの表示位置について


おれっち
 おれっち
(@おれっち)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

どうも。

ダイアログサイズを変更したときに、ダイアログ上のコントロール全ての座標も変更し
たいのですが、現在は、GetWindowRect( )でRECT構造体に座標位置を取得し、
SetWindowPos( )で移動するという方法をとっていますが、この方法では1つ1つのコン
トロールに対して行わなければならず少し効率が悪いように感じてしまいます。
もっとよいやり方を知っているという方は教えていただけませんか?

お手数ですが、よろしくお願いいたします。


引用未解決
トピックタグ
おれっち
 おれっち
(@おれっち)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

自己レスです。

開発環境を記載し忘れていたので、以下に記載します。

Windows XP
Visual C++ .NET MFC


返信引用
ん
 ん
(@ん)
ゲスト
結合: 24年前
投稿: 106
 

暇つぶしに作ってみました。(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 って使わないんで、やたらとキャスト入ってますがご勘弁。

一応、これでダイアログサイズ変更に画面部品が同じようにのびたり、ちぢんだりします。


返信引用
ん
 ん
(@ん)
ゲスト
結合: 24年前
投稿: 106
 

よくみたら、「.net」なんですね。
自分は VC6なんで出来なかったら仕方ないってことで。


返信引用
おれっち
 おれっち
(@おれっち)
ゲスト
結合: 21年前
投稿: 14
Topic starter  

ありがとうございます。
参考にさせていただきます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました