?? visual c++ mfc 簡明教程.doc
字號:
控制是用來建立Windows應(yīng)用程序用戶界面的用戶界面對象。你所見到的大部分Windows應(yīng)用程序和對話框只不過是由一些控制所組成的、用來實現(xiàn)程序功能的東西。為了建立有效的應(yīng)用程序,你必須完全理解在Windows應(yīng)用程序中應(yīng)該如何合理的使用控制。有六個基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增強了的控制。你需要理解的是那個控制能做些什么、你應(yīng)該如何控制它的外表和行為以及如何讓控制能響應(yīng)用戶事件。只要掌握了這些,再加上掌握了菜單和對話框,你就可以建立你所想象的任何Windows應(yīng)用程序。你可以象本教程這樣用程序代碼來建立控制,也可以使用資源編輯器通過資源文件來建立。當(dāng)然,對話框編輯器更方便些,它對于已經(jīng)基本掌握了控制的情況下特別有用。
最簡單的控制是CStatic, 它是用來顯示靜態(tài)文本的。CStatic類沒有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)(用于獲取和設(shè)置靜態(tài)控制上的圖標)等等。它不響應(yīng)用戶事件。因為它的簡單性,所以最好把它作為學(xué)習(xí)Windows控制的開端。
在本講中,我們從CStatic著手,看一下如何修改和定制控制。在下一講中,我們將學(xué)習(xí)CButton和CScrollBar類,以理解事件處理的概念。一旦你理解和掌握了所有控制極其類,你就可以建立完整的應(yīng)用程序了。
基 礎(chǔ)
MFC中的CStatic類是用來顯示靜態(tài)文本信息的。這些信息能夠可以作為純信息(例如,顯示在信息對話框中的錯誤消息), 或作為小的標簽等。在Windows應(yīng)用程序的文件打開對話框中,你會發(fā)現(xiàn)有六個這樣的標簽。
CStatic控制還有幾種其它的顯示格式。你可以通過修改標簽的樣式來使它表現(xiàn)為矩形、邊框或圖標等。
CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應(yīng)用程序的主窗口或?qū)υ捒颉U缟弦恢v所介紹的,你用兩行代碼就可以建立一個靜態(tài)控制:
CStatic *cs;
...
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|SS_CENTER,
CRect(50,80, 150, 150),
this);
這兩行代碼是典型的MFC建立所有控制的代碼。調(diào)用new來為CStatic類的事例分配內(nèi)存,然后調(diào)用類的構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來完成類所需要的初始化功能的。Create函數(shù)建立控制并把它放到屏幕上。
Create函數(shù)有五個參數(shù):
lpszText: 指定了要顯示的文本。
rect: 控制文本區(qū)域的位置、大小和形狀。
pParentWnd: 指明CStatic控制的父窗口。該控制會出現(xiàn)在其父窗口中,且其位置是相對于其父窗口的用戶區(qū)域而言的。
nID: 整數(shù)值,表示該控制的標識符。
dwStyle: 最重要的參數(shù)。它控制著控制的外觀和行為。
CStatic樣式
所有的控制都有各種顯示樣式。樣式是在用Create函數(shù)建立控制時傳遞給它的dwStyle參數(shù)所決定的。對CStatic有效的樣式簡介如下:
從CWnd繼承來的樣式:
WS_CHILD CStatic所必須的。
WS_VISIBLE 表示該控制對用戶應(yīng)該是可見的。
WS_DISABLED 表示該控制拒絕接受用戶事件。
WS_BORDER 控制的文本區(qū)域帶有邊框。
CStatic固有的樣式:
SS_BLACKFRAME 該控制區(qū)域以矩形邊界顯示。顏色與窗口框架相同。
SS_BLACKRECT ? 該控制以填充的矩形顯示。顏色與當(dāng)前的窗口框架相同。
SS_CENTER 文本居中。
SS_GRAYFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前桌面相同。
SS_GRAYRECT 該控制以填充的矩形顯示。顏色與當(dāng)前的桌面相同。
SS_ICON 控制以圖標形式顯示。文本作為圖標在資源文件的名稱。rect參數(shù)只控制位置。
SS_LEFT 文本居左顯示。文字可回繞。
SS_LEFTNOWORDWRAP 文本居左顯示。多余的文字被剪裁。
SS_NOPREFIX 表示字符串中的"&"字符不表示為加速前綴。
SS_RIGHT 文本居右顯示。文字可回繞。
SS_SIMPLE 只簡單的顯示一行文本。任何CTLCOLOR信息都被其父窗口忽略。
SS_USERITEM 用戶定義項。
SS_WHITEFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前窗口背景顏色相同。
SS_WHITERECT 控制以填充矩形方式顯示。顏色與當(dāng)前窗口背景顏色相同。
這些常數(shù)中,“SS”(Static Style)開頭的表示只能用于CStatic控制。以“WS”(Window Style)開頭的常數(shù)表示可適用于所有窗口,它們定義在CWnd對象中。CWnd中還有很多以“WS”樣式常數(shù)。你可以在MFC文檔中的CWnd::Create函數(shù)中找到它們。上面的四種是只用于CStatic對象的。
CStatic對象至少要帶有兩個樣式:WS_CHILD和WS_VISIBLE。該控制必須作為另一窗口的子窗口來建立。如果不使用WS_VISIBLE,則所建立的控制是看不見的。WS_DISABLED控制著標簽對事件的響應(yīng),因為CStatic不接收鍵盤或鼠標事件,所以使用該項是多余的。
所有的其它樣式選項都是可選的,它們控制著標簽的外觀。在CStatic::Create函數(shù)中使用這些控制,可以控制CStatic在屏幕上的顯示。
CStatic文本的外觀
下面的代碼對于理解CStatic是有幫助的。它與上一講中介紹的代碼類似,但是修改了CStatic的建立部分。
//static1.cpp
#include <afxwin.h>
// Declare the application class
class CTestApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
// Create an instance of the application class
CTestApp TestApp;
// Declare the main window class
class CTestWindow : public CFrameWnd
{
CStatic* cs;
public:
CTestWindow();
};
// The InitInstance function is called
// once when the application first executes
BOOL CTestApp::InitInstance()
{
m_pMainWnd = new CTestWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// The constructor for the window class
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
GetClientRect(&r);
r.InflateRect(-20,-20);
// Create a static label
cs = new CStatic();
cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
下面是窗口構(gòu)造函數(shù)加上了行編號:
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
1 Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
2 GetClientRect(&r);
3 r.InflateRect(-20,-20);
// Create a static label
4 cs = new CStatic();
5 cs->Create("hello world",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
首先在單擊1行中調(diào)用CTestWindow::Create函數(shù)。它是CFrameWnd對象的Create函數(shù),因為CTestWindow從CFrameWnd繼承了其行為。所以第一行中的代碼指定了窗口大小應(yīng)該為200×200個象素,窗口的左上角被初始化在屏幕的0,0位置處。常數(shù)rectDefault可用CRect參數(shù)來替代。
在第2行,調(diào)用了CTestWindow::GetClientRect,向它傳遞了&r參數(shù)。GetClientRect函數(shù)是從CWnd類繼承來的。變量r是CRect類型的,并且在函數(shù)的開頭部分被說明為局部變量。
理解這段代碼時可能會有兩個問題 1) GetClientRect函數(shù)是干什么的? 2) CRect變量是干什么的? 讓我們先回答第一個問題。當(dāng)你查看MFC文檔中的CWnd::GetClientRect函數(shù)時,你會發(fā)現(xiàn)它返回一CRect類型,它包含了指定窗口的用戶區(qū)域矩形。它保存的是參數(shù)的地址&r。該地址指向CRect的位置。CRect類型是在MFC中定義的。用它處理矩形是非常方便的。如果你看以下MFC文檔,就會看到其中定義了30多種處理矩形的成員函數(shù)和操作符。
在我們的情況下,我們要在窗口中間顯示“Hello World”。因此,我們用GetClientRect來獲取用戶區(qū)域的矩形坐標。在第3行中調(diào)用了CRect::InflateRect,同時還可以增大或減少了矩形的尺寸(參見CRect::DeflateRect)。這里我們對矩形的各邊減少了20個象素。如果不這樣的話,標簽周圍邊界就會超出窗口框架。
實際上,CStatic是在第4和5行建立的。樣式屬性為居中并有邊框。其大小和位置由CRect參數(shù)r確定的。
通過修改不同的樣式屬性,你可以理解CStatic的不同形式。例如,下面的代碼包含有對CTestWindow構(gòu)造函數(shù)進行了修改,所產(chǎn)生的控制有個位移:
CTestWindow::CTestWindow()
{
CRect r;
// Create the window itself
Create(NULL,
"CStatic Tests",
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));
// Get the size of the client rectangle
GetClientRect(&r);
r.InflateRect(-20,-20);
// Create a static label
cs = new CStatic();
cs->Create("Now is the time for all good men to \
come to the aid of their country",
WS_CHILD|WS_VISIBLE|WS_BORDER|SS_CENTER,
r,
this);
}
上面的代碼除了所顯示的文本比較長外沒有什么不同。運行該代碼你就可以看到,CStatic在指定的區(qū)域內(nèi)的文本已經(jīng)回繞了,且沒一行都是居中的。
如果邊框矩形太小不能包含所有的文本行,則文本會被剪切以適應(yīng)之。你減小矩形大小或增大字符串長度就可以看到CStatic的該特性。
在我們所看到的所有代碼中,樣式SS_CENTER是用來居中文本的。CStatic也允許左對齊或右對齊。左對齊是用SS_LEFT來替代SS_CENTER屬性。同樣,右對齊是用SS_RIGHT來取代之。
SS_LEFTNOWORDWRAP屬性是用來關(guān)閉文本回繞的。它會強迫使用左對齊屬性。
CStatic的矩形顯示模式
CStatic也支持兩種不同的矩形顯示模式:填充矩形和框架。通常用這兩種模式來把一組控制框在一起。例如,你可以把黑背景框架窗口作為一組編輯框的背景。你可以選擇六種不同的樣式: SS_BLACKFRAME、SS_BLACKRECT、SS_GRAYFRAME、SS_GRAYRECT、SS_WHITEFRAME和SS_WHITERECT。RECT形成了一個填充的矩形,而FRAME組成一邊框。其中的顏色標志,如SS_WHITERECT表示其顏色與窗口背景的顏色是相同的。盡管該顏色的缺省值是白色,但你可以使用控制面板來改變,此時矩形的顏色可能就不是白色的了。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -