MFC視窗分割以及各視窗間的通訊

2022-07-17 12:24:11 字數 4324 閱讀 9563

乙個偶然的機會又重新接觸了mfc視窗的分割,自己結合資料重新寫了乙個視窗分割的程式,現將具體流程跟大家分享一下:

1.我們先建立乙個mfc單文件類的程式,具體分割方式先將單文件整個客戶區分成兩行一列,首先我們在mfc的cmainframe類中定義乙個csplitterwnd類的對像m_wndsplitter,在主視窗類中我們可以通過物件m_wndsplitter,呼叫csplitterwnd類的所有成員函式,為了將視窗分割成兩行一列,我們在cmainframe類中過載oncreateclient函式,在oncreateclient函式中編寫**,我們現將視窗分割:

crect rect;

getclientrect(&rect); //產生第一次靜態分割

m_wndsplitter.createstatic(this, //父視窗指標

2,1); //行數與列數

將主視窗分割成兩行一列

然後將分割的視窗與乙個特定的類關聯起來。

m_wndsplitter.createview(0,0, //窗格的行列序數

runtime_class(cfengeview),//檢視類

csize(rect.width(),rect.height()-rect.height()/5),pcontext);//父視窗建立引數

m_wndsplitter.createview(1,0,runtime_class(cliftdown),

csize(rect.width(),rect.height()/5),pcontext); //給分割的視窗關聯上對於的類

//不在呼叫基類的oncreateclient函式

return true;

這裡分割開的兩個視窗乙個關聯基礎視類,另乙個因為我們要用作一些資訊的顯示用,我們建立乙個新類,這個新類的基礎類是ceditview,完成後要注意標頭檔案也要關聯上,否則cmainframe 不認識新建立的類。執行一下如果報以下錯誤:

error c2143: syntax error : missing ';' before '*'

error c2501: 'cfengedoc' : missing storage-class or type specifiers

error c2501: 'getdocument' : missing storage-class or type specifiers

我們在視類的標頭檔案的開頭新增#include "fengedoc.h"即可,再次執行

ok接下來我們要在這個基礎上再次進行分割,將第一行分割成兩列,第一行的第一列我們要求它有輸入功能主要是資訊的錄入,以及按鈕的新增,第一行的第二列我們要求它一列表的形式顯示

我們新增錄入的資訊。為了完成以上功能我們首先新增乙個對話方塊資源,給這個對話方塊資源關聯上乙個新類,新類的基礎類是 cformview,同時為了能以乙個類表的形式顯示錄入的信心我們還有新增乙個新的類,這個類的基礎類是clistview,好了類新增完成我們要在第一次分割的基礎上再次分割,這次分割的流程和第一次的思路是一樣的,但要注意幾點不同:1.我們要在基礎視類中新增乙個csplitterwnd類的對像m_wndsplitter1,2.直接在基礎視類中過載oncreate函式中新增分割**具體**如下:

getclientrect(&rect); //  獲得視窗的建立資訊指標

ccreatecontext *pcontext=(ccreatecontext *)lpcreatestruct->lpcreateparams;

m_wndsplitter1.createstatic(this,1,2); //產生第二次的靜態分割

//為第乙個窗格產生檢視

m_wndsplitter1.createview(0,0,//視窗的行列序數

runtime_class(cliftup),//檢視類

csize(rect.width()/4,rect.height()),//

pcontext);

//為第二個窗格產生檢視

m_wndsplitter1.createview(0,1,runtime_class(crightup),csize(1,1),pcontext);

return 0;

同時在主視類中新增onsize函式並在函式中新增**:

cview::onsize(ntype, cx, cy);

crect rect;

getclientrect(&rect);

int x=rect.width();

int y=rect.height();

m_wndsplitter1.movewindow(-2,-2,x,y+3);

m_wndsplitter1.setcolumninfo(0,x/4,0); //左邊窗格位置

m_wndsplitter1.setcolumninfo(1,x-x/4,0); //右邊窗格位置

m_wndsplitter1.recalclayout();

除了要新增上識別標頭檔案外,還要注意當程式報錯說找不到clistview類時我們在新建的crightup類的標頭檔案中新增# include 。給對話方塊中的按鈕新增乙個訊息響應函式,訊息響應函式就在對話方塊所關聯的類下即cliftup類。為了將我們在對話方塊中錄入的資訊顯示出來,要先建立乙個陣列用來存放這些資訊,這裡我們在cfengedoc類中建立乙個cstringarray型別的數字infoarray[4],同時定義乙個bool型別的變數add;注意一定要在建構函式中給add初始化要不然會報錯的,接下來給對話方塊的四個編輯框關聯上四個cstring型別的變數。分別是m_num,m_name,m_zhuanye,m_home.

下邊我們要做的是把幾塊兒檢視區聯絡起來,首先在cliftup類下的按鈕響應函式中填寫一下**:

updatedata(true);

if(m_num.isempty()||m_name.isempty())

afxmessagebox("填寫不能為空");

return 1;

cfengedoc*pdoc=((cfengedoc*)getdocument();

pdoc->infoarray[0].insertat(0,m_num);

pdoc->infoarray[1].insertat(0,m_name);

pdoc->infoarray[2].insertat(0,m_zhuanye);

pdoc->infoarray[3].insetat(0,m_home);

pdoc->add=true; //新增了資料

pdoc->updateallviews(null); //更新所有檢視

m_num=_t("");

m_name=_t("");

m_zhuanye=_t("");

m_home=_t("");

updatedata(false); //各控制項的內容清空

接下來在cliftdown類中過載oninitialupdate() 函式,在函式中新增**:

cedit &medit=geteditctrl(); //獲取編輯檢視的控制項

medit.setwindowtext("等待使用者輸入學生的資訊!");//設定顯示資訊

medit.enablewindow(false); //編輯控制項不可編輯

再次在cliftdown類中過載另乙個函式onupdate,在函式中新增**:

cfengedoc* pdoc=(cfengedoc*)getdocument(); // 獲取文件指標

if(pdoc->add) // 新增了資料

; //表頭字段

clistctrl& listctrl=getlistctrl();//獲取列表的控制項

dword dwstyle = listctrl.getextendedstyle();

dwstyle |= lvs_ex_fullrowselect;

// 選中某行使整行高亮(只適用與report風格的listctrl)

dwstyle |= lvs_ex_gridlines;

dwstyle |=lvs_ex_underlinehot;

listctrl.setextendedstyle(dwstyle);//列表風格

int width[6]=;

for(int i=0;i<4;i++) }

ok現在執行一下:

MFC 視窗分割

動態分割視窗 bool cmainframe oncreateclient lpcreatestruct lpcs,ccreatecontext pcontext else return cframewnd oncreateclient lpcs,pcontext 靜態分割視窗 為mainframe...

MFC分割視窗總結

mfc提供了csplitterwnd類切分sdi程式的客戶區,步驟如下 1 建立sdi應用程式divwindow。2 為cmainframe新增兩個csplitterwnd型別的成員變數,如下所示 csplitterwndm wndsplittermain 主分隔條 csplitterwnd m w...

MFC單文件分割視窗

建立單文件程式 新建兩個對話方塊,用於分割視窗,對話方塊的style屬性改為child,border屬性改為none,最開始沒有改這個,程式執行的時候報錯了。將兩個對話方塊生成從cformview派生的類。在cmainframe中新增兩個成員變數,型別為csplitterwnd,如下所示 cspli...