| 另一種改變視窗標題的方法 筆者在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版本的應用程式。 至此,我們就得到了不含菜單、工具條和狀態條結構的應用程式。( |