日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SegeX MemDialog:封装好的内存对话框(非资源对话框)说明

發布時間:2024/1/8 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SegeX MemDialog:封装好的内存对话框(非资源对话框)说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

----哆啦劉小洋 原創,轉載需說明出處 2022-12-27

SegeX MemDialog

    • 1 簡介
    • 2 源文件清單
    • 3 快速測試
    • 4 實現基本原理
    • 5 主要功能
    • 6 使用方法
      • 6 .1 簡單界面
      • 6.2 復雜界面

1 簡介

SegeX組件之一:SegeX MemDialog,應用級內存對話框封裝類。源碼首次公開。使用該類不需要在VC中創建資源,具有如下主要功能:1.完備的內存對話框封裝,功能齊全;2.提供AddButton…等標準函數添加各種對話框控件;3.無需編寫消息處理,使用控件狀態機制獲取對話框結束后不同控件的狀態、內容等,即寫即用;4.支持模態和非模態方式打開對話框。支持VC2012及以上。

源代碼附后。

2 源文件清單

1)SgxMemDialog.h
2)SgxMemDialog.cpp

3 快速測試

1)將SgxMemDialog.h 、SgxMemDialog.cpp復制到工程指定目錄。
2)在要使用的文件中增加頭文件:#include “SgxMemDialog.h”
3)在需要測試的代碼點加一行:CSgxMemDialog::Example();

4 實現基本原理

VC中可以利用資源編輯器方便的創建對話框及上面的各種控件,功能強大。只有一個缺點:這種資源方式一定程度破壞了封裝性,且不方便移植。
在實際應用中,有時需要輕量化的使用對話框,但使用數量極大,比如參數對話框,一個程序里可能有幾十個不同的參數集合。這時使用內存對話框是很好的選擇。MFC提供了內存對話框的創建方式,典型的函數有CreateIndirect、InitModalIndirect,但使用起來不是很方便,僅僅用MFC提供的方式,還不如使用資源類型的對話框。
SegeX MemDialog對MFC中的內存對話框創建、使用進行了封裝,原理很簡單,但將幾乎所有繁瑣的工作都幫你做好了,你只需要簡單幾行代碼就可以在很小的代碼范圍做好工作,僅比AfxMessageBox函數多寫幾句而已。例如下圖所示的簡單對話框只需要不到10行代碼就可以完成,且代碼僅限于使用點,完美解決了封裝性的問題。

5 主要功能

1)支持模態和非模態方式打開對話框。
2)無需消息處理。組件采用控件狀態機制獲取對話框結束后不同控件的狀態、內容。
3)支持CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic等幾個常用控件。
4)即寫即用。

6 使用方法

首先,該組件是針對MFC Windows桌面應用程序,不支持控制臺程序。因此假定你的工程是MFC Windows桌面應用程序,例如對話框程序。
1)將SgxMemDialog.h 、SgxMemDialog.cpp復制到工程指定目錄。
2)在要使用的文件中增加頭文件:#include “SgxMemDialog.h”
3)SgxMemDialog.cpp會用到預編譯頭文件,如果這里出錯,請改為你的工程預編譯頭文件。(vc6一般是stdafx.h,而VC2022是pch.h)
4)然后可以開始使用了。詳見后續不同的使用場景。

6 .1 簡單界面

以上圖為例,在你程序中需要用到的地方執行如下代碼則可得到上面的對話框:

void test_SgxMemDialog_Simple() {//使用給定大小的對話框CSgxMemDialog dlg(180, 100);dlg.SetWindowTitle(_T(" SegeX - CT"));dlg.AddStatic(1000, //控件資源號,只要在本窗口范圍不重復即可。"數據文件的鉆孔名稱與當前排列不同。\r\n Yes:忽略數據文件中的鉆孔名稱\r\n No:取消", TRUE, TRUE, 10, 15, 160, 40);dlg.AddCheckButton(1001 //控件ID,只要在本窗口范圍不重復即可。, "調換兩孔", 0, FALSE, TRUE, TRUE, 15, 45);dlg.AddButton(IDOK //MFC內定資源號。, "Yes", TRUE, TRUE, TRUE, 25, 70);dlg.AddButton(IDCANCEL //MFC內定資源號。, "No", FALSE, TRUE, TRUE, 95, 70);if (dlg.DoModal() == IDOK){//狀態機制獲取是否選中了多選框int n = dlg.GetCtrlStatus(1001)->m_nStatus;if (n != 0)//多選框被選中AfxMessageBox(_T("選中多選框"));elseAfxMessageBox(_T("未選中多選框"));}else{AfxMessageBox(_T("選擇了取消"));} }

使用到的方法有:
AddStatic:添加一個Static控件;
AddCheckButton:添加一個Check按鈕;
AddButton:添加一個命令按鈕;

是否選中了多選框,是根據dlg.GetCtrlStatus(1001)->m_nStatus的狀態來確定。其中參數1001是我們添加多選框時給定的控件ID。

6.2 復雜界面

下圖為較復雜的對話框使用情況:

對話框中常用控件CButton、CEdit、CComboBox、CListBox、CCheckButton、CRadioButton、CStatic都有了。需要解決的問題有兩個:

1)如何通過代碼初始化控件,變成上圖的樣式;
2)對話框結束(甚至在非模態下未結束)時,如何得到控件變化后的狀態。

詳見代碼:

void test_SgxMemDialog_Normal() {//使用缺省大小的對話框CSgxMemDialog dlg1(0, 0); // 0: 自動計算//第1行dlg1.AddStatic(IDC_STATIC //控件ID, "請輸入要輸入的字符串1:" //窗口文本, TRUE //可見性, TRUE //使能性, 0 //x 位置 0:本行自動位置, -1:換行, 0 //y 位置 0:本行自動位置, -1:換行, 100 //寬度,0:缺省, 0 //高度,0:缺省);dlg1.AddEdit(1001, "Edit1", TRUE, TRUE, 0, 0, 150, 0);//第2行dlg1.AddStatic(IDC_STATIC, "請輸入要輸入的字符串2:", TRUE, TRUE, -1 //x 位置 0:本行自動位置, -1:換行, -1 //y 位置 0:本行自動位置, -1:換行, 100, 0);dlg1.AddEdit(1002, "Edit2", TRUE, TRUE, 0, 0, 150, 0);//第3行,使用ComboBox要注意,它需要一定高度,但實際上沒有占用那么高,因此下一行一般需要向上偏移dlg1.AddComboBox(1003, TRUE, "王一|李二|張三" //選項, 1 //當前選項, TRUE, TRUE, -1, -1, 100, 80);//第4行dlg1.AddListBox(1004, "王一|李二|張三" //選項, 1 //當前選項, TRUE, TRUE, 0, 0, 150, 60);//第5行dlg1.AddCheckButton(1005 //控件ID,只要在本窗口范圍不重復即可。, "選擇1", 0, FALSE, TRUE, TRUE, -1, -15, 0, 10);dlg1.AddCheckButton(1006 //控件ID,只要在本窗口范圍不重復即可。, "選擇2", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);dlg1.AddCheckButton(1007 //控件ID,只要在本窗口范圍不重復即可。, "選擇3", 1, FALSE, TRUE, TRUE, 0, 0, 0, 10);//第6行dlg1.AddRadioButton(1008 //控件ID,只要在本窗口范圍不重復即可。, "option1", 0, FALSE, TRUE, TRUE, -1, -1, 50, 10);dlg1.AddRadioButton(1009 //控件ID,只要在本窗口范圍不重復即可。, "option2", 1, FALSE, TRUE, TRUE, 0, 0, 50, 10);dlg1.AddRadioButton(1010 //控件ID,只要在本窗口范圍不重復即可。, "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){//獲取每個控件的狀態CString sResult(_T("對話框控件狀態:"));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(", 索引號:") + s;s.Format(_T("%d"), dlg1.GetCtrlStatus(1004)->m_nStatus);sResult += _T("\r\nList 選擇文本: ") + dlg1.GetCtrlStatus(1004)->m_sText + _T(", 索引號:") + 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:添加一個Static控件;
AddCheckButton:添加一個Check按鈕;
AddRadioButton:添加一個Radio按鈕;
AddButton:添加一個命令按鈕;
AddEdit:添加一個文本控件;
AddComboBox:添加一個組合框按鈕;
AddListBox:添加一個列表框按鈕;

具體使用可參照上述代碼,并可以方便的獲取每個控件的狀態。

下載完整的代碼資源。本資源完全免費,只需要0積分。如果你覺得還好,請點個贊支持。

總結

以上是生活随笔為你收集整理的SegeX MemDialog:封装好的内存对话框(非资源对话框)说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。