1. 程式人生 > >MFC(3):對話方塊建立基礎知識

MFC(3):對話方塊建立基礎知識

 

模態對話方塊:建立後不能對其他視窗進行操作
非模態對話方塊:建立後仍可以對其他視窗進行操作

新建專案-->MFC應用程式-->基於對話方塊、MFC標準-->完成
預設生成的類有:應用程式類、對話方塊類
誤操作關閉對話方塊的解決辦法:解決方案管理器-->點選*.rc檔案會進入資源檢視-->專案名稱-->Dialog--> IDD_專案名大寫_DIALOG

右鍵對話方塊任意位置-->屬性
Caption:設定對話方塊標題
預設控制元件不想要的,選中直接delete即可;(CTRL + A, delete可以刪除對話方塊內的所有控制元件)
新增按鈕: 模態對話方塊 和 非模態對話方塊, 選中-->右鍵屬性-->Caption:設定對話方塊標題

資源檢視-->Dialog-->插入Dialog,插入後對其ID右鍵-->ID:設定對話方塊的ID值(純大寫)

建立模態對話方塊IDD_EXEC和非模態對話方塊IDD_SHOW
以IDD_EXEC為例:
生成對話方塊對應的類:資源檢視-->Dialog-->雙擊對話方塊ID,開啟對應對話方塊-->任意位置右鍵-->新增類-->設定類名CDialogExec-->確定
在類檢視中,會看到自己剛建立的類CDialogExec;類中通過enum{IDD_EXEC}建立起類與對話方塊的關聯
注意:此時出現"Error: 未定義識別符號IDD_EXEC",直接忽略;

回到主對話方塊:選中"模態對話方塊"按鈕,新增點選事件的方法:
新增事件方法一:右鍵-->屬性-->控制元件事件(閃電標識)-->BN_CLICKED,右側下箭頭-->Add
新增事件方法二:右鍵-->新增事件處理程式-->選擇訊息型別(BN_CLICKED)-->新增編輯
新增事件方法三:雙擊

//建立模態對話方塊
void CmfcDialogDlg::OnBnClickedButton1()
{
    //彈出模態對話方塊
    CDialogExec dlg;
    dlg.DoModal();
}
注意:進入函式後首先新增標頭檔案,在MFC中引用的標頭檔案類名以C開頭,引用時省去C;使用的時候還要把C帶上

LNK1123解決方案:
LINK : fatal error LNK1123: 轉換到 COFF 期間失敗: 檔案無效或損壞
方案一:(1)專案\屬性\配置屬性\清單工具\輸入和輸出\嵌入清單:原來是“是”,改成“否”。
方案二:將..\Microsoft Visual Studio 10.0\VC\bin路徑下的cvtres.exe改個名字就OK
方案三:官方解決方案,下載安裝新的VS2010 SP1

LNK4098: 預設庫“MSVCRT”與其他庫的使用衝突;請使用 /NODEFAULTLIB:library  
方案一:【專案】->【屬性】->【配置屬性】->【聯結器】->【輸入】->【忽略指定庫】,輸入:msvcrt.lib
方案二:【專案】->【屬性】->【配置屬性】->【聯結器】->【命令列】,輸入:/NODEFAULTLIB:msvcrt.library

//建立非模態對話方塊
void CmfcDialogDlg::OnBnClickedButton2()
{
    // TODO: 在此新增控制元件通知處理程式程式碼
    CDialogShow dlg;
    dlg.Create(IDD_SHOW);
    dlg.ShowWindow(SW_SHOWNORMAL);
}
這種建立方式,得到的對話方塊一閃而過;解決方案是:將其作為以成員的形式建立

在C*Dlg類中,引用標頭檔案,定義成員變數CDialogShow的物件dlg;此法弊端在於只能建立一次,解決辦法為:
在OnInitDialog函式中;建立非模態對話方塊,dlg.Create(IDD_SHOW);保證建立一次

小結:
修改按鈕名稱:選中,直接輸
觸發按鈕點選事件:雙擊,進入單擊事件
插入視窗:右鍵,新增類
模態建立:DoModal()函式
非模態對話方塊:定義私有成員dlg,dlg.Create(IDD_*)寫到OnInitDialog()函式中,在按鈕的點選事件中呼叫顯示視窗函式dlg.ShowWindow()