在控制台应用程序下,创建窗口,避开WinMain函数入口

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在控制台应用程序下,创建窗口,避开WinMain函数入口相关的知识,希望对你有一定的参考价值。

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

    一直以来,采用C语言方式的Windows编程的时候,程序的入口必须是WinMain()函数,当开始学习MFC的时候,又觉的MFC的框架结构繁冗混乱,萌生了自己写一个窗口类编写Windows程序,同时想和C#一样避开WinMain的启动函数,所以在网上搜寻并总结了这样一篇文章,作为笔记和大家一起学习。稍后如果我有精力的话,我会自己慢慢的封装一些窗口类,简化Windows编程的难度。希望能像C#一样具有很强的逻辑框架。如果有志同道合的新手可以在我的这一篇下面留言,一起组成兴趣小组。先声明,我是个菜鸟。
1
#include "Windows.h" 2 #include<iostream> 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 }

 

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

以上是关于在控制台应用程序下,创建窗口,避开WinMain函数入口的主要内容,如果未能解决你的问题,请参考以下文章

WinMain

C++ 中的 WINMAIN 和 main()(扩展)

哪一位VC的高手能告诉我为啥WinMain函数中无法使用Cout或Cin?不胜感激!

从控制台运行时从WinMain管道控制台输出

MFC框架程序及消息映射

WinMain初始化详细过程以及消息循环