VC6 MFC Dialog as apllication 编程

MFC框架虽然古老,但编程还是方便多了,在操控界面控件的基础上,平时在Console模式习练的类可以融入到MFC中,开发应用程序还是比较方便的。下图是习练程序的界面。

说明:

一个EDIT框,一个Label框; 当点击 Execute钮时显示 Hello World!

一个ProgressBAR,程序把它放了一个固定位置。

一个ComboBox,一个ListBox,当Execute时加入Hello World n

二个水平滚动条,点击或改变时在下部的EDIT框中显示POS数值

一个SPIN,点击时在其下面显示改变的数值

几个CheckBox和Radio button,Execute时放在固定位置。

一个EDIT用于显示对DLL的调用。

步骤一:File -> New 一个MFC新程序

选择 Dialog based 应用程序模板,其它页面用默认值。

步骤二:在Dialog页面上摆控件

步骤三:Dialog或控件上右键,进入ClassWizard

进入后是 message map页

它旁边是member页

左侧的ID,在右侧有Control类的成员名 m_Edit1Ctrl,也可设数据变量名m_Edit1Val。在WIN32SDK编程时通过ID得到控件的handle,然后操作控件。现在则通过 m_Edit1Ctrl 成员名,操作它映身的左侧的那个ID的控件,具体找某个ID控件的事情交给MFC去做。在程序代码中是下面的样子:

复制代码
void CMyMFC1Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyMFC1Dlg)
	DDX_Control(pDX, IDC_EDIT7, m_Edit7Ctrl);
	DDX_Control(pDX, IDC_EDIT4, m_Edit4);
	DDX_Control(pDX, IDC_SPIN2, m_Spin2);
	DDX_Control(pDX, IDC_EDIT3, m_Edit3);
	DDX_Control(pDX, IDC_SCROLLBAR1, m_Scroll1);
	DDX_Control(pDX, IDC_LIST1, m_List1);
	DDX_Control(pDX, IDC_COMBO1, m_Combo1);
	DDX_Control(pDX, IDC_PROGRESS1, m_Pbar1);
	DDX_Control(pDX, IDC_EDIT1, m_Edit1);
	DDX_Control(pDX, IDC_STATIC1, m_Label1);
	DDX_Text(pDX, IDC_EDIT2, m_Edit2val);
	DDX_Text(pDX, IDC_EDIT3, m_Edit3val);
	DDX_Text(pDX, IDC_EDIT4, m_Edit4val);
	DDX_Text(pDX, IDC_EDIT7, m_Edit7Val);
	//}}AFX_DATA_MAP
}

在上面代码的下方是消息映射代码

复制代码
BEGIN_MESSAGE_MAP(CMyMFC1Dlg, CDialog)
	//{{AFX_MSG_MAP(CMyMFC1Dlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

工具箱中的控件基本上都映射好的,但ScrollBAR没有,要自己做映射、写代码,不明白微软为什么要把它单独空出来啥都不做。

在消息映射下面的OnInitDialog中把EDIT4设为SPIN的密友,让密友控件显示Spin的变化。然后创建二个滚动条的指针,并设定它们可变化的范围。Edit2和Edit3初始显示 0 值。

复制代码
	m_Spin2.SetBuddy(GetDlgItem(IDC_EDIT4));
	m_Spin2.SetRange(0,255);  

	// TODO: Add extra initialization here
	//pScrollBar 为指向滚动条控件的指针
	CScrollBar* pScrollBar=(CScrollBar*)GetDlgItem(IDC_SCROLLBAR1);
	CScrollBar* pScrollBar2=(CScrollBar*)GetDlgItem(IDC_SCROLLBAR2);
	//设置滚动条的滚动范围和当前位置
	pScrollBar->SetScrollRange(0,100);
	pScrollBar->SetScrollPos(0);
	pScrollBar2->SetScrollRange(0,100);
	pScrollBar2->SetScrollPos(0);
	//将文本编辑框的值初始化为0
    SetDlgItemInt(IDC_EDIT2,0,TRUE);
	SetDlgItemInt(IDC_EDIT3,0,TRUE);

当点按Execute按钮Button1时,在OnButton1()中执行如下代码。如果将每个控件看成一个Class,那这个Class的右边即是它的方法,比如AddString, SetWindowText等。

复制代码
void CMyMFC1Dlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	m_Edit1.SetWindowText(_T("Hello World!"));
	m_Label1.SetWindowText(_T("Hello World!"));
	m_Pbar1.SetRange(0, 100); m_Pbar1.SetPos(25);
	m_Combo1.AddString("Hello world 1");
	m_Combo1.AddString("Hello world 2");
	m_Combo1.AddString("Hello world 3");
	m_Combo1.AddString("Hello world 4");
	m_Combo1.AddString("Hello world 5");
	m_Combo1.SelectString(1, "Hello world 5");
	m_List1.AddString("Hello World 1");
	m_List1.AddString("Hello World 2");
	m_List1.AddString("Hello World 3");
	m_List1.AddString("Hello World 4");
	m_List1.AddString("Hello World 5");
	m_Scroll1.SetScrollRange(1,100,true);
	m_Scroll1.SetScrollPos(50, true);
	CheckDlgButton(IDC_CHECK1, 1);
	CheckDlgButton(IDC_CHECK2, 1);
	CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO2);
}

对滚动条的处理是在CSDN网友代码基础上修改的,他直接将代码写在了程序里,没有单独创建新类。还有对SPIN的代码处理,那些代码是工作的,但如果给Spin SetBuddy密友控件直接就可显示的。

接下来的代码是对 MFC DLL 的调用

复制代码
void CMyMFC1Dlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	char mystring[25];
	itoa(fnMFC_dll(), mystring, 10);
	//m_Edit6.SetWindowText(mystring);
	m_Edit7Ctrl.SetWindowText(mystring);
}

在调用前,先包含它的H文件,再LINK时把它的LIB文件包括进去。

MFC暂时习练到此。那个DLL的编写,基本上MFC编写DLL生成的,生成后加了个返回42如下。

MFC_DLL_API int fnMFC_dll(void)

{

return 42;

}

如果要计算,括号中的void可以是int等传送的变量,计算后再return。还可以增加新方法,实现真实有用的功能。MFC有些图表界面库挺不错的,如果开发图表类软件,可用界面库简化操作。感谢CSDN朋友们的代码示范!

相关推荐
余额瞒着我当琳5 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ShineWinsu6 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
牛油果子哥q10 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客10 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
ysa05103010 小时前
c++常用自带函数用法与注意
c++·笔记·算法
qq_1508419912 小时前
从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽
c++·qt·c#
鸿芯微控科技15 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号
三十岁老牛再出发15 小时前
08.18每日总结
c++·python·numpy·pandas
余额瞒着我当琳16 小时前
C++--vector底层,leetcode118杨辉三角实战,对于传统reserve的坑点,迭代器失效
开发语言·c++
醉城夜风~16 小时前
(超详细)C++多态(Polymorphism)
开发语言·c++