如何實現控制元件隨對話方塊大小變化而自動調整大小和位置
阿新 • • 發佈:2018-12-23
1. 處理對話方塊的WM_SIZE,然後用MoveWindow或者SetWindowPos來把對話方塊上面的控制元件重新調整新位置和大小。
2. 基本的做法就是響應WM_SIZE訊息,並按照視窗大小比例來調整控制元件的位置和大小,控制元件的大小最好設定成視窗的百分之幾,這樣的話,就可以根據視窗的大小隨時調整了。 3. 每次OnSize 即可獲得一個CRect,然後根據這個CRect來確定這些控制元件的位置和大小,使用函式MoveWindow 或SetWindowpos實現。 4.
1)通過下面兩個函式獲取的是顯示螢幕的大小【螢幕的解析度】(不包括工作列等區域): int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //螢幕寬度 int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //螢幕高度 2)這兩個函式獲取的是真正螢幕的大小【螢幕的解析度】(包括工作列等區域): int cx = GetSystemMetrics( SM_CXSCREEN ); int cy = GetSystemMetrics( SM_CYSCREEN );
如:用前兩個函式獲取的大小可能是1024*687 ,而用下邊兩個獲取的就是1024*768。 5. 在OnSize() 中呼叫: GetClientRect() 和 GetWindowRect() 函式可獲取視窗大小,但需注意得到的是裝置座標,如果需要畫圖什麼的還需要轉換成邏輯座標。
6. 字型大小隨視窗變化而自動變化,比如說始終使字的高度始終佔視窗的1/3。使用: 1). 在Creat中將nHeight設成視窗長度或者寬度的一定比值就行了(最好在onsize函式中設定);
2). 使用 WM_FONTCHANGE 訊息。
******************************************************************************************************************************************* 轉載自:
http://topic.csdn.net/u/20090314/16/835a3bbb-2d13-4842-922a-8a07cde1a055.html (作者:Fireway2008) 總結步驟:
1.建立一個CWnd* 的陣列,在初始化時取的各個控制元件的控制代碼,存在這個數組裡面 2.處理WM_SIZE事件,可以得到新變化後的視窗和最初視窗的變化比例kx,ky 3.對陣列中的每一個控制元件,計算新位置 4.MoveWindow移動到新位置
2014年全國註冊建造師考試 建設工程造價管理 建設工程計價 建設工程造價案例分析 建設工程技術與計量
對話方塊或視類的大小調後,控制元件的大小和位置沒有變化,介面看起來會很不爽。控制元件是從CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()來改變其大小,應在父視窗的WM_SIZE訊息中使用MoveWindow()來進行調整。===========>>>>>>> 根據按鈕控制元件ID不同進行調整,響應WM_SIZE 1. 先宣告一個成員
CRect m_rect; //用於儲存對話方塊大小變化前的大小
2. 初始化的時候獲取對話方塊區域 BOOL CTestDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon //獲取對話方塊建立時的大小: GetClientRect(&m_rect); …… }
3. 自定義一個函式,根據控制元件ID進行處理 void CTestDlg::ChangeSize(UINT nID, int x, int y) {
CWnd *pWnd;
pWnd = GetDlgItem(nID); //獲取控制元件控制代碼
if(pWnd) //判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制元件還未建立 {
CRect rect; //獲取控制元件變化前大小 pWnd->GetWindowRect(&rect);
ScreenToClient(&rect); //將控制元件大小轉換為在對話方塊中的區域座標
// 其中 x / m_rect.Width() 為對話方塊在橫向的變化比例;y / m_rect.Height()為對話方塊在縱向的變化比例
rect.left = rect.left * x / m_rect.Width(); // 調整控制元件大小 rect.right = rect.right * x / m_rect.Width(); rect.top = rect.top * y / m_rect.Height(); rect.bottom = rect.bottom * y / m_rect.Height(); pWnd->MoveWindow(rect); //設定控制元件大小 } }
void CTestDlg::OnSize(UINT nType, int cx, int cy) {
CDialog::OnSize(nType, cx, cy);
//進行條件判斷,不然視窗最小化後再恢復就產生BUG(整數除以0),即:最小化的時候m_rect的各個量是“0”,所以在視窗還原的時候就出現了除0的異常。 if(nType != SIZE_MINIMIZED ) {
ChangeSize(IDC_BUTTON1, cx, cy); ChangeSize(IDC_BUTTON2, cx, cy); ChangeSize(IDC_BUTTON3, cx, cy); ChangeSize(IDC_BUTTON4, cx, cy);
GetClientRect(&m_rect); // 將變化後的對話方塊大小設為舊大小,否則無法還原控制元件原始位置 } }
*******************************************************************************************************************************************
轉載自:http://www.joyvc.cn/GuiAndWindows/GuiAndWindows00040.html
VC對話方塊全屏顯示及相應控制元件位置改變
一、簡單對話方塊全屏顯示方法 在OnInitDialog()中任意加入:
1、ModifyStyle(WS_CAPTION,0,0); //如果不想去掉標題欄,去掉該句。 SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0); 2、ShowWindow(SW_SHOWMAXIMIZED);
二、複雜一點的對話方塊全屏顯示方法,隨螢幕的分辯率而調節 void CMainFrame::OnFullScreen() {
GetWindowPlacement(&m_OldWndPlacement); CRect WindowRect;
GetWindowRect(&WindowRect); CRect ClientRect;
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
ClientToScreen(&ClientRect);
//獲取螢幕的解析度
int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
//將除控制條外的客戶區全屏顯示到從(0,0)到(nFullWidth, nFullHeight)區域 //將(0,0)和(nFullWidth, nFullHeight)兩個點外擴充原視窗和除控制條之外 //客戶區位置間的差值, 就得到全屏顯示的視窗位置 m_FullScreenRect.left=WindowRect.left-ClientRect.left; m_FullScreenRect.top=WindowRect.top-ClientRect.top;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth; m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;
m_bFullScreen=TRUE; //設定全屏顯示標誌為TRUE
//進入全屏顯示狀態
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL; wndpl.rcNormalPosition=m_FullScreenRect; SetWindowPlacement(&wndpl); }
三、對話方塊全屏及按鈕控制元件移到相應位置
void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point) {
int cx=::GetSystemMetrics(SM_CXSCREEN); int cy=::GetSystemMetrics(SM_CYSCREEN);
CRect rtClient,rtBtn;
CWnd *pWnd=GetDlgItem(IDC_BUTTON);
GetClientRect(&rtClient); //獲得對話方塊客戶區螢幕座標 ClientToScreen(&rtClient); //對映為螢幕座標
pWnd->GetWindowRect(&rtBtn); //獲得button螢幕座標
int lx=rtBtn.Width(); //button長度 int ly=rtBtn.Height(); //button高度 int dx=rtClient.right-rtBtn.right; //離右邊框的距離 int dy=rtClient.bottom-rtBtn.bottom; //離底邊框的距離
MoveWindow(CRect(0,0,cx,cy)); //移動視窗
pWnd->MoveWindow(CRect(cx-dx-lx,cy-ly-dy,cx-dx,cy-dy)); //移動button
CDialog::OnLButtonDown(nFlags, point); }
四、設計狀態下指定對話方塊以全屏顯示
1、手工把它拽成比如1024×768,然後Alt+V U 2、在*.rc檔案中修改,但是單位不一樣。
五、用MoveWindow或SetWindowPos全屏對話方塊 1. 首先計算出客戶區的大小GetClientRect(); 2. 再計算出整個視窗的大小GetWindowRect(); 3. 然後再得到當前螢幕的大小GetSystemMetrics();
4. 最後根據這三個資料進行換算,得到當客戶區為螢幕大小時視窗的位置和大小; 5. 計算完成後呼叫MoveWindow就可以了。
2. 基本的做法就是響應WM_SIZE訊息,並按照視窗大小比例來調整控制元件的位置和大小,控制元件的大小最好設定成視窗的百分之幾,這樣的話,就可以根據視窗的大小隨時調整了。 3. 每次OnSize 即可獲得一個CRect,然後根據這個CRect來確定這些控制元件的位置和大小,使用函式MoveWindow 或SetWindowpos實現。 4.
1)通過下面兩個函式獲取的是顯示螢幕的大小【螢幕的解析度】(不包括工作列等區域): int nFullWidth=GetSystemMetrics( SM_CXFULLSCREEN ); //螢幕寬度 int nFullHeight=GetSystemMetrics( SM_CYFULLSCREEN ); //螢幕高度 2)這兩個函式獲取的是真正螢幕的大小【螢幕的解析度】(包括工作列等區域): int cx = GetSystemMetrics( SM_CXSCREEN ); int cy = GetSystemMetrics( SM_CYSCREEN );
如:用前兩個函式獲取的大小可能是1024*687 ,而用下邊兩個獲取的就是1024*768。 5. 在OnSize() 中呼叫: GetClientRect() 和 GetWindowRect() 函式可獲取視窗大小,但需注意得到的是裝置座標,如果需要畫圖什麼的還需要轉換成邏輯座標。
6. 字型大小隨視窗變化而自動變化,比如說始終使字的高度始終佔視窗的1/3。使用: 1). 在Creat中將nHeight設成視窗長度或者寬度的一定比值就行了(最好在onsize函式中設定);
2). 使用 WM_FONTCHANGE 訊息。
******************************************************************************************************************************************* 轉載自:
http://topic.csdn.net/u/20090314/16/835a3bbb-2d13-4842-922a-8a07cde1a055.html (作者:Fireway2008) 總結步驟:
1.建立一個CWnd* 的陣列,在初始化時取的各個控制元件的控制代碼,存在這個數組裡面 2.處理WM_SIZE事件,可以得到新變化後的視窗和最初視窗的變化比例kx,ky 3.對陣列中的每一個控制元件,計算新位置 4.MoveWindow移動到新位置
2014年全國註冊建造師考試 建設工程造價管理 建設工程計價 建設工程造價案例分析 建設工程技術與計量
對話方塊或視類的大小調後,控制元件的大小和位置沒有變化,介面看起來會很不爽。控制元件是從CWnd派生的,但不能使用SetWindowPos()或OnSize()或OnSizing()來改變其大小,應在父視窗的WM_SIZE訊息中使用MoveWindow()來進行調整。===========>>>>>>> 根據按鈕控制元件ID不同進行調整,響應WM_SIZE 1. 先宣告一個成員
CRect m_rect; //用於儲存對話方塊大小變化前的大小
2. 初始化的時候獲取對話方塊區域 BOOL CTestDlg::OnInitDialog() {
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon //獲取對話方塊建立時的大小: GetClientRect(&m_rect); …… }
3. 自定義一個函式,根據控制元件ID進行處理 void CTestDlg::ChangeSize(UINT nID, int x, int y) {
CWnd *pWnd;
pWnd = GetDlgItem(nID); //獲取控制元件控制代碼
if(pWnd) //判斷是否為空,因為對話方塊建立時會呼叫此函式,而當時控制元件還未建立 {
CRect rect; //獲取控制元件變化前大小 pWnd->GetWindowRect(&rect);
ScreenToClient(&rect); //將控制元件大小轉換為在對話方塊中的區域座標
// 其中 x / m_rect.Width() 為對話方塊在橫向的變化比例;y / m_rect.Height()為對話方塊在縱向的變化比例
rect.left = rect.left * x / m_rect.Width(); // 調整控制元件大小 rect.right = rect.right * x / m_rect.Width(); rect.top = rect.top * y / m_rect.Height(); rect.bottom = rect.bottom * y / m_rect.Height(); pWnd->MoveWindow(rect); //設定控制元件大小 } }
void CTestDlg::OnSize(UINT nType, int cx, int cy) {
CDialog::OnSize(nType, cx, cy);
//進行條件判斷,不然視窗最小化後再恢復就產生BUG(整數除以0),即:最小化的時候m_rect的各個量是“0”,所以在視窗還原的時候就出現了除0的異常。 if(nType != SIZE_MINIMIZED ) {
ChangeSize(IDC_BUTTON1, cx, cy); ChangeSize(IDC_BUTTON2, cx, cy); ChangeSize(IDC_BUTTON3, cx, cy); ChangeSize(IDC_BUTTON4, cx, cy);
GetClientRect(&m_rect); // 將變化後的對話方塊大小設為舊大小,否則無法還原控制元件原始位置 } }
*******************************************************************************************************************************************
轉載自:http://www.joyvc.cn/GuiAndWindows/GuiAndWindows00040.html
VC對話方塊全屏顯示及相應控制元件位置改變
一、簡單對話方塊全屏顯示方法 在OnInitDialog()中任意加入:
1、ModifyStyle(WS_CAPTION,0,0); //如果不想去掉標題欄,去掉該句。 SendMessage(WM_SYSCOMMAND,SC_MAXIMIZE,0); 2、ShowWindow(SW_SHOWMAXIMIZED);
二、複雜一點的對話方塊全屏顯示方法,隨螢幕的分辯率而調節 void CMainFrame::OnFullScreen() {
GetWindowPlacement(&m_OldWndPlacement); CRect WindowRect;
GetWindowRect(&WindowRect); CRect ClientRect;
RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);
ClientToScreen(&ClientRect);
//獲取螢幕的解析度
int nFullWidth=GetSystemMetrics(SM_CXSCREEN); int nFullHeight=GetSystemMetrics(SM_CYSCREEN);
//將除控制條外的客戶區全屏顯示到從(0,0)到(nFullWidth, nFullHeight)區域 //將(0,0)和(nFullWidth, nFullHeight)兩個點外擴充原視窗和除控制條之外 //客戶區位置間的差值, 就得到全屏顯示的視窗位置 m_FullScreenRect.left=WindowRect.left-ClientRect.left; m_FullScreenRect.top=WindowRect.top-ClientRect.top;
m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth; m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;
m_bFullScreen=TRUE; //設定全屏顯示標誌為TRUE
//進入全屏顯示狀態
WINDOWPLACEMENT wndpl;
wndpl.length=sizeof(WINDOWPLACEMENT); wndpl.flags=0;
wndpl.showCmd=SW_SHOWNORMAL; wndpl.rcNormalPosition=m_FullScreenRect; SetWindowPlacement(&wndpl); }
三、對話方塊全屏及按鈕控制元件移到相應位置
void CXXXDlg::OnLButtonDown(UINT nFlags, CPoint point) {
int cx=::GetSystemMetrics(SM_CXSCREEN); int cy=::GetSystemMetrics(SM_CYSCREEN);
CRect rtClient,rtBtn;
CWnd *pWnd=GetDlgItem(IDC_BUTTON);
GetClientRect(&rtClient); //獲得對話方塊客戶區螢幕座標 ClientToScreen(&rtClient); //對映為螢幕座標
pWnd->GetWindowRect(&rtBtn); //獲得button螢幕座標
int lx=rtBtn.Width(); //button長度 int ly=rtBtn.Height(); //button高度 int dx=rtClient.right-rtBtn.right; //離右邊框的距離 int dy=rtClient.bottom-rtBtn.bottom; //離底邊框的距離
MoveWindow(CRect(0,0,cx,cy)); //移動視窗
pWnd->MoveWindow(CRect(cx-dx-lx,cy-ly-dy,cx-dx,cy-dy)); //移動button
CDialog::OnLButtonDown(nFlags, point); }
四、設計狀態下指定對話方塊以全屏顯示
1、手工把它拽成比如1024×768,然後Alt+V U 2、在*.rc檔案中修改,但是單位不一樣。
五、用MoveWindow或SetWindowPos全屏對話方塊 1. 首先計算出客戶區的大小GetClientRect(); 2. 再計算出整個視窗的大小GetWindowRect(); 3. 然後再得到當前螢幕的大小GetSystemMetrics();
4. 最後根據這三個資料進行換算,得到當客戶區為螢幕大小時視窗的位置和大小; 5. 計算完成後呼叫MoveWindow就可以了。