程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> VC++ >> VC精華教程:MFC入門系列(四)

VC精華教程:MFC入門系列(四)

編輯:VC++

  程序作者: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};


  這是因為我們要使用工具條必須要知道,用戶到底點的是哪個按鈕,所以,我們用一個數組標識她們,這兩個數組裡面的宏,必須要有對應的資源。我看到我們的工具條都是灰色的,因為,我們沒有寫消息映射給他們,工具條也不可使用,必須要添加String Table才可以用。我們下次再講。
  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved