Visual studio 安装 以及 MFC简介(微软基础库类)
MFC打开选择基于对话框的应用程序
控件的功能实现,双击控件,将自动在对应对话框类.h文件声明函数和.cpp文件定义函数。
添加控件的变量后,将在对话框类.h文件中自动添加对应变量,并自动添加DataExchange函数
控件对应数据的获取与改变函数
GetDlgItemText(控件ID,目标)
SetDlgItemText(控件ID, 目标)
MessageBox()消息对话框 MessageBox(TEXT(""));
编辑文本框可以设置为只读(属性中设置),ctrl+D和点击调整tab顺序
问题:时不时报错无法识别的外部命令怎么办?重来一遍一切又好了
1.将对应图片放入res文件夹中,在资源视图导入bitmap该图片。
2.改写onpaint函数
将else部分改为
else
{
//CDialogEx::OnPaint();
//注释该语句:防止重复调用重画函数
//CDialog::OnPaint();
//添加代码对话框背景贴图
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect); //获取对话框长宽
CDC dcBmp; //定义并创建一个内存设备环境
dcBmp.CreateCompatibleDC(&dc); //创建兼容性DC
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1); //载入资源中图片
BITMAP m_bitmap; //图片变量
bmpBackground.GetBitmap(&m_bitmap); //将图片载入位图中
//将位图选入临时内存设备环境
CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);
//调用函数显示图片StretchBlt显示形状可变
dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
区别: 在弹出模态对话框后,在没有关闭该模态对话框前,不能对其他对话框操作,而非模态对话框可以。
添加新的对话框资源,并创建对应对话框类
模态对话框:调用 Dlg.DoModal()即可。
非模态对话框:
1.在主对话框类中将子对话框类作为成员变量(指针或非指针均可)
2.判断成员变量指针是否为NULL
3.create函数创建对话框,并用ShowWindow(SW_SHOW)函数显示对话框
如何判断一个成员变量指针是否为空:
1.定义时是对话框对象:
对话框对象中有一个内部成员变量m_hwnd,即对话框的句柄,因此可以根据m_hwnd变量来判断对话框有没有被创建。
故调用if(dlg.m_hwnd)
2.定义时直接定义变量指针
判断指针是否为空即可 故调用if(pt==NULL)
从控件获得文本,和向控件发送文本。 GetDlgItemText(控件ID,储存对象)SetDlgItemText;
自定义消息和消息响应函数,消息的发送,获取,消息响应函数
对话框类向导自定义类消息 如WM_MAIN_MSG,系统将自动生成一个消息响应函数。注意:此时运行程序会报错,因为消息没有对应的ID,我们需要在主程序头文件中加上
#define WM_MAIN_MSG WM_USER+0x001 // 定义消息 mzb
#define WM_SUB_MSG WM_USER+0x002 // 定义消息 mzb
WM_USER 之前的是给系统消息用的ID,之后的是给用户用的ID
发送消息 使用全局函数 ::SendMessage(目标窗口句柄,目标窗口消息ID,WPARAM类型的想要发送消息的指针(强转类型即可),NULL);
消息响应函数的写法,函数名,类型,参数系统已生成。主体部分:
消息的获取直接通过第一个参数转成CString 类型即可!!!!此处只能转成指针,否则会报错。
例:CString * strMsg = (CString*) wParam;
然后将该数据发送至控件即可。
分界线----------------------------------------------------------------------------------
杂:
::函数名 调用全局作用的函数,而不是类里面的函数
句柄的获得:
通过窗口指针获得窗口句柄 dlg->GetSafeHwnd();
或者dlg->m_hWnd
获得父窗口的句柄 HWND hWnd = this->GetParent()->GetSafeHwnd();
句柄和指针区别:句柄其实就是指针,但是他和指针最大的不同是:给你一个指针,你可以通过这个指针做任何事情,也许是好事,也许是通过这个指针破坏内存,干一些捣乱的事情。这个我想大家都会碰到过,因为乱用指针可能会导致程序崩溃。句柄就没有这个缺点,通过句柄,你只能干一些windows允许你干的事情(例如调用一些api函数等等),没有了指针的随意。
为什么new了一个对话框对象后还需要用该对象调用create函数创建对话框呢?
解决:
假如我们添加一个对话框资源后,需要对该对话框添加类(初始对话框已有除外)控制该对话框上的控件,变量。类似的,假如我们现在有了一个对话框的类对象,但是对话框却并不存在,我们就要通过create函数创建对话框。