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移動到新位置
對話方塊或視類的大小調後,控制項的大小和位置沒有變化,介面看起來會很不爽。控制項是從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就可以了。