失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > MFC_C++01-window简单名词解析 创建底层窗口WinMain函数 利用MFC创建窗口 Windows字符集介绍

MFC_C++01-window简单名词解析 创建底层窗口WinMain函数 利用MFC创建窗口 Windows字符集介绍

时间:2019-12-25 02:54:07

相关推荐

MFC_C++01-window简单名词解析 创建底层窗口WinMain函数 利用MFC创建窗口 Windows字符集介绍

01 window简单名词解析

1.Windows消息机制

1.SDK和API

2.窗口和句柄

3.消息与消息队列

###4. WinMain函数

2.Windows编程模型

02.创建底层窗口WinMain函数介绍

#include<windows.h> //底层实现窗口头文件//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容//WinMain函数入口int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例句柄HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用LPSTR lpCmdLine,//char * argv[] 命令行参数数组int nShowCmd)//窗口命令显示,最大化最小化...{//实现底层窗口 6步骤//1.设计窗口类//2.注册窗口类//3.创建窗口类//4.显示和更新窗口//5.通过循环取消息//6.处理消息(窗口过程)return 0;}

03 底层实现窗口的前5步骤

1.设计窗口类

2.注册窗口类

3.创建窗口类

4.显示和更新窗口

5.通过循环取消息

//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容//WinMain函数入口int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例句柄HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用LPSTR lpCmdLine,//char * argv[] 命令行参数数组int nShowCmd)//窗口命令显示,最大化最小化...{//实现底层窗口 6步骤//1.设计窗口类//2.注册窗口类//3.创建窗口类//4.显示和更新窗口//5.通过循环取消息//6.处理消息(窗口过程)//1.设计窗口WNDCLASS wc;wc.cbClsExtra = 0;//类额外的内存,通常为0wc.cbWndExtra = 0;//窗口额外的内存,通常为0wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为NULL,代表使用系统提供的默认光标wc.hIcon = LoadIcon(NULL, IDI_WARNING);//设置图标,如果第一个参数为NULL,代表使用系统提供的默认图标wc.hInstance = hInstance;//当前实例句柄,WinMain函数中形参即可//wc.lpfnWndProc = WindowProc;//窗口过程函数,回调函数,名称可以随机起wc.lpszClassName = TEXT("WINDOW");//指定窗口类目名wc.lpszMenuName = NULL;//菜单名,没有填NULLwc.style = NULL;//0表示默认风格//2.注册窗口类RegisterClass(&wc);//3.创建窗口/*lpClassName, 类名lpWindowName, 窗口名dwStyle,显示风格 WS_OVERLAPPEDWINDOWx, y,\ 创建窗口起始坐标 CW_USEDEFAULTnWidth, nHeight, 创建窗口默认宽高 CW_USEDEFAULThWndParent, 父窗口 NULLhMenu, 菜单 NULLhInstance, 实例句柄 hInstancelpParam 附加值,鼠标附加值NULL*/HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//4.显示和更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);//5.通过循环取消息/*HWND hwnd; //主窗口UINT message;//消息名称 WM_XXXX(WINDOW MESSAGE)WPARAMwParam;//附加消息 键盘LPARAMlParam;//附加消息 鼠标 左右键DWORD time;//消息产生时间POINT pt;//附加消息,鼠标,x,y坐标*/MSG msg;while (1){/*参数_Out_ LPMSG lpMsg, 消息结构体_In_opt_ HWND hWnd, NULL 捕获所有窗口消息_In_ UINT wMsgFilterMin,过滤最小消息数量_In_ UINT wMsgFilterMax;过滤最大消息数量 0,都写0,代表捕获所有消息*/if(GetMessage(&msg, NULL, 0, 0) == FALSE){break;}//翻译消息TranslateMessage(&msg);//比如:键盘输入c和ctrl+c时需要翻译,再次输入到消息列表中//分发消息DispatchMessage(&msg);}return 0;}

04 底层窗口实现-处理窗口过程

处理消息(窗口过程)

windows.c:

#include<windows.h> //底层实现窗口头文件//6.处理消息(窗口过程)// CALLBACK 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容LRESULT CALLBACK WindowProc(HWND hwnd, //消息所属窗口句柄UINT uMsg, //具体消息名称 WM_XXXWPARAM wParam,//键盘附加消息LPARAM lParam //鼠标附加消息){switch (uMsg){case WM_CLOSE:DestroyWindow(hwnd);//触发 WM_DESTORY 约定俗成一个事情:函数名 xxxWindow消息,不会放到消息队列中,而是直接执行break;case WM_DESTROY:PostQuitMessage(0); //发送退出消息break;case WM_LBUTTONDOWN: //鼠标左键按下消息{int xPos;int yPos;xPos = LOWORD(lParam);yPos = HIWORD(lParam);//打印操作,通常同MessageBoxTCHAR buf[1024];wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);//所属窗口 显示内容 标题内容 关联按键类型MessageBox(hwnd, buf, TEXT("鼠标按下"), MB_OK);}break;case WM_KEYDOWN://键盘消息MessageBox(hwnd, TEXT("键盘按下"), TEXT("键盘消息"), MB_OK);break;case WM_PAINT://绘图消息{PAINTSTRUCT ps;//绘图结构体HDC hdc = BeginPaint(hwnd, &ps);//绘制文字TextOut(hdc, 100, 100, TEXT("helloworld"), strlen("helloworld"));EndPaint(hwnd, &ps);}break;default:break;}return DefWindowProc(hwnd, uMsg, wParam, lParam);}//WINAPI 代表_stdcall参数传递顺序,从右往左,依次入栈,并且在函数返回前自动清空堆栈内容//WinMain函数入口int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例句柄HINSTANCE hPrevInstance,//前一个应用程序实例句柄,在win32环境下,基本值为NULL,不起作用LPSTR lpCmdLine,//char * argv[] 命令行参数数组int nShowCmd)//窗口命令显示,最大化最小化...{//实现底层窗口 6步骤//1.设计窗口类//2.注册窗口类//3.创建窗口类//4.显示和更新窗口//5.通过循环取消息//6.处理消息(窗口过程)//1.设计窗口WNDCLASS wc;wc.cbClsExtra = 0;//类额外的内存,通常为0wc.cbWndExtra = 0;//窗口额外的内存,通常为0wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//设置背景wc.hCursor = LoadCursor(NULL, IDC_HAND);//设置光标,如果第一个参数为NULL,代表使用系统提供的默认光标wc.hIcon = LoadIcon(NULL, IDI_WARNING);//设置图标,如果第一个参数为NULL,代表使用系统提供的默认图标wc.hInstance = hInstance;//当前实例句柄,WinMain函数中形参即可wc.lpfnWndProc = WindowProc;//窗口过程函数,回调函数,名称可以随机起wc.lpszClassName = TEXT("WINDOW");//指定窗口类目名wc.lpszMenuName = NULL;//菜单名,没有填NULLwc.style = NULL;//0表示默认风格//2.注册窗口类RegisterClass(&wc);//3.创建窗口/*lpClassName, 类名lpWindowName, 窗口名dwStyle,显示风格 WS_OVERLAPPEDWINDOWx, y,\ 创建窗口起始坐标 CW_USEDEFAULTnWidth, nHeight, 创建窗口默认宽高 CW_USEDEFAULThWndParent, 父窗口 NULLhMenu, 菜单 NULLhInstance, 实例句柄 hInstancelpParam 附加值,鼠标附加值NULL*/HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);//4.显示和更新ShowWindow(hwnd, SW_SHOWNORMAL);UpdateWindow(hwnd);//5.通过循环取消息/*HWND hwnd; //主窗口UINT message;//消息名称 WM_XXXX(WINDOW MESSAGE)WPARAMwParam;//附加消息 键盘LPARAMlParam;//附加消息 鼠标 左右键DWORD time;//消息产生时间POINT pt;//附加消息,鼠标,x,y坐标*/MSG msg;while (1){/*参数_Out_ LPMSG lpMsg, 消息结构体_In_opt_ HWND hWnd, NULL 捕获所有窗口消息_In_ UINT wMsgFilterMin,过滤最小消息数量_In_ UINT wMsgFilterMax;过滤最大消息数量 0,都写0,代表捕获所有消息*/if(GetMessage(&msg, NULL, 0, 0) == FALSE){break;}//翻译消息TranslateMessage(&msg);//比如:键盘输入c和ctrl+c时需要翻译,再次输入到消息列表中//分发消息DispatchMessage(&msg);}return 0;}

05 利用MFC创建窗口

1.MFC入门

2.代码实现

mfc.h:

#include <afxwin.h>//mfc需要包含的头文件class MyApp :public CWinApp //CWinApp 应用程序类{public://MFC程序入口virtual BOOL InitInstance();};//窗口框架类class MyFrame :public CFrameWnd{public:MyFrame();};

mfc.cpp:

#include"mfc.h"MyApp app; //应用程序对象,有且仅有一个BOOL MyApp::InitInstance(){//创建窗口//MyFrame* frame = new MyFrame;//显示和更新//frame->ShowWindow(SW_SHOWNORMAL);//frame->UpdateWindow();//m_pMainWnd = frame;//保证指向应用程序的主窗口指针m_pMainWnd = new MyFrame;//显示和更新m_pMainWnd->ShowWindow(SW_SHOWNORMAL);m_pMainWnd->UpdateWindow();return TRUE;//返回正常初始化}//窗口框架的默认构造函数MyFrame::MyFrame(){Create(NULL, TEXT("MFC WINDOW"));}

3.vs 报错代码LNK:严重性 无法解析的外部符号 main,函数 “int __cdecl invoke_main(void)“(?invoke_main@@YAHXZ中引用了该符号

06 MFC中消息映射机制

mfc.h:

#include <afxwin.h>//mfc需要包含的头文件class MyApp :public CWinApp //CWinApp 应用程序类{public://MFC程序入口virtual BOOL InitInstance();};//窗口框架类class MyFrame :public CFrameWnd{public:MyFrame();//窗口构造函数//使用消息映射机制,必须引用声明宏DECLARE_MESSAGE_MAP()afx_msg void OnLButtonDown(UINT, CPoint);//鼠标左键按下声明afx_msg void OnChar(UINT, UINT, UINT);//键盘函数afx_msg void OnPaint();//绘图};

mfc.cpp

#include"mfc.h"MyApp app; //应用程序对象,有且仅有一个BOOL MyApp::InitInstance(){//创建窗口//MyFrame* frame = new MyFrame;//显示和更新//frame->ShowWindow(SW_SHOWNORMAL);//frame->UpdateWindow();//m_pMainWnd = frame;//保证指向应用程序的主窗口指针m_pMainWnd = new MyFrame;//显示和更新m_pMainWnd->ShowWindow(SW_SHOWNORMAL);m_pMainWnd->UpdateWindow();return TRUE;//返回正常初始化}//鼠标左键按下,实现void MyFrame::OnLButtonDown(UINT, CPoint point){//TCHAR buf[1024];//wsprintf(buf, TEXT("x = %d,y = %d"), point.x, point, y);//MessageBox(buf);CString str;//MFC使用的字符串//格式化字符串str.Format(TEXT("::::x = %d,y = %d"), point.x, point.y);MessageBox(str);}//键盘实现void MyFrame::OnChar(UINT key, UINT, UINT){//TCHAR buf[1024];//wsprintf(buf, TEXT("按下了%c"), key);//MessageBox(buf);CString str;str.Format(TEXT("按下了%c键"), key);MessageBox(str);}void MyFrame::OnPaint(){CPaintDC dc(this);//画家,画到当前的窗口中//画文字dc.TextOutW(100, 100, TEXT("为了部落"));dc.Ellipse(10, 10, 100, 100);}//消息映射的分界宏BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd)ON_WM_LBUTTONDOWN() //鼠标左键按下 宏ON_WM_CHAR() //键盘宏ON_WM_PAINT() //绘图END_MESSAGE_MAP()//窗口框架的默认构造函数MyFrame::MyFrame(){Create(NULL, TEXT("MFC WINDOW"));}

07 Windows字符集介绍

void MyFrame::OnPaint(){CPaintDC dc(this);//画家,画到当前的窗口中//画文字dc.TextOutW(100, 100, TEXT("为了部落"));dc.Ellipse(10, 10, 100, 100);//多字节转宽字节MessageBox(L"aaa");//TEXT TCHAR 自动编码转换MessageBox(TEXT("aaaa"));//统计宽字节字符串长度char s[] = "aaa";char* p = s;int n = 0;n = strlen(p);wchar_t s2[] = L"aaaa";wchar_t* p2 = s2;n = wcslen(p2);//string 互相转换char* .c_str()//CString 和char* 互相转换//char* -> CStringchar s3[] = "aaa";char* p3 = s3;CString str = CString(p3);//CString -> char*CString str2 = TEXT("abc");CStringA tmp;tmp = str2;char* pp = tmp.GetBuffer();MessageBox(CString(pp));}//Window字符集//ANSI 1个字符对应1个字节 多个字节//中文 韩文... 宽字节 1个字符对应多个字节,UniCode utf8 3个字节 gbk 2个字节

08 利用向导创建MFC

后续都是默认值

视图-》类视图

MFC框架的一些重要的函数

如果觉得《MFC_C++01-window简单名词解析 创建底层窗口WinMain函数 利用MFC创建窗口 Windows字符集介绍》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。