第一天
Visual studio 安装 以及 MFC简介(微软基础库类)
MFC打开选择基于对话框的应用程序
- 在以前的头文件(.h),源文件(.cpp)的基础上,增加了一种资源文件(默认的情况下一个.ico 图标文件?后面要学 另外两个.rc和.rc2文件,点击效果打开都是一样的。
- 点开资源文件后Dialog已有两个对话框,一个是主对话框,另一个about对话框
- 对话框对应添加类,对话框中的控件对应添加变量
- 控件添加变量有两种,一种是控件类别的变量(control),用于控制控件本身,如控件的坐标,大小,内部字体大小等,另一种是值类别的变量(value),用于和控件交换数据。
第二天
控件的功能实现,双击控件,将自动在对应对话框类.h文件声明函数和.cpp文件定义函数。
添加控件的变量后,将在对话框类.h文件中自动添加对应变量,并自动添加DataExchange函数
- static text 静态文本框,用于添加一些静态的,不会改变的部分。
- edit control 编辑文本框 ,可以输入字符串(可以在属性中设置只允许输入数字)
- button 按钮,用于某些功能的实现。
控件功能的实现:
字符串与其他类型的转换
字符串->其他类型, _ttoi() int, _ttof() float; 其他类比
其他类型->字符串 , str.format(_T("%d“类比),a )
控件对应数据的获取与改变函数
GetDlgItemText(控件ID,目标)
SetDlgItemText(控件ID, 目标)
MessageBox()消息对话框 MessageBox(TEXT(""));
编辑文本框可以设置为只读(属性中设置),ctrl+D和点击调整tab顺序
问题:时不时报错无法识别的外部命令怎么办?重来一遍一切又好了
第三天->第一周结束
对话框添加背景图片(图片形式应为bmp):
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函数创建对话框。