MFCにおけるコントロールサイズはダイアログサイズとともに動的に変化する


まず***Dlgで.hヘッダファイルで定義
[cpp] view plain copy print ?
CRect m_rectmin;//初期化ダイアログを格納するサイズ
  • CRect Button1Rectinit;//初期化コントロールを格納するサイズ
  • CRect m_rectmin;// 
    CRect Button1Rectinit;// 

    次に変化関数を定義します
    [cpp] view plain copy print ?
    //コントロールサイズ位置ダイアログサイズに従って任意に変化する
  • //パラメータはコントロールIDコントロール初期化パラメータlpRect
  • void autosize(UINT nID,LPRECT lpRect);  
    //   
    // ID   lpRect 
    void autosize(UINT nID,LPRECT lpRect);

    *Dlgでcppファイルに、次のコードを追加します.
    [cpp] view plain copy print ?
    ***Dlg::OnInitDialog()  
  • {  

  •     ******  
  • GetWindowRect(&m_rectmin);//ダイアログサイズの初期値
  • を取得
          
  • //取得ダイアログボックス内の各コントロールのサイズ初期値
  • CWnd *pWnd;  
  • pWnd = GetDlgItem(IDC_BUTTON1);//取得ボタン1ハンドル
  • pWnd->GetWindowRect(&Button1Rectinit);  
  • ********  

  • }  
    ***Dlg::OnInitDialog()
    {
        ******
    GetWindowRect(&m_rectmin);// 
    	
    // 
    CWnd *pWnd;
    pWnd = GetDlgItem(IDC_BUTTON1);         // 1 
    pWnd->GetWindowRect(&Button1Rectinit);
    ********
    }

     
    [cpp] view plain copy print ?
    void CPISProcToolsDlg::autosize(UINT nID,LPRECT lpRect)  
  • {  

  •     CWnd *pWnd;  
  •     pWnd = GetDlgItem(nID);//コントロールハンドル
  • を取得する
        if(!pWnd) return;//空かどうかを判断します.ダイアログの作成時にこの関数が呼び出されるため、コントロールはまだを作成していません.
  •   

  •     CRect rect,recttemp;//rectをコントロール変更後のパラメータとして定義する
  •     GetClientRect(&recttemp);//recttemp変更取得後ダイアログボックスカスタマーサイズ
  •       
  • //各パラメータ値を計算し、各値メインウィンドウの相対値を利用して
  • を計算する.
        rect.left = recttemp.Width() * lpRect->left/m_rectmin.Width();  
  •     rect.right = recttemp.Width() * lpRect->right/m_rectmin.Width();  

  •     rect.top = recttemp.Height() * lpRect->top/m_rectmin.Height();  
  •     rect.bottom = recttemp.Height() * lpRect->bottom/m_rectmin.Height();  

  •   
  •     pWnd->MoveWindow(rect);//コントロール位置の調整
  • }  
    void CPISProcToolsDlg::autosize(UINT nID,LPRECT lpRect)
    {
    	CWnd *pWnd;
    	pWnd = GetDlgItem(nID);   // 
    	if(!pWnd) return;         // , , 
    
    	CRect rect,recttemp;       // rect     
    	GetClientRect(&recttemp);  //recttemp 
    	
    // , 
    	rect.left = recttemp.Width() * lpRect->left/m_rectmin.Width();
    	rect.right = recttemp.Width() * lpRect->right/m_rectmin.Width();
    	rect.top = recttemp.Height() * lpRect->top/m_rectmin.Height();
    	rect.bottom = recttemp.Height() * lpRect->bottom/m_rectmin.Height();
    
    	pWnd->MoveWindow(rect);// 
    }

    そしてWM_をリロードSIZE関数とWM_OnGetMinMaxInfo関数:
    [cpp] view plain copy print ?
    void CPISProcToolsDlg::OnSize(UINT nType, int cx, int cy)  
  • {  

  •     CDialog::OnSize(nType, cx, cy);  
  •   

  • //TODO:ここにメッセージハンドラコードを追加
  •     if(nType == SIZE_MINIMIZED) return;//ウィンドウの最小化を防止する際に予知できない問題が発生する
  • .
        autosize(IDC_BUTTON1,Button1Rectinit);  
  • }  
  • void CPISProcToolsDlg::OnSize(UINT nType, int cx, int cy)
    {
    	CDialog::OnSize(nType, cx, cy);
    
    	// TODO:  
    	if(nType == SIZE_MINIMIZED) return;// 
    	autosize(IDC_BUTTON1,Button1Rectinit);
    }

    [cpp] view plain copy print ?
    void CPISProcToolsDlg::OnGetMinMaxInfo(MINMAXINFO*lpMMI)/制限ダイアログサイズ下限
  • {  

  • //TODO:ここにメッセージハンドラコードを追加するか、デフォルト値を呼び出す.
  •     lpMMI-> ptMinTrackSize.x   =   m_rectmin.Width()   ;//幅
  •     lpMMI-> ptMinTrackSize.y   =   m_rectmin.Height()   ;//高さ
  •   

  •     CDialog::OnGetMinMaxInfo(lpMMI);  
  • }  
  • void CPISProcToolsDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI)// 
    {
    	// TODO:  / 
    	lpMMI-> ptMinTrackSize.x   =   m_rectmin.Width()   ;   //  
    	lpMMI-> ptMinTrackSize.y   =   m_rectmin.Height()   ;    //  
    
    	CDialog::OnGetMinMaxInfo(lpMMI);
    }

    この記事は【http://blog.csdn.net/fc841105/article/details/6717111】