MFC單文件調整客戶區大小

2021-07-03 17:26:10 字數 1740 閱讀 5843

基於mfc單文件的工程:

有時候經常要調整(修改/

固定/動態)

客戶區大小

,比如載入自動調整客戶區大小為的大小.

看起來這個很簡單,好像一句movewindow就可以搞定單文件檢視的客戶區.

其實裡面有很多機關.

首先我們第一想到的是在檢視中調整大小.

比如調整為500*500:

int cchildview::oncreate(lpcreatestruct lpcreatestruct)

不過執行會發現沒有效果.

因為檢視是跟著框架(cmainframe)變的.

這也是單文件檢視的特色,框架決定檢視大小,檢視無法調整自己的大小.

所以我們只能來調整框架的大小了.

看**:

int cmainframe::oncreate(lpcreatestruct lpcreatestruct)

if (!m_wndstatusbar.create(this))

m_wndstatusbar.setindicators(indicators, sizeof(indicators)/sizeof(uint));

//往下就是我們要調整客戶區大小了

//1. 通知所有視窗,更新並獲取所有視窗的位置.

//因為前面把工具欄,狀態列,客戶區建立後,它們的位置還沒有定,所以需要recalclayout來

//排列所有視窗,把所有視窗的位置算出來

recalclayout();

//2. 計算框架和檢視視窗的位置大小,重新調整框架視窗使其適應客戶區大小

crect frm_rect,view_rect,view_client;

//獲取客戶區在桌面上的位置和大小,注意這裡的大小和位置包含了客戶區和客戶區的邊界(邊界寬度一般是2個畫素),是的,你沒有看錯,

//客戶區也有邊界,相信很多人不知道吧.你可以用spy++來驗證.

m_wndview.getwindowrect(&view_rect);

m_wndview.getclientrect(&view_client);//獲取客戶區的大小,注意這裡的大小不包含客戶區的邊界

getwindowrect(&frm_rect);//獲取框架在桌面上的位置和大小

csize sz;

sz.cx = 500;//注意:我們這裡的客戶區大小是不包含客戶區邊界的,因為邊界是不能畫東西的,所以對我們來講是無效區

sz.cy = 500;

//調整後的框架視窗長=框架左邊與檢視左邊的距離+框架右邊與檢視右邊的距離+檢視客戶區左右邊界的大小+檢視客戶區的寬

sz.cx += (view_rect.left – frm_rect.left)+(frm_rect.right – view_rect.right)+(view_rect.width() – view_client.width());

//調整後的框架視窗高=框架上邊與檢視上邊的距離+框架下邊與檢視下邊的距離+檢視客戶區上下邊界的大小+檢視客戶區的高

sz.cy+= (frm_rect.bottom – view_rect.bottom) +(view_rect.top-frm_rect.top)+(view_rect.height() – view_client.height());

//調整框架,注意只調整大小,不調整位置,

setwindowpos(null, 0, 0, sz.cx, sz.cy, swp_nomove);

return 0;

}

mfc在單文件客戶區新增控制項

mfc在單文件客戶區新增控制項 以新增編輯框為例 方法一 cedit pedit new cedit 這裡其實用cwind類即可 if pedit pedit createex ws ex clientedge,edit ws child ws visible es left,crect 100,1...

單文件客戶區新增控制項

操作全部在cview中完成 1.在標頭檔案中宣告變數 cbutton cb 在標頭檔案開頭處寫 define wm my message wm user 100 2.在ondraw cdc pdc 中對按鈕進行具體的設定 cb.create 確定 ws child ws visible bs def...

如何調整視窗以適應客戶區大小

以下黑色字型部分為 假設我們用createwindow 0,0,w,h,建立乙個視窗,我們將獲得乙個w x h大小的視窗,通常我們需要的是客戶區大小為w x h,如何做呢?乙個方法是呼叫api函式setwindowpos,通常我們需要提供3個引數 視窗控制代碼hwnd,視窗寬度w,視窗高度h。下面是...