現在很多軟體都採用按鈕調整工作區大小,使用起來十分方便,這裡我自己設計了乙個示例程式,與大家共享。
實現思路是:當我們單擊按鈕時,在按鈕的單擊響應函式中修改控制項的位置和大小,從而達到調整的目的(如圖所示),所以實現這個功能的核心是調節控制項的位置和大小。
圖1圖2這裡我採用了cwnd類的setwindowpos()函式,使用該函式之前必須先獲得控制項的指標,我使用getdlgitem()來做到這一點。兩個函式的原型如下:
cwnd* getdlgitem(int nid)const;
返回值:指向給定控制項或子視窗的指標;
引數:nid為控制項或子視窗的id值。
bool setwindowpos(const cwnd* pwndinsertafter,int x,int y,int cx,int cy,uint nflags);
功能:改變視窗的大小、位置和z次序;
引數:第乙個引數是改變視窗的z次序,這裡不用,可設為null;
x、y:視窗新位置;cx、cy:視窗新寬度和高度;
nflags常用取值:
swp_nozorder:忽略第乙個引數;
swp_nomove:忽略x、y,維持位置不變,在只調整大小時使用;
swp_nosize:忽略cx、cy,維持大小不變,在只調整位置時使用;
這樣,當需要重新設定某控制項位置時,可採用:
cwnd*pwnd;//視窗指標,用於指向控制項
pwnd=getdlgitem(idc_edit1);//獲取控制項指標,idc_edit1為控制項id號
pwnd->setwindowpos(null,x,y,0,0,swp_nozorder|swp_nosize);//把控制項移到視窗的(x,y)處,大小不變
當需要重新設定某控制項大小時,可採用:
pwnd=getdlgitem(idc_edit1);
pwnd->setwindowpos(null,0,0,cx,cy,swp_nozorder|swp_nomove);//把控制項的大小改為(cx,cy),位置不變
當採用:
pwnd=getdlgitem(idc_edit1);
pwnd->setwindowpos(null,x,y,cx,cy,swp_nozorder);
則控制項的大小和位置都會改變。
我製作了乙個基於對話方塊的示例程式,在對話方塊中,我放置了乙個編輯控制項(idc_edit1)作為工作區,四個按鈕控制項放在編輯控制項四周(如圖1),按鈕採用了自畫的cpluckbutton按鈕。按鈕的位置是通過計算設定的,所以在放置時只需把大小調集成適,位置可以隨意放置。在編輯控制項周圍畫了乙個深顏色的圓角矩形背景把編輯控制項與按鈕整合在一起。當單擊按鈕控制項時,我用上述方法調整編輯控制項的大小和位置,同時調整按鈕的位置並重畫背景,這樣工作區就得到調整。
在程式中,我設定了一組常量表示當前工作區的狀態:
#definews_normal0
#definews_left1
#definews_left_up2
#definews_left_up_right3
#definews_left_up_right_down4
#definews_left_down5
#definews_left_right_down6
#definews_left_up_down7
#definews_left_right8
#definews_up9
#definews_up_right10
#definews_up_right_down11
#definews_up_down12
#definews_right13
#definews_right_down14
#definews_down15
ws_normal表示工作區為最初的正常狀態(如圖1),ws_left表示工作區向左伸展,其餘類推。(例如圖2的工作區狀態為ws_up_right)。
另外,我定義了乙個crect陣列m_rect[16],存放編輯控制項在不同狀態下的位置,用乙個變數m_start表示工作區的當前狀態。陣列值在初始化函式oninitdialog()中計算出來:
boolcpluckboxdlg::oninitdialog()
voidcpluckboxdlg::onpaint()
其中drawworkings()函式為:
voidcpluckboxdlg::drawworkings(cpaintdc*pdc)
onpaint()函式在初建對話方塊和用invalidate()函式重新整理對話方塊時自動執行,所以在單擊按鈕時,先根據當前狀態調整出新狀態,再重繪對話方塊即可。
以下為按鈕的單擊響應函式:
//單擊下邊按鈕
voidcpluckboxdlg::onbuttondown()
invalidate();//重繪對話方塊
}//單擊左邊按鈕
voidcpluckboxdlg::onbuttonleft()
invalidate();
}//單擊右邊按鈕
voidcpluckboxdlg::onbuttonright()
invalidate();
}//單擊上邊按鈕
voidcpluckboxdlg::onbuttonup()
invalidate();
}完整**參見示例程式。
本文所用mfc函式速查:
cbrush::createsolidbrush
cdc::roundrect
cdc::selectobject
crect::setrect
cwnd::getclientrect
cwnd::getdlgitem
cwnd::getwindowrect
cwnd::invalidate
cwnd::screentoclient
cwnd::setwindowpos
MFC單文件調整客戶區大小
基於mfc單文件的工程 有時候經常要調整 修改 固定 動態 客戶區大小 比如載入自動調整客戶區大小為的大小.看起來這個很簡單,好像一句movewindow就可以搞定單文件檢視的客戶區.其實裡面有很多機關.首先我們第一想到的是在檢視中調整大小.比如調整為500 500 int cchildview o...
C 獲取螢幕工作區大小
做winform或wpf程式時,有時需要獲取當前系統螢幕的大小 含工作列或不含工作列 具體方法如下 1.引入system.windows.forms命名空間 2.獲取含工作列的螢幕大小 var h screen.primaryscreen.bounds.height var w screen.pri...
如何調整視窗以適應客戶區大小
以下黑色字型部分為 假設我們用createwindow 0,0,w,h,建立乙個視窗,我們將獲得乙個w x h大小的視窗,通常我們需要的是客戶區大小為w x h,如何做呢?乙個方法是呼叫api函式setwindowpos,通常我們需要提供3個引數 視窗控制代碼hwnd,視窗寬度w,視窗高度h。下面是...