mfc控制項自適應視窗大小,隨視窗大小變化而變化

來源:互聯網
上載者:User

作為一個mfc的初學者,難免會遇到這樣的問題,視窗可以改變大小,而其中的控制項大小也隨之改變,那怎麼樣去做呢。

1.對應視窗的屬性Maximize Box和Minimize Box設定為true,從而能夠使視窗最大化和最小化,Border屬性設定為Resizing從而可以改變視窗的大小。

2.在訊息有個WM_SIZE,添加函數OnSize,這樣可以在函數內調整控制項的大小,特別說明很多代碼中利用當前控制項比值與視窗大小比值再乘上當前視窗大小來改變控制項大小,但是由於精度的問題,調整多次就會出問題,那麼這裡可以利用一個結構體儲存每個控制項與原視窗的比值。

先建立結構體:

typedef struct Rect
{
public:
    int Id;
    double scale[4];


Rect()
{
  Id=-2;
  scale[0]=0;
  scale[1]=0;
  scale[2]=0;
  scale[3]=0;
}


Rect(const Rect& c)
{
   *this=c;
}
}control;

其中Id用來儲存控制項的Id,但是這裡初始化為-2代表著裡面沒有控制項,所以你要注意你的控制項中沒有宏定義Id為-2的,這裡算是一個不完善點。

然後在類的成員變數中添加變數

CRect m_rect;//擷取最開始的視窗大小
control m_control[10];//最多10個控制項,這裡代碼可移植性沒那麼強,但是作者能力比較低,直接用數字代表,也沒有用宏定義

然後就可以在OnSize中添加方法了

//控制控制項大小,使得隨視窗大小變化而變化
void CChangeDBToolDlg::OnSize(UINT nType, int cx, int cy)
{

CDialog::OnSize(nType, cx, cy);
//擷取控制項得到大小以及原大小,方便進行比例調整
CWnd *pWnd;             
int woc;
//列出所有控制項
    HWND  hwndChild=::GetWindow(m_hWnd,GW_CHILD);  
//判定是否為最小狀態,是的話就不進行重繪
if(!cx||!cy)              
{
   return;      
}
else
{
while(hwndChild)
{
                      woc=::GetDlgCtrlID(hwndChild);//獲得控制項的ID
     pWnd= GetDlgItem(woc); //擷取ID為woc的空間的控制代碼
     int i=0;
     if(pWnd)
     {
          CRect rect;   //擷取當前視窗的大小
      pWnd->GetWindowRect(&rect);
      ScreenToClient(&rect);//將控制項大小轉換為在對話方塊中的地區座標
  for( i=0;i<10;i++)
  {
  if(m_control[i].Id==woc)//如果儲存的有該控制項與視窗比值,直接乘上當前視窗大小
  {
  rect.left = m_control[i].scale[0] * cx;
  rect.right = m_control[i].scale[1] * cx;
  rect.top = m_control[i].scale[2] * cy;
  rect.bottom = m_control[i].scale[3] * cy;
  break;
  }
  }
  if(i==10)
  {
      for(i=0;i<10;i++)
  {
  if(m_control[i].Id==-2)//沒有找到控制項的比值,則選擇一個沒有資料的空間進行儲存
  {
  m_control[i].Id=woc;
  m_control[i].scale[0] = (double)rect.left/m_rect.Width();//注意類型轉換,不然儲存成long型就直接為0了
  m_control[i].scale[1] = (double)rect.right/m_rect.Width();
  m_control[i].scale[2] = (double)rect.top/m_rect.Height();
  m_control[i].scale[3] = (double)rect.bottom/m_rect.Height();
  /////調整控制項大小
  rect.left = m_control[i].scale[0] * cx;
  rect.right = m_control[i].scale[1] * cx;
  rect.top = m_control[i].scale[2] * cy;
  rect.bottom = m_control[i].scale[3] * cy;
  break;
  }
  }
  }
     pWnd->MoveWindow(rect);//設定控制項大小
      }
 hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); 
}
GetClientRect(&m_rect);//將變化後的對話方塊大小設為舊大小


}


// TODO: 在此處添加訊息處理常式代碼
}

其實網上有很多這種代碼,但是很多都沒有儲存比值,導致多次變化後其位置會改變,但是代碼還有不足之處是一些字型控制項等不能改變大小,我還在調一些東西,學會了後面發。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.