黑马程序员MFC三天教程-底层窗口实现-vc6.0代码
教程地址:
以下内容来源于网络
1 2 3 4 | 在线完整视频: http: //yun.itheima.com/course/235.html?2009sjnqq 网盘完整视频: https: //pan.baidu.com/s/1v-WGz4KE48UDT5rmT9E-sw 提取码lty2 配套资料:https: //pan.baidu.com/s/1JXqN-ghsf5nbJIyQrGY_1Q 提取码:hguy MSDN Library的文档,有需要的拿走哦 链接: https: //pan.baidu.com/s/1hEh9nd0U2JY_e5jKdC9tkw 提取码: kdvj |
VC++ 6.0(SP6)代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | #include <windows.h> //底层实现的窗口的头文件 //6、处理消息(窗口过程) LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_CLOSE: //所以以xxxWindow为结尾的方法,都不会进入消息队列中,而是直接运行 DestroyWindow(hwnd); //DestroyWindow被调用后,发送另一个消息,WM_DESTROY break ; case WM_DESTROY: PostQuitMessage(0); // 0返回给第5步的while循环里的getMessage. break ; case WM_LBUTTONDOWN: //鼠标左键按下 { int xPos = LOWORD(lParam); int yPos = HIWORD(lParam); char 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( "hello" ), strlen ( "hello" )); EndPaint(hwnd,&ps); } break ; } //返回值默认处理方式 return DefWindowProc(hwnd,uMsg,wParam,lParam); } int WINAPI WinMain( HINSTANCE hInstance, //应用程序实例句柄 HINSTANCE hPrevInstance, //上一个应用程序句柄,在Win32环境下,参数一般为NULL,不起作用 LPSTR lpCmdLine, //char * argv[] int nShowCmd //显示命令:最大化、最小化、正常(居中) ) { //1.设计窗口 //2.注册窗口 //3.创建窗口 //4.显示和更新 //5.通过循环取消息 //6.处理消息(窗口过程) HWND hwnd; MSG msg; //1.设计窗口 WNDCLASS wc; wc.cbClsExtra = 0; //类的额外内存 wc.cbWndExtra = 0; //窗口额外内存 wc.hbrBackground = ( HBRUSH )GetStockObject(WHITE_BRUSH); //设置背景 //视频教程中是 LoadCursor(NULL, IDC_HAND),但VC6.0中没有HAND,所以随便选个CROSS(十字)代替 //LoadCursor具体包含哪些光标,可以在LoadCursor单词位置鼠标右键“转到LoadCursor定义” //然后按Ctrl+F组合键,搜索IDC关键字即可看到支持的光标 wc.hCursor = LoadCursor(NULL, IDC_CROSS); //设置光标,如果第一个参数为NULL,代表使用系统提供的 wc.hIcon = LoadIcon(NULL, IDI_ERROR); //设置图标,如果第一个参数为NULL,代表使用系统提供的 wc.hInstance = hInstance; //应用程序实例句柄,传入WinMain中的形参即可 wc.lpfnWndProc = WindowProc; //回调函数,处理消息(窗口过程) wc.lpszClassName = TEXT( "WIN" ); //指定窗口类型名称 wc.lpszMenuName = NULL; //菜单名称 wc.style = 0; //显示风格 0代表默认风格 //2.注册窗口类 RegisterClass(&wc); //设计好的窗口类,放到注册类里 //3.创建窗口 /* lpClassName, //窗口类名 lpWindowName, //标题名 dwStyle, //非客户区风格,WS_OVERLAPPEDWINDOW x, //坐标x,默认值CW_USEDEFAULT,系统决定 y, //坐标y,默认值CW_USEDEFAULT,系统决定 nWidth, //窗体宽度,默认值CW_USEDEFAULT,系统决定 nHeight, //窗体高度,默认值CW_USEDEFAULT,系统决定 hWndParent, //父窗口,没有,NULL hMenu, //菜单,没有,NULL hInstance, //实例句柄,WinMain传入的形参 lpParam //附加值,NULL */ // hwnd是接受CreateWindow创建后的返回句柄(返回值) //HWND hWnd; // 视频教程中写在此处,但VC6.0中需要将声明放最前面 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; //具体消息的名称 WPARAM wParam; //附加消息,键盘按键消息 LPARAM lParam; //附加消息,鼠标按键消息 DWORD time; //消息产生时间 POINT pt; //附加消息,鼠标坐标位置消息 */ //MSG msg; // 视频教程中写在此处,但VC6.0中需要将声明放最前面 //while (1) while (GetMessage(&msg,NULL,0,0)) //优化,直接把退出条件写到while里,这样就不用if去判断 { /* LPMSG lpMsg, //消息 HWND hWnd , //捕获窗口,填NULL代表捕获所有的窗口 UINT wMsgFilterMin, //最大和最小的过滤消息,一般填0 UINT wMsgFilterMax //填0代表捕获所有消息 */ //if(GetMessage(&msg,NULL,0,0) == FALSE ) //{ // break; //} //翻译组合键消息,翻译后重新放到列队中,等待DispatchMessage分发 TranslateMessage(&msg); //不为false //分发消息 DispatchMessage(&msg); } return 0; } |
-
注意:VC++6.0代码和教程中代码,因编译器版本不同,有两处不一样地方.
1.教程中是 LoadCursor(NULL, IDC_HAND),但VC6.0中没有HAND,所以随便选个CROSS(十字)代替.
2.HWND hwnd; 和 MSG msg; 定义必须写到离 "{" (左花括号)最近的地方,也就是尽量写花括号里的代码第一行,否则编译报错。
3.教程中,老师使用的是VS2013版本编译器
编译执行,效果图:
相关文章:
报错解决参考:
https://blog.csdn.net/weixin_33750452/article/details/86400136
https://blog.csdn.net/qq_38181865/article/details/95631038
-
标签:
mfc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!