案例1
響應視窗始終**輸出字元:
**如下
crect rectclient, recttitle;
int nwidth = 100;
int nheight = 40;
getclientrect(&rectclient); //得到當前客戶區的尺寸
recttitle.left = (rectclient.width()-nwidth)/2;
recttitle.top = (rectclient.height()-nheight)/2;
recttitle.right = recttitle.left+nwidth;
recttitle.bottom = recttitle.top+nheight; //根據客戶區尺寸計算矩形位置
pdc->rectangle(recttitle);
crect rectclient, recttitle;
pdc->textout(recttitle.left+10, recttitle.top+10, "hello, mfc!"); //輸出字串
知識點:
1.crect物件: 建立乙個矩形框變數,有左右上下四個屬性,起點座標為左上
2.getclientrect函式: 得到客戶區矩形的屬性
3.pdc指標:
void creview1view::ondraw(cdc* pdc)
指向cdc
物件的指標,用於在客戶區輸出
案例2
響應鍵盤按鍵和滑鼠按鍵:
**如下
void cmykeybuttonview::onkeydown(uint nchar, uint nrepcnt, uint nflags)
// todo: add your message handler code here and/or call default
cstring strdisplay;
strdisplay.format("使用者按下鍵
%c,鍵值
%d",nchar,nchar);
messagebox(strdisplay);
cview::onkeydown(nchar, nrepcnt, nflags);
void cmykeybuttonview::onlbuttondown(uint nflags, cpoint point)
// todo: add your message handler code here and/or call default
cstring strdisplay;
strdisplay.format("x=%d,y=%d",point.x,point.y);
messagebox(strdisplay);
cview::onlbuttondown(nflags, point);
知識點:
1.vc的
classwizard
功能:直接呼叫訊息響應函式
2.cstring字串型別:
format
函式初始化字串內容(可含變數)
%d:輸出數值
%c:輸出編碼
3.messagebox函式: 彈出乙個新的視窗,內容可以給定
4.onkeydown函式: 三個引數的意義:
nchar
是鍵值,
nrepcnt
是重複次數,
nflags
是訊息編號
5.onlbuttondown函式:
cpoint
物件point
的兩個屬性分別是x和
y座標6.invalidaterect函式: 如果程式是動態的視窗程式,必須呼叫這個函式來達到動態的視窗變化,否則視窗一直顯示的是初始化的
ondraw
視窗,並不能看到任何變化。
invalidaterect(rectclient,true);
呼叫函式重新整理
rectclient
矩形區域,
true
可預設該函式向指定的
窗體更新區域新增乙個矩形,然後視窗客戶區域的這一部分將被重新繪製。
bool invalidaterect(hwnd hwnd, const rect *lprect, bool berase);引數:hwnd:要更新的客戶區所在的
窗體的控制代碼。如果為null,則系統將在函式返回前重新繪製所有的視窗, 然後傳送
wm_erasebkgnd
和 wm_paint
給視窗過程處理函式。lprect:無效區域的矩形代表,它是乙個
結構體指標
,存放著矩形的大小。如果為null,全部的視窗客戶區域將被增加到更新區域中。berase:指出無效矩形被標記為有效後,是否重畫該區域,重畫時用預先定義好的畫刷。當指定true時需要重畫。返回值:函式成功則返回非零值,否則返回零值。說明:被標記為無效矩形的區域直到
wm_paint訊息
被處理完之後才會消失,或者使用validaterect(),validatergn()函式來使之有效。當
應用程式
的訊息佇列
中為空時,並且
窗體要更新的區域非空時,系統會傳送乙個wm_paint訊息到窗體。這兩個都用於宣告客戶區無效,當下乙個wm_paint訊息到來時發生重畫。其中invalidaterect(hwnd, null, true);重畫時將擦除背景。invalidaterect(hwnd, null, false);重畫時不擦除背景
crect rectclient, recttitle;
int nwidth = 100;
int nheight = 40;
getclientrect(&rectclient); //得到當前客戶區的尺寸
recttitle.left = (rectclient.width()-nwidth)/2;
recttitle.top = (rectclient.height()-nheight)/2;
recttitle.right = recttitle.left+nwidth;
recttitle.bottom = recttitle.top+nheight; //根據客戶區尺寸計算矩形位置
pdc->rectangle(recttitle);
MFC 學習筆記一
通過近段時間的mfc學習,對訊息機制有了更深入的理解,訊息鏈的建立,runtimeclass的理解中,對於類的組織鏈的精妙設計很嘆服,這些主要是在看mfc深入淺出的過程中體會到的,整個學習過程中,感覺記住mfc的類層次圖是非常重要和必需的。下面就對自己所學習的rtti 執行時期型別辨識 進行整理 首...
MFC學習筆記CDocTemplate 一
修改cdoctemplate可過濾的檔案型別 方法一 在建立工程的時候,第4步時選擇 高階.選項,在副檔名處填寫要過濾的副檔名。方法二 如果工程已經建立好了,那就需要手工修改,找到工程目錄,使用記事本開啟相應的rc檔案,然後找到如下字段 stringtable preload discardable...
MFC入門學習筆記(一)
最近看了一下mfc,隨手記錄下點東西,算是留著給自己偶爾看看吧 學習環境 vs2017 mfc小專案實戰 1.使用mfc平台新建文件時,可選基本對話方塊 單文件介面 多文件介面 多個頂層文件,一般選擇基本對話方塊或多文件mdi兩者就夠用了。2.檢視從mfc類cview派生。3.mfc提供了使文件與其...