SegeX MemDialog:封装好的内存对话框(非资源对话框)说明
----哆啦劉小洋 原創(chuàng),轉(zhuǎn)載需說明出處 2022-12-27
SegeX MemDialog
- 1 簡(jiǎn)介
- 2 源文件清單
- 3 快速測(cè)試
- 4 實(shí)現(xiàn)基本原理
- 5 主要功能
- 6 使用方法
- 6 .1 簡(jiǎn)單界面
- 6.2 復(fù)雜界面
1 簡(jiǎn)介
SegeX組件之一:SegeX MemDialog,應(yīng)用級(jí)內(nèi)存對(duì)話框封裝類。源碼首次公開。使用該類不需要在VC中創(chuàng)建資源,具有如下主要功能:1.完備的內(nèi)存對(duì)話框封裝,功能齊全;2.提供AddButton…等標(biāo)準(zhǔn)函數(shù)添加各種對(duì)話框控件;3.無需編寫消息處理,使用控件狀態(tài)機(jī)制獲取對(duì)話框結(jié)束后不同控件的狀態(tài)、內(nèi)容等,即寫即用;4.支持模態(tài)和非模態(tài)方式打開對(duì)話框。支持VC2012及以上。
源代碼附后。
2 源文件清單
1)SgxMemDialog.h
2)SgxMemDialog.cpp
3 快速測(cè)試
1)將SgxMemDialog.h 、SgxMemDialog.cpp復(fù)制到工程指定目錄。
2)在要使用的文件中增加頭文件:#include “SgxMemDialog.h”
3)在需要測(cè)試的代碼點(diǎn)加一行:CSgxMemDialog::Example();
4 實(shí)現(xiàn)基本原理
VC中可以利用資源編輯器方便的創(chuàng)建對(duì)話框及上面的各種控件,功能強(qiáng)大。只有一個(gè)缺點(diǎn):這種資源方式一定程度破壞了封裝性,且不方便移植。
在實(shí)際應(yīng)用中,有時(shí)需要輕量化的使用對(duì)話框,但使用數(shù)量極大,比如參數(shù)對(duì)話框,一個(gè)程序里可能有幾十個(gè)不同的參數(shù)集合。這時(shí)使用內(nèi)存對(duì)話框是很好的選擇。MFC提供了內(nèi)存對(duì)話框的創(chuàng)建方式,典型的函數(shù)有CreateIndirect、InitModalIndirect,但使用起來不是很方便,僅僅用MFC提供的方式,還不如使用資源類型的對(duì)話框。
SegeX MemDialog對(duì)MFC中的內(nèi)存對(duì)話框創(chuàng)建、使用進(jìn)行了封裝,原理很簡(jiǎn)單,但將幾乎所有繁瑣的工作都幫你做好了,你只需要簡(jiǎn)單幾行代碼就可以在很小的代碼范圍做好工作,僅比AfxMessageBox函數(shù)多寫幾句而已。例如下圖所示的簡(jiǎn)單對(duì)話框只需要不到10行代碼就可以完成,且代碼僅限于使用點(diǎn),完美解決了封裝性的問題。
5 主要功能
1)支持模態(tài)和非模態(tài)方式打開對(duì)話框。
2)無需消息處理。組件采用控件狀態(tài)機(jī)制獲取對(duì)話框結(jié)束后不同控件的狀態(tài)、內(nèi)容。
3)支持CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic等幾個(gè)常用控件。
4)即寫即用。
6 使用方法
首先,該組件是針對(duì)MFC Windows桌面應(yīng)用程序,不支持控制臺(tái)程序。因此假定你的工程是MFC Windows桌面應(yīng)用程序,例如對(duì)話框程序。
1)將SgxMemDialog.h 、SgxMemDialog.cpp復(fù)制到工程指定目錄。
2)在要使用的文件中增加頭文件:#include “SgxMemDialog.h”
3)SgxMemDialog.cpp會(huì)用到預(yù)編譯頭文件,如果這里出錯(cuò),請(qǐng)改為你的工程預(yù)編譯頭文件。(vc6一般是stdafx.h,而VC2022是pch.h)
4)然后可以開始使用了。詳見后續(xù)不同的使用場(chǎng)景。
6 .1 簡(jiǎn)單界面
以上圖為例,在你程序中需要用到的地方執(zhí)行如下代碼則可得到上面的對(duì)話框:
void test_SgxMemDialog_Simple() {//使用給定大小的對(duì)話框CSgxMemDialog dlg(180, 100);dlg.SetWindowTitle(_T(" SegeX - CT"));dlg.AddStatic(1000, //控件資源號(hào),只要在本窗口范圍不重復(fù)即可。"數(shù)據(jù)文件的鉆孔名稱與當(dāng)前排列不同。\r\n Yes:忽略數(shù)據(jù)文件中的鉆孔名稱\r\n No:取消", TRUE, TRUE, 10, 15, 160, 40);dlg.AddCheckButton(1001 //控件ID,只要在本窗口范圍不重復(fù)即可。, "調(diào)換兩孔", 0, FALSE, TRUE, TRUE, 15, 45);dlg.AddButton(IDOK //MFC內(nèi)定資源號(hào)。, "Yes", TRUE, TRUE, TRUE, 25, 70);dlg.AddButton(IDCANCEL //MFC內(nèi)定資源號(hào)。, "No", FALSE, TRUE, TRUE, 95, 70);if (dlg.DoModal() == IDOK){//狀態(tài)機(jī)制獲取是否選中了多選框int n = dlg.GetCtrlStatus(1001)->m_nStatus;if (n != 0)//多選框被選中AfxMessageBox(_T("選中多選框"));elseAfxMessageBox(_T("未選中多選框"));}else{AfxMessageBox(_T("選擇了取消"));} }使用到的方法有:
AddStatic:添加一個(gè)Static控件;
AddCheckButton:添加一個(gè)Check按鈕;
AddButton:添加一個(gè)命令按鈕;
是否選中了多選框,是根據(jù)dlg.GetCtrlStatus(1001)->m_nStatus的狀態(tài)來確定。其中參數(shù)1001是我們添加多選框時(shí)給定的控件ID。
6.2 復(fù)雜界面
下圖為較復(fù)雜的對(duì)話框使用情況:
對(duì)話框中常用控件CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic都有了。需要解決的問題有兩個(gè):
1)如何通過代碼初始化控件,變成上圖的樣式;
2)對(duì)話框結(jié)束(甚至在非模態(tài)下未結(jié)束)時(shí),如何得到控件變化后的狀態(tài)。
詳見代碼:
void test_SgxMemDialog_Normal() {//使用缺省大小的對(duì)話框CSgxMemDialog dlg1(0, 0); // 0: 自動(dòng)計(jì)算//第1行dlg1.AddStatic(IDC_STATIC //控件ID, "請(qǐng)輸入要輸入的字符串1:" //窗口文本, TRUE //可見性, TRUE //使能性, 0 //x 位置 0:本行自動(dòng)位置, -1:換行, 0 //y 位置 0:本行自動(dòng)位置, -1:換行, 100 //寬度,0:缺省, 0 //高度,0:缺省);dlg1.AddEdit(1001, "Edit1", TRUE, TRUE, 0, 0, 150, 0);//第2行dlg1.AddStatic(IDC_STATIC, "請(qǐng)輸入要輸入的字符串2:", TRUE, TRUE, -1 //x 位置 0:本行自動(dòng)位置, -1:換行, -1 //y 位置 0:本行自動(dòng)位置, -1:換行, 100, 0);dlg1.AddEdit(1002, "Edit2", TRUE, TRUE, 0, 0, 150, 0);//第3行,使用ComboBox要注意,它需要一定高度,但實(shí)際上沒有占用那么高,因此下一行一般需要向上偏移dlg1.AddComboBox(1003, TRUE, "王一|李二|張三" //選項(xiàng), 1 //當(dāng)前選項(xiàng), TRUE, TRUE, -1, -1, 100, 80);//第4行dlg1.AddListBox(1004, "王一|李二|張三" //選項(xiàng), 1 //當(dāng)前選項(xiàng), TRUE, TRUE, 0, 0, 150, 60);//第5行dlg1.AddCheckButton(1005 //控件ID,只要在本窗口范圍不重復(fù)即可。, "選擇1", 0, FALSE, TRUE, TRUE, -1, -15, 0, 10);dlg1.AddCheckButton(1006 //控件ID,只要在本窗口范圍不重復(fù)即可。, "選擇2", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);dlg1.AddCheckButton(1007 //控件ID,只要在本窗口范圍不重復(fù)即可。, "選擇3", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);//第6行dlg1.AddRadioButton(1008 //控件ID,只要在本窗口范圍不重復(fù)即可。, "option1", 0, FALSE, TRUE, TRUE, -1, -1, 50, 10);dlg1.AddRadioButton(1009 //控件ID,只要在本窗口范圍不重復(fù)即可。, "option2", 1, FALSE, TRUE, TRUE, 0, 0, 50, 10);dlg1.AddRadioButton(1010 //控件ID,只要在本窗口范圍不重復(fù)即可。, "option3", 0, FALSE, TRUE, TRUE, 0, 0, 50, 10);//第7行dlg1.AddButton(IDOK, "OK", TRUE, TRUE, TRUE, 130, -1);dlg1.AddButton(IDCANCEL, "Cancel");if (dlg1.DoModal() == IDOK){//獲取每個(gè)控件的狀態(tài)CString sResult(_T("對(duì)話框控件狀態(tài):"));sResult += _T("\r\nEidt1 文本:") + dlg1.GetCtrlStatus(1001)->m_sText;sResult += _T("\r\nEidt2 文本:") + dlg1.GetCtrlStatus(1002)->m_sText;CString s;s.Format(_T("%d"), dlg1.GetCtrlStatus(1003)->m_nStatus);sResult += _T("\r\nCombox 選擇文本: ") + dlg1.GetCtrlStatus(1003)->m_sText + _T(", 索引號(hào):") + s;s.Format(_T("%d"), dlg1.GetCtrlStatus(1004)->m_nStatus);sResult += _T("\r\nList 選擇文本: ") + dlg1.GetCtrlStatus(1004)->m_sText + _T(", 索引號(hào):") + s; sResult += _T("\r\nCheck1 選擇:") + CString(dlg1.GetCtrlStatus(1005)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));sResult += _T("\r\nCheck2 選擇:") + CString(dlg1.GetCtrlStatus(1006)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));sResult += _T("\r\nCheck3 選擇:") + CString(dlg1.GetCtrlStatus(1007)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));sResult += _T("\r\nRadio1 選擇:") + CString(dlg1.GetCtrlStatus(1008)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));sResult += _T("\r\nRadio2 選擇:") + CString(dlg1.GetCtrlStatus(1009)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));sResult += _T("\r\nRadio3 選擇:") + CString(dlg1.GetCtrlStatus(1010)->m_nStatus != 0 ? _T("TRUE") : _T("FALSE"));AfxMessageBox(sResult);}else{AfxMessageBox(_T("選擇了取消"));} }使用到的方法有:
AddStatic:添加一個(gè)Static控件;
AddCheckButton:添加一個(gè)Check按鈕;
AddRadioButton:添加一個(gè)Radio按鈕;
AddButton:添加一個(gè)命令按鈕;
AddEdit:添加一個(gè)文本控件;
AddComboBox:添加一個(gè)組合框按鈕;
AddListBox:添加一個(gè)列表框按鈕;
具體使用可參照上述代碼,并可以方便的獲取每個(gè)控件的狀態(tài)。
下載完整的代碼資源。本資源完全免費(fèi),只需要0積分。如果你覺得還好,請(qǐng)點(diǎn)個(gè)贊支持。
總結(jié)
以上是生活随笔為你收集整理的SegeX MemDialog:封装好的内存对话框(非资源对话框)说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zxing生成带logo的二维码
- 下一篇: 马化腾:没有“备胎”会永远被人掐住喉咙