完美一点
| #include <windows.h> |
| |
| HINSTANCE g_hInst = NULL; |
| |
| |
| LRESULT CALLBACK WndProc( |
| HWND hWnd, |
| UINT nMsg, |
| WPARAM wParam, |
| LPARAM lParam |
| ) |
| { |
| switch(nMsg) |
| { |
| case WM_DESTROY: |
| PostQuitMessage(0); |
| return 0; |
| } |
| return DefWindowProc(hWnd, nMsg, wParam, lParam); |
| } |
| |
| |
| BOOL MyRegister(LPSTR pszClassName) |
| { |
| WNDCLASS wc = {0}; |
| ATOM nAtom = 0; |
| |
| |
| wc.style = CS_VREDRAW|CS_HREDRAW; |
| wc.lpfnWndProc = WndProc; |
| wc.cbClsExtra = 0; |
| wc.cbWndExtra = 0; |
| wc.hInstance = g_hInst; |
| wc.hIcon = NULL; |
| wc.hCursor = NULL; |
| wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE); |
| wc.lpszMenuName = NULL; |
| wc.lpszClassName = pszClassName; |
| |
| nAtom = RegisterClass( &wc ); |
| if( 0 == nAtom ) |
| { |
| MessageBox( NULL, "Register Failed", "Error", MB_OK|MB_ICONWARNING ); |
| return FALSE; |
| } |
| else |
| { |
| MessageBox( NULL, "Register Successed", "Successed", MB_OK ); |
| } |
| return TRUE; |
| } |
| |
| |
| HWND MyCreate(LPSTR pszClassName) |
| { |
| HWND hWnd = NULL; |
| |
| hWnd = CreateWindow(pszClassName, "CntfWindows", |
| WS_OVERLAPPEDWINDOW, 300, 300, 800, 600, NULL, NULL, |
| g_hInst, NULL); |
| |
| |
| if(hWnd == NULL) |
| { |
| MessageBox(NULL, "CreateWindows Failed", "Errors", MB_OK); |
| return FALSE; |
| } |
| MessageBox(NULL, "CreateWindows Successed", "Successed", MB_OK); |
| return hWnd; |
| } |
| |
| |
| void DisplayWnd( HWND hWnd) |
| { |
| |
| ShowWindow(hWnd, SW_SHOW); |
| |
| UpdateWindow(hWnd); |
| } |
| |
| |
| void Message() |
| { |
| MSG msg = {0}; |
| |
| while(GetMessage(&msg, NULL, 0, 0)) |
| { |
| |
| DispatchMessage(&msg); |
| } |
| } |
| |
| |
| int APIENTRY WinMain(HINSTANCE hInst, |
| HINSTANCE hPrevInst, |
| LPSTR pszCmdLine, |
| int nShowCmd) |
| { |
| HWND hWnd = NULL; |
| g_hInst = hInst; |
| |
| |
| MyRegister("WindowsCntf"); |
| |
| |
| hWnd = MyCreate("WindowsCntf"); |
| |
| |
| DisplayWnd(hWnd); |
| |
| |
| Message(); |
| |
| return 0; |
| } |
| |
| /* |
| 编译 |
| cl cswin32.c /c |
| 链接 |
| link cswin32.obj user32.lib |
| 执行 |
| cswin32.exe |
| |
| 1. 入口函数WinMain |
| |
| 2.窗口处理函数 |
| 当窗口处理消息事件时,系统调用该函数 |
| LRESULT CALLBACK WindowProc( |
| HWND hwnd, |
| UINT uMsg, |
| WPARAM wParam, |
| LPARAM lParam |
| ); |
| |
| 3.注册窗口类型 |
| typedef struct _WNDCLASS { |
| UINT style; |
| WNDPROC lpfnWndProc; |
| int cbClsExtra; |
| int cbWndExtra; |
| HANDLE hInstance; |
| HICON hIcon; |
| HCURSOR hCursor; |
| HBRUSH hbrBackground; |
| LPCTSTR lpszMenuName; |
| LPCTSTR lpszClassName; |
| } WNDCLASS; |
| |
| 注册函数 RegisterClass |
| |
| 4.创建窗口 |
| HWND CreateWindow( |
| LPCTSTR lpClassName, |
| LPCTSTR lpWindowName, |
| DWORD dwStyle, |
| int x, |
| int y, |
| int nWidth, |
| int nHeight, |
| HWND hWndParent, |
| HMENU hMenu, |
| HANDLE hInstance, |
| LPVOID lpParam |
| ); |
| 5.显示窗口 |
| ShowWindow 显示窗口 |
| BOOL ShowWindow( |
| HWND hWnd, |
| int nCmdShow |
| ); |
| UpdateWindow 刷新窗口 |
| |
| 6.消息处理 |
| GetMessage 获取消息 |
| DispatchMessage 派发消息 |
| |
| 7.程序退出 |
| 窗口销毁时,退出程序。在WndProc中实现。 |
| WM_DESTROY: 当窗口销毁时,会调用WndProc |
| 传递给使用者。 |
| PostQuitMessage:发送一个退出消息。 |
| |
| |
| 4.1 资源和资源脚本 |
| 资源:ICON/CUSRUR/BITMAP/MENU...... |
| 资源脚本:扩展名为rc文件 |
| 4.2 编译资源 |
| rc.exe 编译资源,生成res的文件 |
| 4.3 链接资源 |
| 使用link将res文件链接到程序当中 |
| |
| 手动添加ico图标操作步骤 |
| 1.新建一个rc的扩展名文件,放一个图标在当前目录下然后编辑这个文件添加 |
| 下面一句话 |
| 228 ICON "cs.ico" |
| 上面228是编号,ICON是类型,最后面那个是图标的具体位置 |
| 2.使用rc.exe进行编译 |
| rc cswin32.rc |
| 3.编译写好的Win32程序的代码 |
| cl createWin32Windows.c /c |
| 4.链接上面的Win32程序 |
| link createWin32Windows.obj cswin32.RES user32.lib |
| 5.上面没有问题就成功了 |
| |
| */ |
| |
滴水Win32好理解
| 1.第一个图形界面程序 |
| |
| 步骤1:创建Windows应用程序 选择空项目 |
| |
| 步骤2:在新建项窗口中选C++代码文件 创建一个新的cpp文件 |
| |
| 步骤3:在新的cpp文件中添加:#include <Windows.h> |
| |
| 并添加入口函数: |
| |
| int CALLBACK WinMain( CALLBACK 是一个宏 |
| _In_ HINSTANCE hInstance, #define CALLBACK __stdcall |
| _In_ HINSTANCE hPrevInstance, |
| _In_ LPSTR lpCmdLine, |
| _In_ int nCmdShow |
| ) 所有的Win32 API函数都遵循该约定 |
| { |
| |
| return 0; |
| } |
| |
| 步骤4:设计窗口类 |
| |
| 代码: |
| |
| |
| TCHAR className[] = "My First Window"; |
| |
| |
| WNDCLASS wndclass = {0}; |
| wndclass.hbrBackground = (HBRUSH)COLOR_MENU; |
| wndclass.lpfnWndProc = WindowProc; |
| wndclass.lpszClassName = className; |
| wndclass.hInstance = hInstance; |
| |
| -------------------------------------------------------------------------------- |
| LRESULT CALLBACK WindowProc( |
| HWND hwnd, |
| UINT uMsg, |
| WPARAM wParam, |
| LPARAM lParam |
| ); |
| -------------------------------------------------------------------------------- |
| |
| typedef struct _WNDCLASS { |
| UINT style; |
| WNDPROC lpfnWndProc; |
| |
| int cbClsExtra; |
| int cbWndExtra; |
| HINSTANCE hInstance; |
| HICON hIcon; |
| HCURSOR hCursor; |
| HBRUSH hbrBackground; |
| LPCTSTR lpszMenuName; |
| LPCTSTR lpszClassName; |
| } WNDCLASS, *PWNDCLASS; |
| |
| 步骤5:注册窗口类 |
| |
| RegisterClass(&wndclass); |
| |
| 步骤6:创建窗口 |
| |
| |
| HWND hwnd = CreateWindow( |
| className, |
| TEXT("我的第一个窗口"), |
| WS_OVERLAPPEDWINDOW, |
| 10, |
| 10, |
| 600, |
| 300, |
| NULL, |
| NULL, |
| hInstance, |
| NULL); |
| |
| if(hwnd == NULL) |
| return 0; |
| |
| 步骤7:显示窗口 |
| |
| |
| ShowWindow(hwnd, SW_SHOW); |
| |
| 步骤8:消息循环 |
| |
| MSG msg; |
| while(GetMessage(&msg, NULL, 0, 0)) |
| { |
| TranslateMessage(&msg); |
| DispatchMessage(&msg); |
| } |
| |
| 步骤9:回调函数 |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| LRESULT CALLBACK WindowProc( |
| IN HWND hwnd, |
| IN UINT uMsg, |
| IN WPARAM wParam, |
| IN LPARAM lParam |
| ) |
| { |
| switch(uMsg) |
| { |
| |
| case WM_CREATE: |
| { |
| DbgPrintf("WM_CREATE %d %d\n",wParam,lParam); |
| CREATESTRUCT* createst = (CREATESTRUCT*)lParam; |
| DbgPrintf("CREATESTRUCT %s\n",createst->lpszClass); |
| |
| return 0; |
| } |
| case WM_MOVE: |
| { |
| DbgPrintf("WM_MOVE %d %d\n",wParam,lParam); |
| POINTS points = MAKEPOINTS(lParam); |
| DbgPrintf("X Y %d %d\n",points.x,points.y); |
| |
| return 0; |
| } |
| case WM_SIZE: |
| { |
| DbgPrintf("WM_SIZE %d %d\n",wParam,lParam); |
| int newWidth = (int)(short) LOWORD(lParam); |
| int newHeight = (int)(short) HIWORD(lParam); |
| DbgPrintf("WM_SIZE %d %d\n",newWidth,newHeight); |
| |
| return 0; |
| } |
| case WM_DESTROY: |
| { |
| DbgPrintf("WM_DESTROY %d %d\n",wParam,lParam); |
| PostQuitMessage(0); |
| |
| return 0; |
| } |
| |
| case WM_KEYUP: |
| { |
| DbgPrintf("WM_KEYUP %d %d\n",wParam,lParam); |
| |
| return 0; |
| } |
| case WM_KEYDOWN: |
| { |
| DbgPrintf("WM_KEYDOWN %d %d\n",wParam,lParam); |
| |
| return 0; |
| } |
| |
| case WM_LBUTTONDOWN: |
| { |
| DbgPrintf("WM_LBUTTONDOWN %d %d\n",wParam,lParam); |
| POINTS points = MAKEPOINTS(lParam); |
| DbgPrintf("WM_LBUTTONDOWN %d %d\n",points.x,points.y); |
| |
| return 0; |
| } |
| } |
| return DefWindowProc(hwnd,uMsg,wParam,lParam); |
| } |
| |
| -------------------------------------------------------------------------------- |
| |
| 课堂练习测试代码 |
| |
| #include "stdafx.h" |
| |
| LRESULT CALLBACK WindowProc( |
| IN HWND hwnd, |
| IN UINT uMsg, |
| IN WPARAM wParam, |
| IN LPARAM lParam |
| ); |
| |
| int APIENTRY WinMain(HINSTANCE hInstance, |
| HINSTANCE hPrevInstance, |
| LPSTR lpCmdLine, |
| int nCmdShow) |
| { |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| TCHAR className[] = "My First Windows"; |
| |
| |
| |
| |
| |
| WNDCLASS wndclass = {0}; |
| wndclass.hbrBackground = (HBRUSH)COLOR_MENU; |
| wndclass.lpfnWndProc = WindowProc; |
| |
| wndclass.lpszClassName = className; |
| wndclass.hInstance = hInstance; |
| |
| |
| RegisterClass(&wndclass); |
| |
| |
| |
| HWND hwnd = CreateWindow( |
| className, |
| TEXT("我的第一个窗口"), |
| WS_OVERLAPPEDWINDOW, |
| 100, |
| 100, |
| 600, |
| 300, |
| NULL, |
| NULL, |
| hInstance, |
| NULL); |
| |
| if(hwnd == NULL) |
| return 0; |
| |
| |
| ShowWindow(hwnd, SW_SHOW); |
| |
| |
| MSG msg; |
| while(GetMessage(&msg, NULL, 0, 0)) |
| { |
| TranslateMessage(&msg); |
| DispatchMessage(&msg); |
| } |
| |
| return 0; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| LRESULT CALLBACK WindowProc( |
| IN HWND hwnd, |
| IN UINT uMsg, |
| IN WPARAM wParam, |
| IN LPARAM lParam |
| ) |
| { |
| switch(uMsg) |
| { |
| case WM_DESTROY: |
| { |
| |
| PostQuitMessage(0); |
| |
| return 0; |
| } |
| |
| } |
| return DefWindowProc(hwnd, uMsg, wParam, lParam); |
| } |
| |
| |
效果展示

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?