?? visual c++ mfc +=+
字號(hào):
第三部分:MFC樣式
控制是用來(lái)建立Windows應(yīng)用程序用戶界面的用戶界面對(duì)象。你所見(jiàn)到的大部分Windows應(yīng)用程序和對(duì)話框只不過(guò)是由一些控制所組成的、用來(lái)實(shí)現(xiàn)程序功能的東西。為了建立有效的應(yīng)用程序,你必須完全理解在Windows應(yīng)用程序中應(yīng)該如何合理的使用控制。有六個(gè)基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。另外,Windows 95又增加了15增強(qiáng)了的控制。你需要理解的是那個(gè)控制能做些什么、你應(yīng)該如何控制它的外表和行為以及如何讓控制能響應(yīng)用戶事件。只要掌握了這些,再加上掌握了菜單和對(duì)話框,你就可以建立你所想象的任何Windows應(yīng)用程序。你可以象本教程這樣用程序代碼來(lái)建立控制,也可以使用資源編輯器通過(guò)資源文件來(lái)建立。當(dāng)然,對(duì)話框編輯器更方便些,它對(duì)于已經(jīng)基本掌握了控制的情況下特別有用。
最簡(jiǎn)單的控制是CStatic, 它是用來(lái)顯示靜態(tài)文本的。CStatic類(lèi)沒(méi)有任何數(shù)據(jù)成員,它只有少量的成員函數(shù):構(gòu)造函數(shù)、Create函數(shù)(用于獲取和設(shè)置靜態(tài)控制上的圖標(biāo))等等。它不響應(yīng)用戶事件。因?yàn)樗暮?jiǎn)單性,所以最好把它作為學(xué)習(xí)Windows控制的開(kāi)端。
在本講中,我們從CStatic著手,看一下如何修改和定制控制。在下一講中,我們將學(xué)習(xí)CButton和CScrollBar類(lèi),以理解事件處理的概念。一旦你理解和掌握了所有控制極其類(lèi),你就可以建立完整的應(yīng)用程序了。
基 礎(chǔ)
MFC中的CStatic類(lèi)是用來(lái)顯示靜態(tài)文本信息的。這些信息能夠可以作為純信息(例如,顯示在信息對(duì)話框中的錯(cuò)誤消息), 或作為小的標(biāo)簽等。在Windows應(yīng)用程序的文件打開(kāi)對(duì)話框中,你會(huì)發(fā)現(xiàn)有六個(gè)這樣的標(biāo)簽。
CStatic控制還有幾種其它的顯示格式。你可以通過(guò)修改標(biāo)簽的樣式來(lái)使它表現(xiàn)為矩形、邊框或圖標(biāo)等。
CStatic控制總是作為子窗口的形式出現(xiàn)的。典型情況下,其父窗口是應(yīng)用程序的主窗口或?qū)υ捒颉U缟弦恢v所介紹的,你用兩行代碼就可以建立一個(gè)靜態(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來(lái)為CStatic類(lèi)的事例分配內(nèi)存,然后調(diào)用類(lèi)的構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來(lái)完成類(lèi)所需要的初始化功能的。Create函數(shù)建立控制并把它放到屏幕上。
Create函數(shù)有五個(gè)參數(shù):
lpszText: 指定了要顯示的文本。
rect: 控制文本區(qū)域的位置、大小和形狀。
pParentWnd: 指明CStatic控制的父窗口。該控制會(huì)出現(xiàn)在其父窗口中,且其位置是相對(duì)于其父窗口的用戶區(qū)域而言的。
nID: 整數(shù)值,表示該控制的標(biāo)識(shí)符。
dwStyle: 最重要的參數(shù)。它控制著控制的外觀和行為。
CStatic樣式
所有的控制都有各種顯示樣式。樣式是在用Create函數(shù)建立控制時(shí)傳遞給它的dwStyle參數(shù)所決定的。對(duì)CStatic有效的樣式簡(jiǎn)介如下:
從CWnd繼承來(lái)的樣式:
* WS_CHILD CStatic所必須的。
* WS_VISIBLE 表示該控制對(duì)用戶應(yīng)該是可見(jiàn)的。
* 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 控制以圖標(biāo)形式顯示。文本作為圖標(biāo)在資源文件的名稱。rect參數(shù)只控制位置。
* SS_LEFT 文本居左顯示。文字可回繞。
* SS_LEFTNOWORDWRAP 文本居左顯示。多余的文字被剪裁。
* SS_NOPREFIX 表示字符串中的"&"字符不表示為加速前綴。
* SS_RIGHT 文本居右顯示。文字可回繞。
* SS_SIMPLE 只簡(jiǎn)單的顯示一行文本。任何CTLCOLOR信息都被其父窗口忽略。
* SS_USERITEM 用戶定義項(xiàng)。
* SS_WHITEFRAME 控制以矩形邊框方式顯示。顏色與當(dāng)前窗口背景顏色相同。
* SS_WHITERECT 控制以填充矩形方式顯示。顏色與當(dāng)前窗口背景顏色相同。
這些常數(shù)中,“SS”(Static Style)開(kāi)頭的表示只能用于CStatic控制。以“WS”(Window Style)開(kāi)頭的常數(shù)表示可適用于所有窗口,它們定義在CWnd對(duì)象中。CWnd中還有很多以“WS”樣式常數(shù)。你可以在MFC文檔中的CWnd::Create函數(shù)中找到它們。上面的四種是只用于CStatic對(duì)象的。
CStatic對(duì)象至少要帶有兩個(gè)樣式:WS_CHILD和WS_VISIBLE。該控制必須作為另一窗口的子窗口來(lái)建立。如果不使用WS_VISIBLE,則所建立的控制是看不見(jiàn)的。WS_DISABLED控制著標(biāo)簽對(duì)事件的響應(yīng),因?yàn)镃Static不接收鍵盤(pán)或鼠標(biāo)事件,所以使用該項(xiàng)是多余的。
所有的其它樣式選項(xiàng)都是可選的,它們控制著標(biāo)簽的外觀。在CStatic::Create函數(shù)中使用這些控制,可以控制CStatic在屏幕上的顯示。
CStatic文本的外觀
下面的代碼對(duì)于理解CStatic是有幫助的。它與上一講中介紹的代碼類(lèi)似,但是修改了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ù)加上了行編號(hào):
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對(duì)象的Create函數(shù),因?yàn)镃TestWindow從CFrameWnd繼承了其行為。所以第一行中的代碼指定了窗口大小應(yīng)該為200×200個(gè)象素,窗口的左上角被初始化在屏幕的0,0位置處。常數(shù)rectDefault可用CRect參數(shù)來(lái)替代。
在第2行,調(diào)用了CTestWindow::GetClientRect,向它傳遞了&r參數(shù)。GetClientRect函數(shù)是從CWnd類(lèi)繼承來(lái)的。變量r是CRect類(lèi)型的,并且在函數(shù)的開(kāi)頭部分被說(shuō)明為局部變量。
理解這段代碼時(shí)可能會(huì)有兩個(gè)問(wèn)題 1) GetClientRect函數(shù)是干什么的? 2) CRect變量是干什么的? 讓我們先回答第一個(gè)問(wèn)題。當(dāng)你查看MFC文檔中的CWnd::GetClientRect函數(shù)時(shí),你會(huì)發(fā)現(xiàn)它返回一CRect類(lèi)型,它包含了指定窗口的用戶區(qū)域矩形。它保存的是參數(shù)的地址&r。該地址指向CRect的位置。CRect類(lèi)型是在MFC中定義的。用它處理矩形是非常方便的。如果你看以下MFC文檔,就會(huì)看到其中定義了30多種處理矩形的成員函數(shù)和操作符。
在我們的情況下,我們要在窗口中間顯示“Hello World”。因此,我們用GetClientRect來(lái)獲取用戶區(qū)域的矩形坐標(biāo)。在第3行中調(diào)用了CRect::InflateRect,同時(shí)還可以增大或減少了矩形的尺寸(參見(jiàn)CRect::DeflateRect)。這里我們對(duì)矩形的各邊減少了20個(gè)象素。如果不這樣的話,標(biāo)簽周?chē)吔缇蜁?huì)超出窗口框架。
實(shí)際上,CStatic是在第4和5行建立的。樣式屬性為居中并有邊框。其大小和位置由CRect參數(shù)r確定的。
通過(guò)修改不同的樣式屬性,你可以理解CStatic的不同形式。例如,下面的代碼包含有對(duì)CTestWindow構(gòu)造函數(shù)進(jìn)行了修改,所產(chǎn)生的控制有個(gè)位移:
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);
}
上面的代碼除了所顯示的文本比較長(zhǎng)外沒(méi)有什么不同。運(yùn)行該代碼你就可以看到,CStatic在指定的區(qū)域內(nèi)的文本已經(jīng)回繞了,且沒(méi)一行都是居中的。
如果邊框矩形太小不能包含所有的文本行,則文本會(huì)被剪切以適應(yīng)之。你減小矩形大小或增大字符串長(zhǎng)度就可以看到CStatic的該特性。
在我們所看到的所有代碼中,樣式SS_CENTER是用來(lái)居中文本的。CStatic也允許左對(duì)齊或右對(duì)齊。左對(duì)齊是用SS_LEFT來(lái)替代SS_CENTER屬性。同樣,右對(duì)齊是用SS_RIGHT來(lái)取代之。
SS_LEFTNOWORDWRAP屬性是用來(lái)關(guān)閉文本回繞的。它會(huì)強(qiáng)迫使用左對(duì)齊屬性。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -