SDK: 软件开发工具包(Software Development Kit),一般都是一些被软件工程师用于为特定的软件包,软件框架,硬件平台,操作系统等建立应用软件的开发工具的集合。
API函数: Windows操作系统提供给应用程序编程的接口(APplication Programming Interface)。Windows应用程序API函数是通过C语言实现的,所有主要的Windows函数都在Windows.h头文件中进行了声明。
窗口:可以分为客户区和非客户区。窗口可以有一个父窗口,有父窗口的窗口称为子窗口。
句柄:在windows应用程序,窗口是通过窗口句柄(HWND)来标识。我们要对某个窗口进行操作,首先就要得到这个窗口的句柄。句柄是一个四个字节的整数。
消息与消息队列:
Windows程序设计是一种完全不同于传统的DOS方式的程序设计方法。
它是一种事件驱动方式的程序设计模式,主要是基于消息的。
每一个Windows应用程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这一事件,于是将这个事件包装成一个消息,投递到应用程序的消息队列中,等待应用程序的处理。然后应用程序通过一个消息循环不断地从消息队列中取出消息,并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓“发送消息”,实际上是操作系统调用程序中一个专门负责处理消息的函数,这个函数称为窗口过程。
1)打包消息
2)加入消息队列
3)由app告诉系统怎么做,分发消息
4)然后system调用窗口过程函数
mfc入口(c语言模式):
创建mfc程序(框架模式)
2)在右键项目 属性>常规>MFC的使用 ,设置成在共享DLL中使用MFC
3)消息映射的使用
// 1.声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
DECLARE_MESSAGE_MAP()
//2 定义映射入口
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
ON_WM_CHAR()
END_MESSAGE_MAP()
//3 声明映射函数
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnPaint();
afx_msg void OnChar(UINT, UINT, UINT);
//4 实现映射函数
简单案例:
mfc.h
//1 创建应用程序类,继承于CWinApp
class MyApp : public CWinApp
{
public:
//虚函数,初始化应用程序实例,MFC入口函数
virtual BOOL InitInstance();
};
//2 创建框架类(窗口类),继承于CFrameWnd
class MyFrame : public CFrameWnd
{
public:
//构造函数,用于创建窗口
MyFrame();
//1 声明将在一个类中使用消息映射,把消息映射到函数(必须用在类声明中)
DECLARE_MESSAGE_MAP()
//3 声明映射函数
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnPaint();
afx_msg void OnChar(UINT, UINT, UINT);
};
mfc.cpp
#include "mfc.h"
MyApp app;// 应用程序对象,全局,有且只有一个
//初始化应用程序实例,入口函数
BOOL MyApp::InitInstance()
{
//1 创建窗口
MyFrame *frame = new MyFrame;
//2 显示及更新窗口
//CWnd::ShowWindow
//CWnd::UpdateWindow
frame->ShowWindow(SW_SHOWNORMAL); //SW_SHOWNORMAL普通显示样式
frame->UpdateWindow(); //更新窗口
//3 将frame传给全局对象
//CWinThread::m_pMainWnd
m_pMainWnd = frame; //保存指向应用程序的主窗口的指针
return TRUE;
}
//2 定义映射入口
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
ON_WM_CHAR()
END_MESSAGE_MAP()
//MyFrame构造函数,用于创建窗口
MyFrame::MyFrame()
{
// 1 创建窗口
//CWnd::Create
Create(NULL, TEXT("mfctest")); //第一个参数为NULL,采用CWnd默认属性
}
//4 实现映射函数,LButtonDown事件处理
//CWnd::MessageBox
void MyFrame::OnLButtonDown(UINT, CPoint)
{
MessageBox(TEXT("OnLButtonDown"));
}
void MyFrame::OnPaint()
{
//绘图,文本
CPaintDC dc(this);
dc.TextOutW(200, 200, TEXT("OnPaint"));
}
void MyFrame::OnChar(UINT key, UINT, UINT)
{
//获取按键
TCHAR ch = (TCHAR)key;
MessageBox(CString(ch));
}
字符集问题:
// TCHAR 自适应字符集转换
// L 将字符串装换文Unicode字符集
MessageBox(L"hello");
// 宏:TEXT_T自适应字符集转换
MessageBox(TEXT("hello"));
MessageBox(_T("hello"));
// 多字节字符集
char *buf = "hello";
int n = strlen(buf);
// 宽字节字符集
wchar_t &wbuf = L"hello";
n = wcslen(wbuf);
// char *与CString转换
// char* -> CString
char *buf = "hello";
MessageBox(CString(buf));
// CString -> char*
CStringA tmp;
CString str = TEXT("hello");
tmp = str;
char *buf2 = tmp.GetBuffer();
文档/视图结构体系
MFC应用程序框架结构的基石是
文档/
视图体系结构,它定义了一种程序结构,这种结构依靠文档对象保存应用程序的数据,并依靠视图对象控制视图中显示的数据,把数据本身与它的显示分离开。
数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成。 MFC在类CDocument和CView中为稳定视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument和CView合作,把所有的片段连在了一起。
CView类也派生于CWnd类,框架窗口是视图窗口的一个父窗口。主框架窗口(CFrameWnd)是整个应用程序外框所包括的部分,即图中粗框以内的内容,而视类窗口只是主框架中空白的地方。
创建完框架之后会有四个类:
> 添加消息处理函数: 在类视图里右键要添加类的 属性>消息,然后选取相应类的消息声明即可。
> 添加消息处理会在view这个类里
控件
> 添加控件的静态成员:右键控件,添加成员变量
> 双击控件可以添加控件处理函数,打击空间可以修改控件名
static test 控件:
> 要修改默认的id后才能添加成员变量
设置位图
m_staticImage.ModifyStyle(0xf, SS_BITMAP | SS_CENTERIMAGE);
HANDLE handle = LoadImage(
AfxGetInstanceHandle(), //应用程序实例句柄
TEXT("../1.bmp"), //bmp图片目录
IMAGE_BITMAP, //文件类型
200,300, //大小
LR_LOADFROMFILE | LR_CREATEDIBSECTION //从文件加载,窗口背景不影响图片
);
//static 设置位图
m_staticImage.SetBitmap((HBITMAP)handle);
关闭当前窗口:
CDlgExec::OnOK(); // 当前窗口类::OnOK();
模态对话框:
//弹出模态对话框
//1 创建对话框对象
CDlgExec dlg;
//2 以模态方式显示
dlg.DoModal();
非模态对话框:
//1 创建对话框对象,由于ShowWindow的函数是非阻塞的,所以当前函数执行完后dlg对象会释放,造成
// 对话框一闪而过,
所以要把对象添加为成员函数
//CDlgShow dlg;
//2 Create(),只能调用一次,所
以要放到初始化里面,不然第二次打开会出错
//dlg.Create(
IDD_DIALOG_SHOW); // 非模态对话框ID
//3 以非模态方式显示
dlg.ShowWindow(SW_SHOWNORMAL);
combobox:
//初始化下拉框
//1 添加元素
m_combo.AddString(TEXT("可乐"));
m_combo.AddString(TEXT("雪碧"));
m_combo.AddString(TEXT("王老吉"));
//2 插入元素
m_combo.InsertString(2, TEXT("加多宝"));
//3 删除元素
m_combo.DeleteString(3);
//4 默认显示
m_combo.SetCurSel(1);
//下拉框状态改变时触发
void CMy05_comboboxDlg::OnCbnSelchangeComboC()
{
// TODO: 在此添加控件通知处理程序代码
//显示当前元素
int index = m_combo.GetCurSel();
CString str;
m_combo.GetLBText(index, str);
MessageBox(str);
}
list control:
> 将list control 属性 view 改为 report(报表模式)
//设置风格, 选中一行, 网格样式
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
//表头数组
CString heard[] = { TEXT("姓名"), TEXT("性别"), TEXT("年龄") };
//listCtl添加表头
m_list.InsertColumn(0, heard[0], LVCFMT_LEFT, 50);
m_list.InsertColumn(1, heard[1], LVCFMT_LEFT, 50);
m_list.InsertColumn(2, heard[2], LVCFMT_LEFT, 50);
for (int i = 0; i < 10; i++)
{
CString str;
str.Format(TEXT("张三_%d"), i);
int j = 0;
//插入一行
m_list.InsertItem(i, str);
m_list.SetItemText(i, ++j, TEXT("不确定"));
m_list.SetItemText(i, ++j, TEXT("23"));
}
> 1. 要先把图标加载到 资源文件>ICON
//初始化TreeCtrl
//1 加载图标
HICON hIcon[4];
hIcon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
hIcon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
hIcon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
hIcon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
//创建图标列表 ,
由于是在初始化类中,防止初始化结束图标消失,所以将imageList对象设置为成员变量
imageList.Create(50, 50, ILC_COLOR32, 4, 4);
//将图标加载到图标列表中
for (int i = 0; i < 4; i++)
{
imageList.Add(hIcon[i]);
}
//将图标列表设置给树控件
m_tree.SetImageList(&imageList, TVSIL_NORMAL);
//插入节点
HTREEITEM root = m_tree.InsertItem(TEXT("根节点"), 0, 0, NULL);
HTREEITEM father = m_tree.InsertItem(TEXT("父节点"), 1, 1, root);
HTREEITEM sun = m_tree.InsertItem(TEXT("叶子节点"), 2, 2, father);
//默认选中节点
m_tree.SelectItem(sun);
Edit Control:
> 解决在文本框中回车会关闭窗口的问题:选择类视图, editDlg,右键属性 > 重写 OnOK, 添加OnOK方法后,将
> 将变量的值显示在控件中显示:UpdateData(FALSE); // 必须是value类型
> 将
整个对话框中的控件中的值赋值给变量:UpdateData(TRUE);
常用属性设置:
属性
|
含义
|
Number
|
True只能输入数字
|
Password
|
True密码模式
|
Want return
|
True接收回车键,自动换行,只有在多行模式下,才能换行
|
Multiline
|
True多行模式
|
Auto VScroll
|
True 当垂直方向字符太多,自动出现滚动条,同时设置Vertical Scroll才有效
|
Vertical Scroll
|
True当垂直方向字符太多,自动出现滚动条,和Auto VScroll配合使用
|
Horizontal Scroll
|
True当垂直方向字符太多,自动出现滚动条,和Auto HScroll配合使用
|
Read Only
|
True 只读
|
常用接口:
接口
|
功能
|
CWnd::SetWindowText
|
设置控件内容,针对control类型
|
CWnd::GetWindowText
|
获取控件内容,针对control类型
|
TableCtrl:
> 创建项目时最后一步,将view类的基类,设置为CFromView
> 将tab的子窗口的 style设置为 Child, 然后添加类
> 将tab的子窗口的 border设置文 None, 然后添加类
> 将tab控件添加变量,基类设置为CTabSheet
主对话框类中 OnInitDialog() / OnInitialUpdate()做初始化工作
//给tab控件添加对话框
//IDD_DIALOG1为dlg1资源ID
m_tabCtrl.AddPage(TEXT("系统管理"), &dlg1, IDD_DIALOG1);
//IDD_DIALOG1为dlg2资源ID
m_tabCtrl.AddPage(TEXT("系统设置"), &dlg2, IDD_DIALOG2);
//显示tab控件
m_tabCtrl.Show();