博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在控制台应用程序下,创建窗口,避开WinMain函数入口
阅读量:4635 次
发布时间:2019-06-09

本文共 3669 字,大约阅读时间需要 12 分钟。

---恢复内容开始---

一直以来,采用C语言方式的Windows编程的时候,程序的入口必须是WinMain()函数,当开始学习MFC的时候,又觉的MFC的框架结构繁冗混乱,萌生了自己写一个窗口类编写Windows程序,同时想和C#一样避开WinMain的启动函数,所以在网上搜寻并总结了这样一篇文章,作为笔记和大家一起学习。稍后如果我有精力的话,我会自己慢慢的封装一些窗口类,简化Windows编程的难度。希望能像C#一样具有很强的逻辑框架。如果有志同道合的新手可以在我的这一篇下面留言,一起组成兴趣小组。先声明,我是个菜鸟。   1 #include "Windows.h"  2 #include
3 using namespace std; 4 5 #define MAX_LOADSTRING 100 6 // 全局变量: 7 HINSTANCE hInst; // 当前实例 8 WCHAR* szTitle=TEXT("控制台创建的窗口"); // 标题栏文本 9 WCHAR* szWindowClass=TEXT("WindowClass"); // 主窗口类名 10 11 ATOM MyRegisterClass(HINSTANCE hInstance); 12 BOOL InitInstance(HINSTANCE, int); 13 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 14 15 16 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) 17 int main() 18 { 19 //HWND hWnd = ::GetConsoleWindow(); 20 //::ShowWindow(hWnd, SW_HIDE); 21 HINSTANCE hInstance = ::GetModuleHandle(NULL); 22 //::MessageBox(NULL, TEXT("这是一个在控制台应用程序下启动的窗口的演示"),TEXT( "MessageBox"), MB_OK); 23 //cout << hInstance << endl; 24 25 MyRegisterClass(hInstance); 26 27 // 执行应用程序初始化: 28 if (!InitInstance(hInstance, SW_SHOW)) 29 { 30 return FALSE; 31 } 32 33 //HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32TEST)); 34 35 MSG msg; 36 37 // 主消息循环: 38 while (GetMessage(&msg, nullptr, 0, 0)) 39 { 40 TranslateMessage(&msg); 41 DispatchMessage(&msg); 42 } 43 44 return (int)msg.wParam; 45 } 46 47 48 49 50 // 51 // 函数: MyRegisterClass() 52 // 53 // 目的: 注册窗口类。 54 // 55 ATOM MyRegisterClass(HINSTANCE hInstance) 56 { 57 WNDCLASSEXW wcex; 58 59 wcex.cbSize = sizeof(WNDCLASSEX); 60 61 wcex.style = CS_HREDRAW | CS_VREDRAW; 62 wcex.lpfnWndProc = WndProc; 63 wcex.cbClsExtra = 0; 64 wcex.cbWndExtra = 0; 65 wcex.hInstance = hInstance; 66 wcex.hIcon = LoadIcon(hInstance, NULL); 67 wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); 68 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); 69 wcex.lpszMenuName = NULL; 70 wcex.lpszClassName = szWindowClass; 71 wcex.hIconSm = LoadIcon(wcex.hInstance, NULL); 72 73 return RegisterClassExW(&wcex); 74 } 75 76 // 77 // 函数: InitInstance(HINSTANCE, int) 78 // 79 // 目的: 保存实例句柄并创建主窗口 80 // 81 // 注释: 82 // 83 // 在此函数中,我们在全局变量中保存实例句柄并 84 // 创建和显示主程序窗口。 85 // 86 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 87 { 88 hInst = hInstance; // 将实例句柄存储在全局变量中 89 90 HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, 91 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); 92 93 if (!hWnd) 94 { 95 return FALSE; 96 } 97 98 ShowWindow(hWnd, SW_SHOW); 99 UpdateWindow(hWnd);100 101 return TRUE;102 }103 104 //105 // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)106 //107 // 目的: 处理主窗口的消息。108 //109 // WM_COMMAND - 处理应用程序菜单110 // WM_PAINT - 绘制主窗口111 // WM_DESTROY - 发送退出消息并返回112 //113 //114 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)115 {116 switch (message)117 { 118 case WM_PAINT:119 {120 PAINTSTRUCT ps;121 HDC hdc = BeginPaint(hWnd, &ps);122 // TODO: 在此处添加使用 hdc 的任何绘图代码...123 EndPaint(hWnd, &ps);124 }125 break;126 case WM_DESTROY:127 PostQuitMessage(0);128 break;129 default:130 return DefWindowProc(hWnd, message, wParam, lParam);131 }132 return 0;133 }

 

---恢复内容结束---

转载于:https://www.cnblogs.com/CJWBLOG/p/5638424.html

你可能感兴趣的文章
loadrunner支持https协议的操作方法-经验总结
查看>>
30 个 php 操作 redis 常用方法代码例子
查看>>
Knowledge Point 20180305 数据在计算机中的表示
查看>>
谈谈对web标准的理解
查看>>
DIV+CSS规范命名大全集合
查看>>
求二进制中1的个数(编程之美2.1)
查看>>
hdu 4289 网络流拆点,类似最小割(可做模板)邻接矩阵实现
查看>>
接口和异常
查看>>
58前端内推笔试2017(含答案)
查看>>
写给自己的web开发资源
查看>>
Java学习笔记
查看>>
sprintf 和strcpy 的差别
查看>>
jQuery_第五章_jQuery事件和动画
查看>>
打表打表何谓打表?
查看>>
MPEG4与.mp4
查看>>
实验5
查看>>
成长轨迹44 【ACM算法之路 百炼poj.grids.cn】【字符串处理】【2799、2976、2975、2742】...
查看>>
git 下载 安装
查看>>
录制终端信息并回放
查看>>
JS中window.event事件使用详解
查看>>