MFC控件随窗口大小变化原理及实现
生活随笔
收集整理的這篇文章主要介紹了
MFC控件随窗口大小变化原理及实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文主要針對MFC的dialog,實現(xiàn)控件隨窗口大小變化。
原理:首先獲取dialog的初始大小,當窗口發(fā)送變動時,調(diào)用OnSize事件和方法,計算縮放比例,然后對界面中的所有控件進行縮放和布局。
實現(xiàn):
創(chuàng)建一個CMFCDemoDlg的dialog對話框;
// CMFCDemoDlg 對話框 class CMFCDemoDlg : public CDialogEx { // 構造 public:CMFCDemoDlg(CWnd* pParent = NULL); // 標準構造函數(shù)// 對話框數(shù)據(jù)enum { IDD = IDD_MFCDEMO_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持protected:CRect m_rect;void ChangeSize(UINT nID,int x,int y);void ReSize(void); POINT old; protected:// 生成的消息映射函數(shù)virtual BOOL OnInitDialog();afx_msg void OnSize(UINT nType, int cx, int cy);DECLARE_MESSAGE_MAP() };在OnInitDialog方法中獲取dialog的初始大小,記錄到old變量中;
注冊OnSize事件處理方法(ON_WM_SIZE(), OnSize()函數(shù)),設置控件大小
CMFCDemoDlg::CMFCDemoDlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCDemoDlg::IDD, pParent) {m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }void CMFCDemoDlg::DoDataExchange(CDataExchange* pDX) {CDialogEx::DoDataExchange(pDX); }BEGIN_MESSAGE_MAP(CMFCDemoDlg, CDialogEx)ON_WM_SIZE() END_MESSAGE_MAP()// CMFCDemoDlg 消息處理程序BOOL CMFCDemoDlg::OnInitDialog() {CDialogEx::OnInitDialog();// 獲取對話框初始大小 GetClientRect(&m_rect); //獲取對話框的大小old.x=m_rect.right-m_rect.left; old.y=m_rect.bottom-m_rect.top;return TRUE; }void CMFCDemoDlg::ReSize(void) { float fsp[2]; POINT Newp; //獲取現(xiàn)在對話框的大小 CRect recta; GetClientRect(&recta); //取客戶區(qū)大小 Newp.x=recta.right-recta.left; Newp.y=recta.bottom-recta.top; fsp[0]=(float)Newp.x/old.x; fsp[1]=(float)Newp.y/old.y; CRect Rect; int woc; CPoint OldTLPoint,TLPoint; //左上角 CPoint OldBRPoint,BRPoint; //右下角 HWND hwndChild=::GetWindow(m_hWnd,GW_CHILD); //列出所有控件 while(hwndChild){ woc=::GetDlgCtrlID(hwndChild);//取得ID GetDlgItem(woc)->GetWindowRect(Rect); ScreenToClient(Rect); OldTLPoint = Rect.TopLeft(); TLPoint.x = long(OldTLPoint.x*fsp[0]); TLPoint.y = long(OldTLPoint.y*fsp[1]); OldBRPoint = Rect.BottomRight(); BRPoint.x = long(OldBRPoint.x *fsp[0]); BRPoint.y = long(OldBRPoint.y *fsp[1]); Rect.SetRect(TLPoint,BRPoint); GetDlgItem(woc)->MoveWindow(Rect,TRUE); hwndChild=::GetWindow(hwndChild, GW_HWNDNEXT); }old=Newp; } void CMFCDemoDlg::OnSize(UINT nType, int cx, int cy) {CDialogEx::OnSize(nType,cx,cy);if(nType!=SIZE_MINIMIZED ) //判斷窗口是不是最小化了,因為窗口最小化之后 ,窗口的長和寬會變成0,當前一次變化的時就會出現(xiàn)除以0的錯誤操作{ReSize();} }通過hwndChild=::GetWindow(m_hWnd,GW_CHILD);和::GetWindow(hwndChild, GW_HWNDNEXT);?列出所有控件?
也可針對特定控件設置其大小,如:
//change control size void CMFCDemoDlg::ChangeSize(UINT nID,int x,int y) {CWnd *pWnd = GetDlgItem(nID);if(pWnd!=NULL){CRect rec;pWnd->GetWindowRect(&rec);//獲取控件變化前的大小ScreenToClient(rec); //將控件大小裝換位在對話框中的區(qū)域坐標// x / m_rect.Width(); 伸縮raterec.left = rec.left * x / m_rect.Width();rec.top = rec.top * y / m_rect.Height();rec.bottom = rec.bottom * y / m_rect.Height();rec.right = rec.right * x / m_rect.Width();pWnd->MoveWindow(rec);//伸縮控件} }?
?
參考:http://blog.csdn.net/lujianfeiccie2009/article/details/5485602
總結(jié)
以上是生活随笔為你收集整理的MFC控件随窗口大小变化原理及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ffmpeg进行h.264编码
- 下一篇: 无法将成员变量添加到ID为 的控件中