網上服裝定制網站seo優(yōu)化軟件有哪些
目錄
一、對話款基本認識
二、對話框項目創(chuàng)建
三、控件操作
四、對話框創(chuàng)建和顯示?
模態(tài)對話框
非模態(tài)對話框
五、動態(tài)創(chuàng)建按鈕
六、訪問控件
控件添加控制變量
訪問對話框
操作對話框
SendMessage()
七、對話框伸縮功能實現(xiàn)
八、對話框小項目-逃跑按鈕
九、小項目
一、對話款基本認識
對話框是與用戶進行交互的控件,如文件對話框,字體對話框,顏色對話框等,一般用于告示,提醒等。對話框就是一個窗口,它不僅可以接收消息,而且還可以被移動和關閉,甚至可以在它的客戶區(qū)中進行繪圖。相當于一個窗口,在它上面能夠旋轉各種標準控件和擴展控件。都是由CWnd類派生來。
Windows應用程序(win桌面應用程序)工作的基本流程是從用戶那里得到數據,經過相應的處理之后,先把處理結果輸出到屏幕,打印機或者其他輸出設備。這就需要用到Windows應用程序的用戶接口對話框。
常用對話框
這些控件也是對話框
二、對話框項目創(chuàng)建
創(chuàng)建MFC應用項目,創(chuàng)建基于對話框的程序類型
用戶界面,按需選擇
高級功能按需選擇
生成的類:一個APP類,一個Dialog類
三、控件操作
WM系列消息是對話框接收處理,子控件的消息處理需要在消息映射中指明ID和控件事件
給對話框的控件添加消息處理的3種方式
- 雙擊對話框里面的控件就會在Dlg類消息映射表中添加消息映射
- 右擊控件,選擇類向導,命令一欄中,在里面選擇控件的ID值,在選擇對應的控件事件
- 右擊對話框,選擇屬性,選擇控件事件,選擇要處理的消息
如何給對話框添加控件?VS中打開工具箱,直接選中拖曳即可
當控件的消息處理無法滿足需求時,可以控件也是對話框,可以給控件,對話框添加類,指定ID,父窗口即可
資源添加一個新的對話框,在對話框中右擊選擇 添加類,會生成一個? ? ? .h? ? ? ?.cpp文件
繼承的基類選擇,可以選CDialog,或者CDialogEx(繼承自前者,提供了更加豐富的控件支持)
這個創(chuàng)建后,其構造函數如下:
ButtonText::ButtonText(CWnd* pParent /*=nullptr*/)
: 這是構造函數的定義,它屬于名為ButtonText的類。構造函數的作用是在創(chuàng)建類的對象時進行初始化操作。:CDialogEx(IDD_DIALOG1, pParent)
: 這是構造函數的初始化列表(initializer list)。在這里,我們調用了基類(CDialogEx)的構造函數,并傳入兩個參數:對話框模板資源的ID(IDD_DIALOG1)和父窗口指針(pParent)。通過調用基類的構造函數,確保了從基類繼承的成員變量得到了正確的初始化。
在這個構造函數中,傳入的 pParent
參數指定了對話框的父窗口。父窗口是指對話框所屬的上層窗口,通常用于確定對話框的顯示位置和處理窗口間的關系。在這里,pParent
參數指定了對話框的父窗口,可以根據調用這個構造函數時傳入的具體參數值來確定。在實際使用中,根據具體的情景,可以傳入不同的父窗口指針,以確立對話框與哪個窗口有關聯(lián)關系。
AddDialogText::AddDialogText(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DIALOG1, pParent)
{}
控件的類不想要了,怎么辦?項目中刪除即可,即可把類的引用修改回來,否則會造成程序連接時候報錯。
?
四、對話框創(chuàng)建和顯示?
一個控件(對話框),使用消息映射來處理控件事件;一個控件(對話框),添加類,創(chuàng)建類并且show是不一樣的。或者提供了更加豐富的功能,更重要的是可以繪制出來,與用戶交互,而且擁有自己的消息循環(huán)。
創(chuàng)建一個對話框,并設置ID值,在屬性一欄中,可以控制外觀,位置,行為等,給該對話框添加類。
當點擊第一個對話框確定按鈕后,就會彈出一個新的對話框。
所以需要在第一個對話框的 .cpp?文件包含新對話框的類。
需要在第一個消息對話框中為Button(確定按鈕)使用消息映射機制,
模態(tài)對話框
對話框,控件的本質都是對話框,創(chuàng)建他們需要先Create后Show
模態(tài)(Model)對話框:指當其顯示時,程序會暫停執(zhí)行,直到關閉這個模態(tài)對話框后,才能繼續(xù)執(zhí)行程序中其它任務。當一個模態(tài)對話框打開時,用戶只能與該對話框進行交互,而其它用戶界面對象接收不到輸入信息。在其顯示時,整個程序會暫停,直到關閉該對話框。
void CMFCApplication1Dlg::OnBnClickedOk()
{// 1.模態(tài)對話框使用CBingoDialog dlg;dlg.DoModal(); // 模態(tài)對話框,只能操作當前窗口,會阻塞消息循環(huán)
}
一但使用后該進程只能先等該對話框處理完后才能繼續(xù)處理消息。
非模態(tài)對話框
對話框,控件的本質都是對話框,創(chuàng)建他們需要先Create后Show
非模態(tài)(Modeless)對話框:當其顯示時,允許執(zhí)行程序中其它任務,而不用關閉這個對話框。在MFC中,對資源的操作通常都是通過一個與資源相關的類來完成。對話框資源對應CDialog基類。
需要考慮一個問題,如果在函數內部實例化對話框,創(chuàng)建,繪制對話框,函數執(zhí)行結束,對話框就會銷毀。最好的處理辦法就是:在第一個對話框類中,實例化對象,并在調用初始化函數時創(chuàng)建出來,在消息函數中繪制。
void CMFCApplication1Dlg::OnBnClickedOk()
{// 2.非模態(tài)對話框//需要作為MFCApplication1Dlg類的成員變量//原因:非模態(tài)對話框不會阻塞消息循環(huán),一旦函數結束就會析構掉對象,造成程序崩潰// 窗口繪制之前還需要先創(chuàng)建,在這個類初始化時進行操作if (dlg.m_hWnd == NULL){dlg.Create(IDD_DLG_EDAOYUN, this);}dlg.ShowWindow(SW_SHOW);
}
五、動態(tài)創(chuàng)建按鈕
動態(tài)的需求,需要多少個按鈕在程序開始時時不確定的,只能在程序運行時創(chuàng)建
void CBingoDialog::OnBnClickedButton1()
{// TODO: 在此添加控件通知處理程序代碼TRACE("%s(%d):%s\n", __FILE__, __LINE__, __FUNCTION__);if (m_button.m_hWnd == NULL){m_button.Create(_T("動態(tài)"), BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,CRect(100, 100, 200, 150), this, 9999);}TCHAR buf[20] = _T("");::SendMessage(m_edit1.m_hWnd, WM_GETTEXT, 20, (LPARAM)buf);m_edit1.SendMessage(WM_SETTEXT, sizeof(buf), (LPARAM)buf);this->SendMessage(WM_GETTEXT, 20, (LPARAM)buf);
}
相關必要的解釋:
- CButton類是繼承自CWND類,m_hWnd就是該類的一個成員變量,記錄了Windows系統(tǒng)創(chuàng)建該窗口后,這個窗口的句柄由 m_hWnd 來保存。說明控件(對話框)的本質就是窗口
BS_DEFPUSHBUTTON
:這是按鈕的樣式,表示默認的按鈕外觀。WS_VISIBLE | WS_CHILD
:這是窗口樣式,表示按鈕是可見的并且作為父窗口的子窗口存在。CRect(100, 100, 200, 150)
:這是按鈕控件的位置和大小,使用矩形區(qū)域來表示,左上角坐標為 (100, 100),右下角坐標為 (200, 150)。this
:這個參數表示按鈕控件的父窗口,也就是按鈕所在的對話框9999
:這是按鈕控件的標識符,用于在程序中唯一標識這個按鈕控件。
父窗口,子窗口:當我們在對話框中創(chuàng)建一個按鈕時,按鈕控件會成為對話框的子窗口,并且對話框將成為該按鈕的父窗口。這意味著按鈕的顯示、布局、事件處理等都是相對于對話框來進行的。同時,對話框也負責管理和維護這些子窗口,比如控制它們的顯示和隱藏,處理它們的消息等。
-
父窗口:
- 父窗口通常是一個容器窗口,它可以包含其他窗口作為它的子窗口。
- 父窗口負責管理和布局它的子窗口,包括顯示、隱藏、移動、調整大小等操作。
- 一個窗口可以同時是另一個窗口的子窗口和父窗口,這種多層次的父子關系可以形成窗口的層次結構。
-
子窗口:
- 子窗口是被包含在父窗口內的窗口,它的位置和尺寸相對于父窗口來確定。
- 子窗口可以是各種控件,比如按鈕、文本框、列表框等,也可以是其它窗口。
- 子窗口的行為通常由其父窗口來管理和控制,父窗口處理子窗口的消息并進行相應的響應。
在 MFC 編程中,對話框類通常是一個典型的父窗口,它可以包含各種控件作為其子窗口,比如按鈕、編輯框、組合框等。當你在對話框資源編輯器中放置控件時,這些控件就成為了對話框的子窗口。在對話框類的代碼中,你可以通過控件的成員變量或者控件 ID 來操作和管理這些子窗口。
上述在按鈕消息處理函數中,this指針指向的就是父窗口
六、訪問控件
控件都提供一些方法用于訪問,比如編輯框,提供了設置默認內容,獲取編輯框輸入內容給的方法
用編輯框為例,學習相關使用。
控件添加控制變量
右擊控件,添加變量
在父類中,會增加以下內容:
int m_value1;
int m_value2;
int m_value3;
父類構造函數
CBingoDialog::CBingoDialog(CWnd* pParent /*=nullptr*/): CDialog(IDD_DLG_EDAOYUN, pParent), m_value1(0), m_value2(0), m_value3(0)
{}
CEdit m_edit1;
CEdit m_edit2;
CEdit m_edit3;
添加變量 值,控件都會在 DoDataExchange 中指定對話框類成員變量與控件之間的數據交換規(guī)則,以及進行數據驗證。
void CBingoDialog::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_value1);DDV_MinMaxInt(pDX, m_value1, -9999, 9999);DDX_Text(pDX, IDC_EDIT2, m_value2);DDV_MinMaxInt(pDX, m_value2, -9999, 9999);DDX_Text(pDX, IDC_EDIT3, m_value3);DDV_MinMaxInt(pDX, m_value3, -9999, 9999);DDX_Control(pDX, IDC_EDIT1, m_edit1);DDX_Control(pDX, IDC_EDIT2, m_edit2);DDX_Control(pDX, IDC_EDIT3, m_edit3);
}
DoDataExchange
是 MFC 對話框類中的一個重要成員函數,用于實現(xiàn)對話框和控件之間的數據交換。在該函數中,可以通過調用 DDX_
和 DDV_
系列的宏來指定對話框類成員變量與控件之間的數據交換規(guī)則,以及進行數據驗證。
具體來說,DoDataExchange
函數通常被用來執(zhí)行兩個方面的工作:
-
數據傳遞(DataExchange):將對話框類中的成員變量的值與與之關聯(lián)的控件進行雙向的數據交換。這包括從控件更新數據到成員變量(如
DDX_Control
、DDX_Text
等),以及將成員變量的值反向填充到相關聯(lián)的控件(如DDX_Control
、DDX_Text
等)。 -
數據驗證(DataValidation):在數據交換過程中,執(zhí)行數據驗證操作,確保用戶輸入的數據符合預期的格式和范圍。這包括使用
DDV_
系列的宏來對用戶輸入的數據進行驗證,例如格式、范圍等。
在你提供的代碼中,DoDataExchange
函數擁有一個名為 pDX
的參數,這是數據交換指針,它在數據傳遞和數據驗證過程中扮演著重要的角色。通過在 DoDataExchange
函數中處理 pDX
參數,可以實現(xiàn)對話框和控件之間的數據交換和驗證。
在 MFC(Microsoft Foundation Classes)中,DDX_Text
是一個用于數據交換的宏,用于在對話框和控件之間進行文本數據的交換。
具體地說,DDX_Text
宏用于將文本控件(如編輯框)中的數據與對話框類中的成員變量相關聯(lián),或者將對話框類中的成員變量的值與文本控件相關聯(lián)。
DDX_Text(pDX, nIDC, memberName);
其中:
pDX
?是數據交換指針,負責在對話框和控件之間進行數據交換。nIDC
?是控件的 ID,即要進行數據交換的控件的標識符。memberName
?是對話框類中的成員變量,用于存儲或顯示控件中的數據。
在你提供的代碼中,DDX_Text(pDX, IDC_EDIT1, m_value1)
的作用是將 ID 為 IDC_EDIT1
的編輯框中的文本與對話框類中名為 m_value1
的成員變量進行關聯(lián)。這樣,在對話框中修改編輯框的內容時,相關聯(lián)的成員變量 m_value1
也會相應地更新,反之亦然。
通過使用 DDX_Text
宏,可以很方便地實現(xiàn)對話框中控件和對話框類成員變量之間的雙向數據交換,這在 MFC 編程中是非常常見和有用的操作。
在 MFC(Microsoft Foundation Classes)中,DDV_MinMaxInt
是一個用于數據驗證的宏,用于驗證整數類型的數據是否在指定的最小值和最大值范圍內。
具體地說,DDV_MinMaxInt
宏用于在對話框數據驗證期間檢查整數類型的數據,確保其值在指定的最小值和最大值之間。其語法如下:
DDV_MinMaxInt(pDX, value, minVal, maxVal);
其中:
pDX
?是數據交換指針,負責數據驗證。value
?是要進行驗證的整數值,通常是對話框類中的成員變量。minVal
?是允許的最小值。maxVal
?是允許的最大值。
在你提供的代碼中,DDV_MinMaxInt(pDX, m_value1, -9999, 9999)
的作用是驗證對話框類中名為 m_value1
的整數成員變量,確保其值在 -9999 到 9999 的范圍內。如果用戶輸入的值不在這個范圍內,MFC 將會顯示相應的驗證錯誤消息,并阻止用戶繼續(xù)進行操作,直到輸入的值符合要求為止。
通過使用 DDV_MinMaxInt
宏,可以方便地實現(xiàn)對話框中整數類型數據的范圍驗證,確保用戶輸入的數據符合預期的范圍要求。
DDX_Control
宏用于將對話框中的控件與對話框類中的成員變量進行關聯(lián),其作用是將控件的句柄(handle)與對話框類中的成員變量相關聯(lián),從而可以通過成員變量來操作控件。
具體來說,DDX_Control
宏的語法如下:
DDX_Control(pDX, nIDC, m_memberName);
其中:
pDX
?是數據交換指針,負責在對話框和控件之間進行數據交換。nIDC
?是控件的 ID,即要進行數據交換的控件的標識符。m_memberName
?是對話框類中的成員變量,用于存儲控件的句柄。
在你提供的代碼中,DDX_Control(pDX, IDC_EDIT1, m_edit1)
的作用是將 ID 為 IDC_EDIT1
的編輯框控件與對話框類中名為 m_edit1
的成員變量進行關聯(lián)。這樣一來,通過 m_edit1
成員變量可以直接操作對應的編輯框控件,例如獲取或設置文本內容、啟用或禁用控件等操作。
通過使用 DDX_Control
宏,可以方便地實現(xiàn)對話框類成員變量與控件之間的關聯(lián),簡化了對控件的操作和管理。
訪問對話框
GetDlgItem?根據控件的 ID 來獲取對應的編輯框控件對象的指針。
SetWindowText:為編輯框設置初始值
GetWindowText:獲取編輯框內的值
SetDlgItemText,GetDlgItemText 上面兩個功能的綜合體
BOOL CBingoDialog::OnInitDialog()
{CDialog::OnInitDialog();// TODO: 在此添加額外的初始化CWnd* pEdit01 = GetDlgItem(IDC_EDIT1);CWnd* pEdit02 = GetDlgItem(IDC_EDIT2);//CWnd* pEdit03 = GetDlgItem(IDC_EDIT3);CString strText;if (pEdit01 != NULL){pEdit01->SetWindowText(_T("100"));pEdit01->GetWindowText(strText);}if (pEdit02 != NULL){SetDlgItemText(IDC_EDIT2, _T("200"));GetDlgItemText(IDC_EDIT2, strText);}//if (pEdit03 != NULL) pEdit03->SetWinodwText(_T("300"));SetDlgItemInt(IDC_EDIT3, 100);return TRUE; // return TRUE unless you set the focus to a control// 異常: OCX 屬性頁應返回 FALSE
}
操作對話框
在對話框中輸入三個值,點擊確定按鈕后,會把前兩個值相加放到第三個中
UpdateData()
是 MFC 中用于進行對話框和控件之間數據交換的函數。通過調用 UpdateData(TRUE)
,可以將對話框中的控件的當前值更新到關聯(lián)的成員變量中;而通過調用 UpdateData(FALSE)
,可以將成員變量的值更新到關聯(lián)的控件中。
void CBingoDialog::OnBnClickedOk()
{// TODO: 在此添加控件通知處理程序代碼//CDialog::OnOK();//UpdateData();//m_value3 = m_value2 + m_value1;//UpdateData(FALSE);CString str1, str2, str3;m_edit1.GetWindowText(str1);m_edit2.GetWindowText(str2);int t = _wtoi(str1) + _wtoi(str2);TCHAR buf[32] = _T("");str3 = buf;m_edit3.SetWindowTextW(str3);
}
SendMessage()
一個是調用全局的方法,一個是調用編輯框類的方法
::SendMessage(m_edit1.m_hWnd, WM_GETTEXT, 20, (LPARAM)buf);
m_edit1.SendMessage(WM_SETTEXT, sizeof(buf), (LPARAM)buf);
SendMessage()
是 Windows API 中用于發(fā)送消息的函數之一,在 MFC 中也可以使用。通過 SendMessage()
函數,可以向窗口或控件發(fā)送特定的消息,以實現(xiàn)各種操作,如獲取或設置控件的狀態(tài)、通知控件發(fā)生了特定的事件等。
具體來說,SendMessage()
函數的原型為:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam
);
hWnd
:指定要接收消息的窗口或控件的句柄。Msg
:指定要發(fā)送的消息類型,是一個表示消息的整數值。wParam
?和?lParam
:作為消息參數傳遞的額外信息,具體意義取決于不同的消息類型。
在 MFC 中,你可以使用 SendMessage()
函數來與窗口控件進行交互,例如設置控件的狀態(tài)、獲取控件的信息、自定義處理消息等。常見的用法包括發(fā)送 WM_SETTEXT
消息來設置控件的文本內容,發(fā)送 BM_CLICK
消息來模擬按鈕的點擊操作,以及發(fā)送自定義消息來實現(xiàn)特定的功能。
七、對話框伸縮功能實現(xiàn)
思路:初始化對話框函數中,獲取窗口大小,計算得到縮小后的窗口大小
GetWindowRect獲取對話框大小
判斷一個矩形是否為空:IsRectEmpty(),IsRectNull()。前者是判斷矩形面積是否為空,后者是判斷矩形的四個坐標值是否為0,不關心是否能做為一個矩形。
SetWindowPos()改變窗口的大小。
BOOL CBingoDialog::OnInitDialog()
{CDialog::OnInitDialog();// 獲取窗口范圍GetWindowRect(m_large);m_small = m_large;// 計算得到縮小后的范圍m_small.right = m_small.left + m_small.Width() / 2;m_small.bottom = m_small.top + m_small.Height() / 2;return TRUE; // return TRUE unless you set the focus to a control// 異常: OCX 屬性頁應返回 FALSE
}
在縮小按鈕按鈕事件中完成對窗口的縮放處理
void CBingoDialog::OnBnClickedBtnLarge()
{// TODO: 在此添加控件通知處理程序代碼CRect curRect;GetWindowRect(curRect);CWnd* pButton = GetDlgItem(IDC_BTN_LARGE);CString strTitle;if (pButton){pButton->GetWindowText(strTitle);if (strTitle == _T("放大") && m_large.IsRectEmpty() == FALSE){pButton->SetWindowTextW(_T("縮小"));SetWindowPos(NULL, curRect.left, curRect.top, m_large.Width(), m_large.Height(), SWP_NOMOVE | SWP_NOZORDER);// 窗口Z軸控制//SetWindowPos(&wndTopMost, curRect.left, curRect.top, m_large.Width(), m_large.Height(), SWP_NOMOVE);}else if (m_small.IsRectEmpty() == FALSE){pButton->SetWindowTextW(_T("放大"));SetWindowPos(NULL, curRect.left, curRect.top, m_small.Width(), m_small.Height(), SWP_NOMOVE | SWP_NOZORDER);//SetWindowPos(&wndTopMost, curRect.left, curRect.top, m_small.Width(), m_small.Height(), SWP_NOMOVE);}}
}
八、小項目-逃跑按鈕
創(chuàng)建一個基于對話框的項目,為兩個按鈕添加變量-控件
給這個項目,類向導,添加MFC類
這是,兩個按鈕添加變量-控件,是屬于CBUTTON類;CMyButton類是屬于CButton的子類。
鼠標移動到按鈕控件上的消息會被控件捕獲,而不會給對話框
不信的話,可以在對話框中設置一個鼠標移動消息驗證一下
TRACE("%s(%d):%s %d %d\n", __FILE__, __LINE__, __FUNCTION__, point x, point y);
項目思路:為兩個按鈕對象給出MouseMove方法,響應消息
兩個按鈕創(chuàng)建變量-控件后,控件就會被類關聯(lián);使用CMyButton?指向這兩個控件變量
CMyButton m_btn_light;CMyButton m_btn_left;
CMyButton中設置一個類指針
CMyButton* m_pButton;
在對話框初始化時關聯(lián)起來
m_btn_left.m_pButton = &m_btn_light;m_btn_light.m_pButton = &m_btn_left;
處理邏輯
void CMyButton::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息處理程序代碼和/或調用默認值ShowWindow(SW_HIDE);if (m_pButton != NULL){m_pButton->ShowWindow(SW_SHOW);}CButton::OnMouseMove(nFlags, point);
}
點擊成功提示
void CRunningButtonDlg::OnBnClickedButton2()
{// TODO: 在此添加控件通知處理程序代碼MessageBox(_T("恭喜你,點到我了"), _T("成功!"));
}
九、小項目-屬性頁添加
在八的基礎上,給對話框添加一個新的按鈕,點擊后,會給出一個新的對話框
添加對話框資源
給新的對話框控件:Group Box,單選框,靜態(tài)文本,列表
給這個對話框添加類,類向導,添加MFC類
給單選框添加控制變量-值,不必設置范圍
這樣做的意義就是有了對話框類,成員變量是控件的值,就可以拿到這些值了。
但是設置三個值記錄太麻煩了,不如再次基礎上魔改以下
修改為BOOL數組記錄值
?修改初始化函數,和關聯(lián)函數
為新對話框類重寫初始化函數,選擇這個類,屬性,重寫,選擇要重寫的類,要在初始化時為列表進行初始化,單選框不用,因為我們只需要獲得它的狀態(tài)。
BOOL PROP_01::OnInitDialog()
{CPropertyPage::OnInitDialog();// TODO: 在此添加額外的初始化// 因為GetDlgItem拿到根據ID拿控件的對象地址,默認類型時CWND,需要強制轉換// 就可以通過地址來操作類的成員屬性CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST_COMPANY);if (pListBox){pListBox->AddString(_T("阿里巴巴"));pListBox->AddString(_T("華為"));pListBox->AddString(_T("騰訊"));pListBox->AddString(_T("京東"));pListBox->AddString(_T("百度"));}return TRUE; // return TRUE unless you set the focus to a control// 異常: OCX 屬性頁應返回 FALSE
}
按照上面方法再創(chuàng)建一個對話框,添加控件
為對話框添加MFC類,右擊對話框,類向導,添加MFC類
為多選框添加控制變量-值,和上面一樣
按照上面再添加一個,最后一個了
類向到,添加MFC類
添加控制變量-值
十、屬性頁處理
再追加一個MFC類,類向導,MFC類
將三個對話框作為成員變量添加給類 CMyProSheet
兩個構造函數都要處理
父對話框觸發(fā)點擊事件
運行程序試試看
程序崩潰,嘗試Debug,點擊重試,程序就可以定位到崩潰處
問題出在這里
可能時對話框實例失敗,驗證以下,問題不在這里
查看調用堆棧,貌似也沒啥問題,嗯?發(fā)現(xiàn)問題
查看路徑下源碼行處,發(fā)現(xiàn)對于處理單選框需要指定Group屬性
單選框只能選一個,CTRL+D,可見Tab順序
需要3,4,5是一個tab中,只需要再第一個單選框選中即可 GROUP=TRUE
那么單選框也就不需要數組了,Int 即可
接下來,優(yōu)化對話框的上一步,下一步,去掉幫助按鈕,未優(yōu)化
優(yōu)化:重寫三個對話框類的激活方法(不是消息,是類的一個方法)
給公司添加控制變量
優(yōu)化:重寫OnwizardNext(),必須選擇才能執(zhí)行到下一步
十一、一些開發(fā)經驗
需要初始化的控件可以在父窗口類初始化時進行。
添加控制變量(控件):值,可以拿到控件的值(編輯框的內容等等);控件,可以拿到控件的句柄保存到一個對象中。
將控制變量放到父窗口類中,我們可以自由拿到,通過父窗口對象操作控件
當需要處理控件的消息時,需要為控件添加控制變量到父窗口類中;如果想要處理該控件的消息,就需要實例化這個控件(所有控件都是繼承自CWIND,都是窗口)。就需要創(chuàng)建出來一個類,利用多態(tài),新類指向控制變量-控件,在新類中設置處理消息的函數,就可以了。參考八
獲取窗口大小的操作都是放到初始化時完成的
在函數中不可實例化對象,因為函數結束對象銷毀,不妨把要實例化的類放在類中,在函數中創(chuàng)建重繪。
添加MFC類,其實道理和八一樣,對話框(控件)有了自己的類,就可以有更多操作的控件;再框架中要通過消息映射機制,操作空間有限