背景
需要使用Visual Studio C++做一些界面。此篇文章既是記錄Visual Studio C++在調整界面時常常遇見的問題。
正文
一、如何更改窗體圖標,以及生成的.exe
圖標
- 更改窗體圖標
首先要有一個.ico
的圖標文件,然后在解決方案管理器
內找到資源文件
,然后將想要更改的.ico
圖標添加至該資源內,添加的類型為Icon
。打開Recourse.h
文件,該文件供界面文件.rc
使用,如下所示:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 wzCAN.rc 使用
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_WZCAN_DIALOG 102
#define IDI_ICON1 129 // 導入圖標時,MFC產生的對應宏
#define IDR_MAINFRAME 128 // MFC默認圖標對應的宏
#define IDC_CHECK1 1000
注意IDR_MAINFRAME
這個宏定義,接着打開wzCANDlg.cpp
文件,其中wzCAN
為類名,找到如下函數:
CwzCANDlg::CwzCANDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CwzCANDlg::IDD, pParent)
{
// 此段代碼既是加載窗體圖標
// IDR_MAINFRAME即為默認的窗體顯示圖標文件
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
將IDR_MAINFRAME改成IDI_ICON1,類窗體顯示的既是導入的新圖標文件。
- 更改生成的
.exe
文件的圖標
經過上述步驟,類窗體圖標確實改變了,可是生成的.exe
文件卻沒有改變。原因在於MFC總是默認將宏定義最小值所對應的圖標設為.exe
圖標。在.rc
文件內已經說明,如下所示:
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDI_ICON1 ICON 'res\\Aplex.ico'
IDR_MAINFRAME ICON 'res\\wzCAN.ico'
因此,只需要將我們導入圖標所對應的宏定義值改成最小即可。
#define IDI_ICON1 128 // 導入圖標時,MFC產生的對應宏
#define IDR_MAINFRAME 129 // MFC默認圖標對應的宏
二、如何添加菜單欄,並實現相應菜單欄的命令響應
關於菜單欄的操作的更加詳細說明已經另外開了一篇博客Visual studio C++ MFC之Menu editor記錄。
菜單欄在Visual Studio C++工程中以資源文件存在,所以不要誤認為其為控件。以下分為實現菜單欄以及單擊菜單產生命令的的兩個步驟:
-
實現菜單
- 創建Menu相關資源文件:在資源視圖對應的
.rc
文件內右擊添加資源,選擇Menu
,將會生成Menu相關文件。 - 編輯菜單欄,直接輸入即可,如下圖:
- 在要顯示該菜單欄的
Dialog
的屬性里找到Menu
,選擇新添加菜單欄的ID
。 - 編譯運行后,則可看到菜單欄在窗口中顯示。效果如下圖:
- 創建Menu相關資源文件:在資源視圖對應的
-
設置點擊某一個菜單欄選項實現對應命令:
- 在對應的菜單欄右擊選擇
添加事件處理程序
,如下圖:
- 左邊一欄中的
消息類型
分為兩類,一類是Command
,一類是UI
命令,該命令和Command
的不同在於,UI
命令會增加傳遞一個UI指針
的參數,使該函數內可對UI進行更改。
右邊一欄中的類列表
則是對應在哪個窗口類去實現這個命令,毫無疑問,在哪個Dialog
實現則去那個窗口類實現對應的函數。 - 正確選擇
消息類型
和類列表
后,則會在對應窗口類實現對應的函數,而我在里面實現了一個消息通知,代碼如下:
- 在對應的菜單欄右擊選擇
void CwzCANDlg::OnChyqAge()
{
// TODO: 在此添加命令處理程序代碼
MessageBox((LPCWSTR)L"AGE Error",NULL,MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
}
實現如下函數后,當點擊對應的菜單欄,則會彈出一個警告框。
- 至此即完成了菜單欄和相應菜單欄的命令響應。
三、調試打印函數TRACE(...)
在調試程序的時候,時常需要知道一些變量的值,又不願意將變量添加到監視窗口,此時就可以調用函數TRACE(...),它的使用和printf(...)
函數基本一致,運行程序時進入調試模式,則該函數輸出的信息顯示在輸出
窗口。
四、無法將成員變量添加到ID為IDC_STATIC的控件中解決辦法
添加了一個Static Text
的控件,想在運行的時候更改這個文本框的內容,就需要添加變量,然后出現了無法添加的錯誤。
解決辦法既是將ID改成其他的ID即可以添加了。
更多問題,未完待續
參考鏈接:
- TRACE(...)函數的連接地址;
記錄時間:2017-1-20
記錄地點:深圳WZ