程序作者:zhoujiamurong 個人郵箱:[email protected]
作者保留作品的所有權利,如需轉載請聯系作者。
簡介
上幾章我們完成了一個程序的窗體,響應消息和菜單資源,我們來為我們的程序添加一點有用的東西。工具條和狀態欄。
正文
這幾天我比較忙,我要去西安再就業,我公司也很多事,不過看到大家的評論,我很高興,我會堅持寫下去。(聲明一下:有網友發信過來問問題,我只能盡量回復,我的個人精力有限,請大家諒解)到目前為止,可能大家還在納悶,我為什麼不講一下向導,我在這裡強調一下,請大家先不要碰向導,看完了手寫的MFC之後,再學向導才比較好,因為向導不是給初學者用的。如同大家如果精通SDK編程,那我講的都是廢話,你看一下就會了,如同匯編高手學習C語言,看一下語法就可以了。這裡強調一下基礎的作用,關於SDK網友很關心,因為有些朋友沒有學習過這方面的內容,我現在沒有時間寫這方面的文章,不過大家可以看一下《Windows程序設計》。下面我們來看一下今天要學的內容,上幾章我們完成了一個程序的窗體,響應消息和菜單資源,我們來為我們的程序添加一點有用的東西。工具條和狀態欄。
在這裡要用要用到兩個類工具條類CToolBar和狀態欄類CstatusBar,關於類這一塊我不講了,大家自己看C++的書,用法一樣,不過VC++的MFC裡面不是標准的C++,有過程和類混合在一起。
首先,講一下工具條,它是一個條型的窗體,為什麼這麼說呢?我們看一下CToolBar類,我們打開一個MFC的工程,在工具主菜單裡有一個子菜單—來源浏覽器,點擊他,彈出一個對話框,如果是英文版用快捷鍵Alt+F12.在對話框中輸入CtoolBar,在下面的列表框中選擇Base
Class And Members(基類和成員),點擊確定.彈出一個窗體,在左邊的樹行控件中,我們把他的基類全部點開.如下圖:
我們可以看到他是繼承於CWnd這個類的,而CWnd這個類就是窗體類,也就是說工具條類的爺爺就是窗體,所以我們說他就是一個窗體類型的東東.其實,我們大部分用的類都是窗體,可以這麼說,在VC中萬事萬物皆窗體,我們在看一下狀態欄,他的祖先也就是基類是什麼:
我們看到他們是同宗同源的。我們了解了這個類,我們知道在一個類實例化之前,她是沒有任何作用的,所以我們要定義和實例化這兩個類。我們繼續上次的程序。在裡面加這兩個類的定義和實例化。
#include <afxwin.h>
#include <afxext.h>//MFC擴展類的頭文件,也就是類的定義
#include "resource.h"
class sample:public CFrameWnd
{
public:
CToolBar t;//實例化工具條類
CStatusBar s;//實例化狀態條類
sample()
{
Create(NULL,"MFC Window",WS_OVERLAPPEDWINDOW,rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1),0,NULL);
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
void OnLButtonDown(UINT,CPoint)//添加的消息處理函數
{
::MessageBox(NULL,"ddd","dd",MB_OK);
}
DECLARE_MESSAGE_MAP()//消息映射的申明
};
BEGIN_MESSAGE_MAP(sample,CFrameWnd)
//這個宏填寫兩個參數,一個子類,一個父類
ON_WM_LBUTTONDOWN()//左鍵按下的事件
END_MESSAGE_MAP()//結束宏
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
BOOL App::ExitInstance()
{
MessageBox(0,"My Window","ExitInstance",MB_OK|MB_ICONHAND);
return TRUE;
}
App a;
添加了三句話,我們運行一下,發現並沒有效果。其實,在實例化後,我們僅僅是可以使用這兩個類了,我們還要調用這兩個類的方法才行。在調用之前,我們在講一下理論知識.
工具條:一個條形的窗體,裡面有很多的按鈕,而且每個按鈕對應一個圖片。也就是說我們在創建一個工具條時要有按鈕,圖片准備好,在VC中一個工具條只有一個條形的圖片,它負責提供所有的按鈕圖片,這個條形的圖片被切割成大小為15*16的一個一個的小圖片,給對應的按鈕。我們首先要創建一個工具條窗體(Create方法),然後加載一個的位圖(使用LoadBitmap方法),還要創建幾個按鈕(使用SetButtons方法),圖片和按鈕的關聯是自動的。
狀態條:一個條形的窗體,裡面有很多的窗格,就是格子,我們要創建一個窗體(Create方法),在窗體上創建很多窗格(SetIndicators方法).
下面問題來了,VC的困惑不光在如何寫代碼,更多的時候不知道寫在哪裡。這樣的原因是因為我們沒有了解MFC的流程,不過我們可以想象一下,主窗體沒有建的時候,我們不可以建工具條和狀態條,皮之不存,毛將焉附?也就是在主窗體建成後,我們再建工具條和狀態條。所以,我們在OnCreateClient這個方法裡面寫,不過要注意這個函數是框架的一部分,不要試圖去調用它,她是在創建窗體時框架自動調用的。
#include <afxwin.h>
#include <afxext.h>//MFC擴展類的頭文件,也就是類的定義
#include "resource.h"
class sample:public CFrameWnd
{
public:
CToolBar t;//實例化工具條類
CStatusBar s;//實例化狀態條類
sample()
{
Create(NULL,"MFC Window",WS_OVERLAPPEDWINDOW,rectDefault,NULL,MAKEINTRESOURCE(IDR_MENU1),0,NULL);
MessageBox("My MFC Window","CFrame constructor",MB_OK);
}
void OnLButtonDown(UINT,CPoint)//添加的消息處理函數
{
::MessageBox(NULL,"ddd","dd",MB_OK);
}
BOOL OnCreateClient(CREATESTRUCT *c,CCreateContext *p)
{
UINT tool[]={
ID_DISPLAY_UP,ID_DISPLAY_DOWN,ID_DISPLAY_LEFT,ID_DISPLAY_RIGHT};
UINT stat[]={0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS};
//工具條創建
t.Create(this,WS_VISIBLE|WS_CHILD|CBRS_TOP|CBRS_FLYBY);
//工具條加載圖片
t.LoadBitmap(IDB_BITMAP1);
//設置按鈕
t.SetButtons(tool,4);
//狀態條創建
s.Create(this);
//狀態條設置窗格
s.SetIndicators(stat,3);
return TRUE;
}
DECLARE_MESSAGE_MAP()//消息映射的申明
};
BEGIN_MESSAGE_MAP(sample,CFrameWnd)
//這個宏填寫兩個參數,一個子類,一個父類
ON_WM_LBUTTONDOWN()//左鍵按下的事件
END_MESSAGE_MAP()//結束宏
class App:public CWinApp
{
public:
BOOL InitInstance();
BOOL ExitInstance();
};
BOOL App::InitInstance()
{
MessageBox(0,"My MFC Window","InitInstance",MB_OK|MB_ICONASTERISK);
sample *obj;
obj=new sample;
m_pMainWnd=obj;
obj->ShowWindow(SW_SHOWMAXIMIZED);
return TRUE;
}
BOOL App::ExitInstance()
{
MessageBox(0,"My Window","ExitInstance",MB_OK|MB_ICONHAND);
return TRUE;
}
App a;
UINT tool[]={
ID_DISPLAY_UP,ID_DISPLAY_DOWN,ID_DISPLAY_LEFT,ID_DISPLAY_RIGHT};
UINT stat[]={0,ID_INDICATOR_NUM,ID_INDICATOR_CAPS};