1、初识
#include<Windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR IpCmdLine, int nCmdShow)
{
int n=MessageBox(NULL, L"Helloworld", L"提示", MB_YESNOCANCEL | MB_ICONEXCLAMATION);
if (n == IDOK)
{
MessageBox(NULL, L"点了OK", L"提示", MB_OK);
}
else if(n==IDNO){
MessageBox(NULL, L"点了No", L"提示", MB_OK);
}
else{
MessageBox(NULL, L"点了取消", L"提示", MB_OK);
}
return 0;
}
控制台窗口应用程序入口函数 main
窗口程序的入口函数 WinMain
函数调用约定:1、函数的入栈方式,2、由谁来平衡堆栈;此成员实际上不是调用约定,而是使用了默认平台调用约定。 例如,在 Windows x86 上默认为 StdCall,在 Linux x86 上默认为 Cdecl。
WINAPI/CALLBACK (本质:__stdcall:调用方式): 约定从右向左入栈
WINAPIV :__cdecl:约定从右向左入栈
HINSTANCE:应用程序实例句柄(结构体指针)hInstance:当前应用程序实例句柄,
hPreInstance:当前程序的前一个实例句柄,在32、64已经废弃了,不使用时为NULL,在16位机器上使用。
LPSTR :char* LPCTSTR: const char*; IpCmdLine:命令行参数
nCmdShow:窗口的显示方式:最大化,最下化,普通,正常显示
int MessageBox(
[in, optional] HWND hWnd,
[in, optional] LPCTSTR lpText,
[in, optional] LPCTSTR lpCaption,
[in] UINT uType
);
第一个,HWND :窗口句柄类型,没有父亲传NULL
第二个,LPCTSTR:const wchar_t* ,宽字符集;内容
第三个,标题
第四个,按钮和图标的组合,不能按钮和按钮,图标和图标的组合
API :应用程序编程接口(Application Programma Interface)
SDK 软件开发包(Software Development Kit)
包含,API函数库,帮助手册,辅助工具,使用文档
窗口 包含标题栏,菜单栏,最小、最大化框,滚动
分为客户区和非客户区
句柄,标志一种资源
如窗口句柄,按钮句柄,消息句柄,菜单句柄,进程句柄,线程句柄,光标句柄
如果建立win32控制台应用程序,无法运行程序,点属性->连接器->系统->子系统->改成窗口。
2、创建窗口
1、设计窗口类 WNDCLASS wc;
2、注册窗口类 RegisterClass(&wc)
3、创建窗口类 HWND hWnd = CreateWindow();
4、显示窗口 ShowWindow(hWnd, SW_SHOW);
4、更新窗口 UpdateWindow(hWnd);
5、消息循环 MSG msg;
#include"resource.h"
#include<Windows.h>
//窗口处理函数
//LRESULT =long
//第一个 HWND 窗口句柄
//第二个 消息编号
//WPARAM 窗口的附加消息 unsigned int
//LPARAM 窗口的附加消息 long int
LRESULT CALLBACK WindowsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
//1设计窗口类
/*
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
*/
wchar_t name[] = L"第一次";
wchar_t windowsname[] = L"helloworld";
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;//窗口类的风格
wc.lpfnWndProc = WindowsProc;//窗口处理函数
wc.cbClsExtra = 0;//窗口类的额外扩展空间大小(字节)
wc.cbWndExtra = 0;//窗口的额外扩展空间大小(字节)
wc.hInstance = hInstance;//当前应用程序实例句柄
//加载一个图标文件
//第一个参数,应用程序实例句柄,如果是系统资源传NULL,自定义传hInstance
//第二个:资源ID
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));//窗口图标实例句柄,NULL没有图标
wc.hCursor = LoadCursor(NULL,IDC_ARROW);//鼠标图标句柄
wc.hbrBackground = CreateSolidBrush(RGB(255, 97, 176));//背景画刷句柄
wc.lpszMenuName = NULL;//菜单名
wc.lpszClassName = name;//窗口类型名
//2、注册窗口类
//ATOM = WORD =unsigned short
//DWORD = unsigned long
if (0 == RegisterClass(&wc))
{
MessageBox(NULL, L"此程序不能再windows NT上运行", L"提示", MB_OK);
return 0;
}
//3、创建窗口
HWND hWnd = CreateWindow(
name,//窗口类型名
windowsname,//窗口标题
WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX,//窗口风格
200, 300, 600, 600,//窗口位置
NULL,//父窗口句柄
NULL,//菜单句柄
hInstance,//应用程序实例句柄
NULL,//创建窗口需要传递的信息
);
if (hWnd == NULL)
{
MessageBox(NULL, L"创建窗口失败", L"提示", MB_OK);
return 0;
}
//4、显示窗口
ShowWindow(hWnd, SW_SHOW);
//5、更新窗口
UpdateWindow(hWnd);
//6、消息循环
/*
typedef struct tagMSG {
HWND hwnd;//信息发给哪一个窗口句柄
UINT message;//消息编号
WPARAM wParam;//附加消息
LPARAM lParam;//附加消息
DWORD time;//消息投放到消息队列里面的世界
POINT pt;//消息投放到消息队列的时候鼠标的坐标
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
*/
MSG msg;
//收到WM_QUIT 函数返回0
while (GetMessage(&msg, NULL, 0, 0))
{
//将虚拟键消息转为字符消息
TranslateMessage(&msg);
//将虚拟键消息分发给窗口处理函数
DispatchMessage(&msg);
}
return 0;
}
//窗口处理函数
LRESULT CALLBACK WindowsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
MessageBox(NULL, L"点了关闭", L"提示", MB_OK);
DestroyWindow(hwnd);//销毁窗口
break;
case WM_DESTROY:
//发出退出消息
PostQuitMessage(0);//发出WM_QUIT消息
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);//操作系统默认处理函数,如果没有处理就交给操作系统,
}
LRESULT CALLBACK WindowsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
设计窗口
typedef struct tagWNDCLASSW {
UINT style; //窗口类的风格
WNDPROC lpfnWndProc;//窗口处理函数
int cbClsExtra;//窗口类的额外扩展空间大小(字节)
int cbWndExtra;//窗口的额外扩展空间大小(字节)
HINSTANCE hInstance;//当前应用程序实例句柄
HICON hIcon;//窗口图标实例句柄,NULL没有图标
HCURSOR hCursor;/鼠标图标句柄
HBRUSH hbrBackground;//背景画刷句柄
LPCWSTR lpszMenuName;//菜单名
LPCWSTR lpszClassName;//窗口类型名
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
消息循环
typedef struct tagMSG {
HWND hwnd;//信息发给哪一个窗口句柄
UINT message;//消息编号
WPARAM wParam;//附加消息
LPARAM lParam;//附加消息
DWORD time;//消息投放到消息队列里面的世界
POINT pt;//消息投放到消息队列的时候鼠标的坐标
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;
LoadIcon()加载一个图标文件
第一个参数,应用程序实例句柄,如果是系统资源传NULL,自定义传hInstance
第二个:资源ID
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));//窗口图标实例句柄,NULL没有图标,MAKEINTRESOURCE转换资源ID或者LPCTSTR强转
windows消息机制:
消息循环
//窗口处理函数
LRESULT CALLBACK WindowsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
wchar_t szMsg[100];
wsprintf(szMsg, L"hWnd:%#x\tuMsg:%#x\twParam:%#x\tlParam:%#x", hwnd, uMsg, wParam, lParam);
OutputDebugString(szMsg);//在输出窗口显示信息
switch (uMsg)
{
case WM_CREATE://窗口客户区创建消息,此时窗口已经创建好了,只不过没有显示出来
{ //由CreateWindow或CreateWindowEx函数
//wparam没有使用
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
MessageBox(hwnd, L"WM_CREATE", L"提示", MB_OK);
break;
}
case WM_CLOSE:
//wparam/lparam 没有使用
if (IDYES == MessageBox(NULL, L"点了关闭", L"提示", MB_OK))
{
DestroyWindow(hwnd);//销毁窗口
}
else{
//return 1;//我已经处理了,系统无需处理,交给默认处理函数
//return 0;//我没有处理了,系统处理,没有交给系统默认处理函数
break;
}
break;
case WM_DESTROY:
//清理工作
//发出退出消息
PostQuitMessage(0);//发出WM_QUIT消息
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);//操作系统默认处理函数,如果没有处理就交给操作系统,
}
OutputDebugString();//在输出窗口显示信息
常用消息及消息附加参数:
//窗口处理函数
LRESULT CALLBACK WindowsProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
wchar_t szMsg[100];
//wsprintf(szMsg, L"hWnd:%#x\tuMsg:%#x\twParam:%#x\tlParam:%#x", hwnd, uMsg, wParam, lParam);
OutputDebugString(szMsg);//在输出窗口显示信息
switch (uMsg)
{
case WM_CREATE://窗口客户区创建消息,此时窗口已经创建好了,只不过没有显示出来
{ //由CreateWindow或CreateWindowEx函数
//wparam没有使用
LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
MessageBox(hwnd, L"WM_CREATE", L"提示", MB_OK);
break;
}
//获取键盘按下消息
case WM_KEYDOWN:
{
switch (wParam)
{
case VK_RETURN://回车键
{
//获取键盘状态,在按return的一瞬间,如果shift已经在return之前按下就小于0
short s = GetKeyState(VK_SHIFT);
if (s < 0){
MessageBox(hwnd, L"Shift+Return", L"提示", MB_OK);
}
break;
}
case VK_NUMPAD0://右边数字0
SetWindowText(hwnd, L"右边数字0");
break;
case 0x30://上面数字0
SetWindowText(hwnd, L"上面数字0");
break;
}
if (((lParam >> 24) & 1) == 1)
SetWindowText(hwnd, L"CTRL");
break;
}
case WM_CHAR://输出键盘字符,跟TranslateMessage(&msg);有关。
wchar_t t[100];
wsprintf(t, L"字符: %c", wParam);
SetWindowText(hwnd, t);
break;
case WM_PAINT:
{
//开始绘图
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//绘图
Rectangle(hdc, 30, 30, 200, 200);
//输出文字
wchar_t t[100] = L"哈哈哈哈";
TextOut(hdc, 200, 200, t, wcslen(t));
EndPaint(hwnd, &ps);
break;
}
//鼠标左键消息
case WM_LBUTTONDOWN:
{
wchar_t text[100] = { 0 };
//wParam:按键的状态
//鼠标坐标值
int x = GET_X_LPARAM(lParam);
int y = GET_Y_LPARAM(lParam);
//或者
//int x = LOWORD(lParam);
//int y = HIWORD(lParam);
wsprintf(szMsg, L"x:%d y:%d",x,y);
wcscat(text, szMsg);//连接字符串
if (wParam & MK_CONTROL)
{
wcscat(text, L"CONTROL");
}
if (wParam & MK_LBUTTON)
{
wcscat(text, L"MK_LBUTTON");
}
SetWindowText(hwnd, text);
break;
}
case WM_CLOSE:
//wparam/lparam 没有使用
if (IDYES == MessageBox(NULL, L"点了关闭", L"提示", MB_OK))
{
DestroyWindow(hwnd);//销毁窗口
}
else{
//return 1;//我已经处理了,系统无需处理,交给默认处理函数
//return 0;//我没有处理了,系统处理,没有交给系统默认处理函数
break;
}
break;
case WM_DESTROY:
//清理工作
//发出退出消息
PostQuitMessage(0);//发出WM_QUIT消息
break;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);//操作系统默认处理函数,如果没有处理就交给操作系统,
}
进队列消息:例
WM_KEYDOWN、WM_LBUTTONDOWN、WM_CHAR、WM_QUIT
不进消息队列:例
WM_CREATE、WM_SIZE、WM_PAINT
发送消息:
SendMessage
PostMessage
SendMessage(hwnd, WM_CLOSE, 0, 0);
发送键盘消息
SendMessage(hwnd, WM_KEYDOWN, 0x30, 0);
区别
1、SendMessage是阻塞的,PostMessage是非阻塞的
2、返回值区别:SendMessage返回return的值,PostMessage成功返回true,失败返回false
3、一般SendMessage用于进程内,PostMessage用于进程外
HWND h = FindWindow(L"StandardFrame_DingTalk", L"钉钉");
if (h != NULL)
{
PostMessage(h, WM_CLOSE, 0, 0);
}
自定义消息:
#define UM_TEST WM_USER(1024)+1 //1024 以后
在消息循环里
case WM_LBUTTONDOWN:
{
SendMessage(hwnd, UM_TEST, 0x30, 0);
break;
}
case UM_TEST:
{
MessageBox(hwnd, L"自定义消息", L"提示", MB_OK);
break;
}
对话框的两种模式:
1、模态对话框(阻塞):
创建:DialogBox();返回一个值(IDOK/IDCANCEl)
关闭:EndDialog(hWnd, IDCANCEL);
第一个参数:应用程序实例句柄;
第二个参数:资源ID
第三个参数:父窗口
第四个参数:对话框处理函数,返回FALSE;
2、非模态对话框(非阻塞):
创建:CreateDialog();
销毁:DestroyWindow();
关闭:EndDialog(hWnd, IDCANCEL);//没有销毁只是隐藏了起来。
添加对话框:资源-dialog-新建
添加控件:
Picture Control 图片:属性-type-icon-image
Static Test 静态文本
Edit Control 编辑框
Button 按钮
GetDlgItemText(hWnd, IDC_USER, szUser, 100);//得到文本的内容
#include<Windows.h>
#include"resource.h"
HINSTANCE g_hInstance;
//主对话框处理函数
BOOL CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//登录对话框处理函数
BOOL CALLBACK Longin(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//关于对话框处理函数
BOOL CALLBACK About(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
//聊天对话框处理函数
BOOL CALLBACK chat(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
g_hInstance = hInstance;
//对话框的两种模式
//1、模态对话框
//阻塞
//创建登录窗口
int result=DialogBox(hInstance, MAKEINTRESOURCE(IDD_LONGIN), NULL, Longin);
//创建主窗口
if (result==IDOK)
DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, WindowProc);
//2、非模态对话框
//创建CreateDialog
//关闭DestroyWindow
return 0;
}
BOOL CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
static HWND Dialogh = NULL;
switch (uMsg)
{
case WM_INITDIALOG://对话框初始化消息,对话框创建好了,只不过没有显示出来
{
//MessageBox(hWnd, L"初始化", L"提示", MB_OK);
SetWindowText(hWnd, L"Test");
//加载图标
HICON hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON1));
SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);
break;
}
case WM_COMMAND://命令消息,响应控件,快捷键,菜单的点击
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDOK:
MessageBox(hWnd, L"点击了ok", L"提示", MB_OK);
break;
case IDC_ABOUT://关于对话框
DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT), hWnd, About);
break;
case IDC_BUTTON2://聊天
{
Dialogh = CreateDialog(g_hInstance, MAKEINTRESOURCE(IDD_DIALOG), hWnd, chat);
//显示一下
ShowWindow(Dialogh, SW_SHOW);
//更新一下
UpdateWindow(Dialogh);
break;
}
case IDC_BUTTON3:
ShowWindow(Dialogh, SW_SHOW);
break;
default:
break;
}
break;
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
}
return FALSE;//没有处理的消息交给系统处理,TRUE表示我没有处理,系统也不用处理
}
//登录对话框处理函数
BOOL CALLBACK Longin(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{
case WM_COMMAND://命令消息,响应控件,快捷键,菜单的点击
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDOK:
{
wchar_t szUser[100];
wchar_t szPassword[100];
GetDlgItemText(hWnd, IDC_USER, szUser, 100);//得到文本的内容
GetDlgItemText(hWnd, IDC_PASSWORD, szPassword, 100);
if (wcscmp(szUser, L"admin") == 0 && wcscmp(szPassword, L"123456") == 0)
{
//关闭当前窗口
EndDialog(hWnd, IDOK);
}
else{
MessageBox(hWnd, L"用户名或密码错误!", L"提示", MB_OK |MB_ICONWARNING);
}
break;
}
default:
break;
}
break;
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
}
return FALSE;
}
//关于对话框处理函数
BOOL CALLBACK About(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
switch (uMsg)
{
case WM_COMMAND://命令消息,响应控件,快捷键,菜单的点击
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);
break;
case IDOK:
EndDialog(hWnd, IDCANCEL);
}
break;
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
}
return FALSE;
}
//聊天对话框处理函数
BOOL CALLBACK chat(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND://命令消息,响应控件,快捷键,菜单的点击
switch (LOWORD(wParam))
{
case IDCANCEL:
EndDialog(hWnd, IDCANCEL);//没有真正的关闭非模态对话框,只是隐藏了起来,只有DestroyWindow才能关闭
//DestroyWindow(hWnd);
break;
case IDOK:
EndDialog(hWnd, IDCANCEL);
}
break;
case WM_CLOSE:
EndDialog(hWnd, IDCANCEL);
break;
}
return FALSE;
}
MFC 微软封装windows的面向对象的c++类库,封装了windows API:
win32是C语言编写,MFC是C++编写
2019.2017.2022 在 Visual Studio installer中安装
优点:可重用性、简单
缺点:界面比较丑,做漂亮 的界面比较麻烦,复杂
//第一步
建立CWinApp派生类
//第二步:
重写CWinApp里的InitInstance虚函数
//第三步:
定义CWinApp派生类的全局变量、CMyApp theApp;
//获取当前应用程序实例句柄
//AfxGetInstanceHandle()
//AfxGetApp()->m_hInstance;
//theApp.m_hInstance;
//AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1));
#include<afxwin.h>
#include"resource.h"
//创建对话框
class CMyDlg :public CDialog
{
public:
HICON m_hIcon;
public:
//CMyDlg绑定了这个资源模板
CMyDlg() :CDialog(IDD_DIALOG1)
{
//获取当前应用程序实例句柄
//AfxGetInstanceHandle()
//AfxGetApp()->m_hInstance;
//theApp.m_hInstance;
//AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1));
m_hIcon=LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1));
}
//初始化对话框
//WM_INITDIALOG,对话框已经创建好了只不过没有显示出来
BOOL OnInitDialog()
{
SetWindowText(L"FirstMFC");//设置窗口标题
SetIcon(m_hIcon, TRUE);//大图标
SetIcon(m_hIcon, FALSE);//小图标
return TRUE;
}
};
//第一步
//建立CWinApp派生类
class CMyApp :public CWinApp
{
public:
//MFC初始化过程,相当于main函数,入口
virtual BOOL InitInstance()//第二步:重写CWinApp里的InitInstance虚函数
{
CMyDlg dlg;
dlg.DoModal();//弹出一个模态对话框
return TRUE;//返回TRUE表示初始化成功
}
//执行完后做是清理工作
int ExitInstance()
{
return CWinApp::ExitInstance();
}
};
//MFC应用程序核心,一个MFC应用程序只有一个应用程序核心对象
CMyApp theApp;//第三步:定义CWinApp派生类的全局变量
int WINAPI WinMian(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
return 0;
}
CString类:
CString str = L"MFC";
//获取字符串长度
int nLength = str.GetLength();//字符个数
//判断字符是否为空
if (str.IsEmpty())
//清空字符串
//str.Empty();
str.GetAt(3);
str.SetAt(0, '3');
CString newstr=str.Mid(2, 3);//截取
newstr=str.MakeLower();//转小写
//格式化字符串
newstr.Format(L"当前时间%d", 2023);
//替换
str.Replace('C', 'c');
str.Trim();//去空格
//获取文件名
CString strpath = L"D:\\MFC\\Hello\\Debug\\Hello.exe";
CString e;
int pos = strpath.ReverseFind('\\');
if (pos != -1)
e = strpath.Mid(pos + 1);
//CString转const char*
e.GetBuffer();
//CPOint 坐标点(x,y)
CPoint p(20, 20);
CPoint p2(20, 20);
p += p2;
//偏移量
p.Offset(10, 10);
//CSize 宽和高
CSize s1(100, 200);
//CRect 代表一个区域(x,y,x,y)-(l,t,r,b)
CRect r(100, 100, 200, 200);
RECT r1 = { 20, 20, 30, 30 };
CRect r2(&r1);
CRect r3(p, s1);
p = r.BottomRight();
//缩小DeflateRect向中心缩小
r.DeflateRect(10, 10);
//扩大DeflateRect向外扩大
r.InflateRect(10, 10);
//矩形的交集
r.IntersectRect(r2, r3);
//矩形正常化
r.NormalizeRect();
CTime t=CTime::GetCurrentTime();
int y = t.GetYear();
int m = t.GetMonth();
int d = t.GetDay();
int h = t.GetHour();
int mi = t.GetMinute();
int s = t.GetSecond();
int w = t.GetDayOfWeek();
CString str;
str.Format(L"%d-%d-%d %d-%d-%d", y