筆者在1997年9月1日出版的《計算機世界》上發表的名為《Visual C++ 4.0編程經驗談》的文章中,提到過一種改變窗口標題的方法,即在應用程序的框架類CMainFrame 類(注:它是CFrameWnd類的派生類) 的成員函數PreCreateWindow()中修改CFrameWnd類的成員變量m_strTitle的值。這種方法的不足之處就是只能一次性地設置窗口標題的內容,不能在程序運行過程中隨時修改它。比如當需要把鼠標的當前坐標在窗口標題上顯示時,我們就要使用到Visual C++提供的全程函數 BOOL SetWindowText( HWND hWnd, LPCTSTR lpString )。這個函數實際上是一個Win32函數,其第一個參數要求是一個窗口框架的句柄,而第二個參數要求是一個指向一個常量字符串的32位指針,即LPCTSTR類型的變量。通常情況下,我們往往會在應用程序的文檔類或視類中動態改變窗口標題的內容,因而沒有現成的指向窗口框架的句柄供我們使用,因此我們還需要在使用SetWindowText()函數前先調用另一個Win32函數AfxGetMainWnd(),來獲得一個指向應用程序的框架類的指針,例如使用語句:
CWnd* m_pCWnd= AfxGetMainWnd();
然後,再以如下形式調用SetWindowText()函數:
SetWindowText(*m_pCWnd, (LPCTSTR) m_WindowText);
// m_WindowText可以是一個CString類的變量
把多於256色的位圖作為資源加入到應用程序中
Visual C++ 5.0以前版本中自帶的位圖編輯器不能浏覽和編輯256色以上的位圖,並且資源文件中也不允許嵌入(Import)256色以上的位圖作為資源(否則,在應用程序運行時會報錯)。這一特性使我們用Visual C++開發應用程序時不得不使用其他方法來增強界面圖畫的美觀性,於是就有使用Visual C++開發應用程序內核、用Visual Basic開發界面的組合方法。在Visual C++ 5.0中這個問題有了改善。首先,位圖編輯器可以創建並編輯256色的位圖。其次,Visual C++ 5.0允許程序員把256色以上的位圖嵌入到資源中,但仍然無法在Visual C++的位圖編輯器中浏覽,並且還要求必須選擇Win32 Release作為編譯方式生成可執行的應用程序。另外一個限制條件是作為資源的256色以上的位圖不能由應用程序內核自動打開和關閉。比如說,在上述那篇名為《Visual C++ 4.0編程經驗談》的文章中曾經提到過一種為對話框加入位圖式按鈕的方法,即由程序開發者為每個按鈕創建四幅位圖,分別用於表示按鈕的彈起狀態(UP)、按下狀態(DOWN)、輸入焦點狀態(FOCUS)和禁止狀態(DISABLE),並且必須以該按鈕的標題名與上述四種狀態之一的組合作為位圖的標識,以便應用程序在繪制位圖按鈕時,自動找到相應的資源(即位圖)。然而這一自動映射只限制於Visual C++位圖編輯器能夠打開的位圖。因此,如果選擇256色以上的位圖作為位圖按鈕的資源,並希望上述四狀態能夠相互切換的話,就必須用到下述函數和程序設計參考模型。
*S 設置四個常量:BUTTON_UP、BUTTON_DOWN、BUTTON_FOCUS、BUTTON_DISABLE,分別用於標識各按鈕的當前狀態。
*S 在應用程序的相應對話框類中為每個位圖按鈕(為下面敘述方便,不妨假設為兩個)設置一個CRect類的對象:m_rect1和m_rect2,來記載各按鈕在對話框中所占據的坐標矩形。再在該對話框類中為每個按鈕設置一個整型變量:Buton1_Status和Button2_Status,記錄各按鈕的當前狀態。然後在對話框的構造函數中初始化這些CRect類的對象和整型變量。
*S 在該對話框類中創建分別響應鼠標各種狀態的消息處理函數,如OnMouseMove()、OnLButtonUp()、OnLButtonDown()等。
*S 同時按下Ctrl和W鍵或直接單擊工具條上的ClassWizard按鈕,打開ClassWizard對話框。在類名(Class name)列表框中選擇對話框類,在Object IDs列表框中選擇該類的類名,在消息(Messages)列表框中選擇WM_PAINT消息並雙擊它,這時ClassWizard就會在該對話框類中加入一個OnPaint()函數。然後,再在Object IDs列表框中選擇新加入的工具條按鈕的標識名,雙擊消息列表框中的COMMAND消息,ClassWizard又會在對話框類中加入相應的消息處理函數。關閉ClassWizard對話框。
本文給出部分程序代碼,僅供參考。
編者注:源程序發表在http://www.computerworld.com.cn/98/skill/default.htm。歡迎訪問!
在應用程序中不加載菜單、工具條和狀態條
在通過AppWizard生成的具有窗口框架結構的應用程序(SDI和MDI)中,MFC類庫已為我們加載了菜單(包括一個系統菜單)、工具條和狀態條。但有時由於特殊需要,我們可能希望在自己的應用程序中事先不加載菜單、工具條和狀態條,這時就需要我們手動刪除和修改一些類中的語句。步驟如下:
1.打開MainFrm.cpp文件,使用工具條上的函數下拉列表框找到OnCreate()函數。按照下述程序注釋掉創建工具條和狀態條部分的語句。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//在此處開始加注釋符號
/*if (!m_wndToolBar.Create(this) ||!m_wnd ToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0(“Failed to create toolbar\n");
return -1;// fail to create
}
if (!m_wndStatusBar.Create(this) ||!m_wndStatus Bar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0(“Failed to create status bar\n");
return -1;// fail to create
}
// TODO: Remove this if you don´t want tool tips or a resizeable toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you don´t want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//此處結束注釋
*/
return 0;
}
2.在MainFrm.cpp文件中,使用工具條上的函數下拉列表框,找到PreCreateWindow()函數。把cs.style設置成如下形式,即不加載系統菜單。
// Create a window without min/max buttons,system menu, or sizable border
cs.style =WS_OVERLAPPED |WS_BORDER;
3. 在主應用程序,即含有定義theApp全程變量的.cpp文件中,使用工具條上的函數下拉列表框,找到InitInstance()函數。在“pDocTemplate = new CSingleDocTemplate”一句中,用NULL替換IDR_MAINFRAME。如下段程序所示。
BOOL CYourMainApp::InitInstance()
{
//.....此處略去一部分無關語句
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
NULL,
//用NULL替換IDR_MAINFRAME
RUNTIME_CLASS(CNoBarDoc),
RUNTIME_CLASS(CMainFrame),
// main SDI frame window
RUNTIME_CLASS(CNoBarVIEw));
AddDocTemplate(pDocTemplate);
//.....此處略去一部分無關語句
}
4. 找到Visual C++編輯器的工具條上的編譯方式下拉列表框,選擇Win32 Release,生成Release版本的應用程序。
至此,我們就得到了不含菜單、工具條和狀態條結構的應用程序。