MFC初步----在C语言文件实现Windows窗口调用
-
新建项目----Windows桌面向导:
-
选择配置项目
- 上机环境win7操作系统下vs2017,新建一个.c文件
- 简单窗口程序
#include<windows.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL,TEXT("会员注册成功"),TEXT("欢迎来到松鼠搏击!"),MB_OK); return 0; }
利用winapi实现一个自定义windows窗体程序,实验环境:win7下 vs2010,注意!win7下vs2017会出现编译通过,运行成功,但死活不出现窗体的现象
- 定义消息处理回调函数(所谓消息:就是窗体遇到诸如,画图,窗口销毁等消息时,进行的操作)
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; //其他类型消息转给windows操作系统处理,如果需要,可以在case继续列出 } return DefWindowProc(hwnd, message, wParam, lParam); }
- 窗口属性定义
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow) { //MessageBox(NULL,TEXT("会员注册成功"),TEXT("欢迎来到松鼠搏击!"),MB_OK); HWND hWnd; MSG msg;//微软用C语言做出的api WNDCLASS wc; //memset(&wc, 0, sizeof(WNDCLASS)); wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc;//当窗口接收到消息时,按照WndProc方式定义的方法处理接收到的消息 //return msg.wParam; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance;//句柄的实例---当前实例----所谓句柄的实例,假设我们打开了三个记事本文件,那么每一个记事本即为一个实例,三个就是三个实例 wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);//左上角图标 wc.hCursor = LoadCursor(NULL,IDC_ARROW);//光标----箭头形状,微软定义好的 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";//窗口名字,后续创建窗口时,根据名字来创建 //-------------------------注册窗口---------------------------------------- RegisterClass(&wc); //-------------------------创建窗口---------------------------------------- hWnd = CreateWindow( TEXT("MyWndClass"),//窗口类名 TEXT("李顺溜,包达廷,高超,尚誉"),//标题 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,//窗口位置之---x轴 CW_USEDEFAULT,//窗口位置之---y轴 CW_USEDEFAULT,//宽 CW_USEDEFAULT,//高 NULL,//窗口的父窗口句柄 NULL,//窗口的菜单句柄 hInstance,//窗口的句柄 NULL); //显示和更新窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); //消息循环 while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//把键盘输入处理为ASCII码 DispatchMessage(&msg);//把消息转发给窗口过程 } //return 0; return msg.wParam; }
- 总体代码
#include<windows.h> //窗口回调函数H是handler(句柄)的简写 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int nCmdShow) { //MessageBox(NULL,TEXT("会员注册成功"),TEXT("欢迎来到松鼠搏击!"),MB_OK); HWND hWnd; MSG msg;//微软用C语言做出的api WNDCLASS wc; //memset(&wc, 0, sizeof(WNDCLASS)); wc.style = 0; wc.lpfnWndProc = (WNDPROC)WndProc;//当窗口接收到消息时,按照WndProc方式定义的方法处理接收到的消息 //return msg.wParam; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance;//句柄的实例---当前实例----所谓句柄的实例,假设我们打开了三个记事本文件,那么每一个记事本即为一个实例,三个就是三个实例 wc.hIcon = LoadIcon(NULL,IDI_WINLOGO);//左上角图标 wc.hCursor = LoadCursor(NULL,IDC_ARROW);//光标----箭头形状,微软定义好的 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wc.lpszMenuName = NULL; wc.lpszClassName = "MyWndClass";//窗口名字,后续创建窗口时,根据名字来创建 //-------------------------注册窗口---------------------------------------- RegisterClass(&wc); //-------------------------创建窗口---------------------------------------- hWnd = CreateWindow( TEXT("MyWndClass"),//窗口类名 TEXT("李顺溜,包达廷,高超,尚誉"),//标题 WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,//窗口位置之---x轴 CW_USEDEFAULT,//窗口位置之---y轴 CW_USEDEFAULT,//宽 CW_USEDEFAULT,//高 NULL,//窗口的父窗口句柄 NULL,//窗口的菜单句柄 hInstance,//窗口的句柄 NULL); //显示和更新窗口 ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); //消息循环 while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg);//把键盘输入处理为ASCII码 DispatchMessage(&msg);//把消息转发给窗口过程 } //return 0; return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT://绘画事件,窗口所见部分都是画出来的 return 0; case WM_DESTROY: PostQuitMessage(0); return 0; //其他类型消息转给windows操作系统处理 } return DefWindowProc(hwnd, message, wParam, lParam); }
效果:
怎么样?是不是进一步鼓励着你写出多彩C程序的决心?