一直以来,采用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 }