纯干货,代码如下:
#include <windows.h> #include <stdio.h> LRESULT CALLBACK WinFirstProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ); int WINAPI WinMain( HINSTANCE hInstance, //应用程序实例的句柄 当前实例 HINSTANCE hPrevInstance, // 应用程序实例的句柄 先前实例 一般为NULL LPSTR lpCmdLine, // 长指针 字符串类型 命令行参数 int nCmdShow // 显示窗口的状态 (最大化等) ) { WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //背景颜色 wndcls.hCursor = LoadCursor(NULL, IDC_SIZENS); //鼠标的形状 wndcls.hIcon = LoadIcon(NULL, IDI_INFORMATION); //窗口的图标 icon wndcls.hInstance=hInstance; wndcls.lpfnWndProc = WinFirstProc; wndcls.lpszClassName="first"; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; //水平重画或者垂直重画 RegisterClass(&wndcls); //注册窗口类 HWND hwnd; //创建窗口类 hwnd=CreateWindow("first","第一个程序",WS_OVERLAPPEDWINDOW, 0,0,600,400,NULL,NULL,hInstance,NULL); //显示窗口 ShowWindow(hwnd,SW_SHOWNORMAL); //更新窗口 UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); //转换消息 DispatchMessage(&msg); //将收到的消息传到回调函数 进行处理 } return 0; } LRESULT CALLBACK WinFirstProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch(uMsg) { //键盘输入 case WM_CHAR: char szChar[20]; //格式化文本到内存区中 sprintf(szChar,"char is %d",wParam); //弹出消息框 MessageBox(hwnd,szChar,"提示",0); break; //鼠标按下 case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","提示",0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,100,"helloworld",strlen("helloworld")); ReleaseDC(hwnd, hdc); /* 注意释放资源*/ break; //绘写窗口 case WM_PAINT: HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"hello",strlen("hello")); EndPaint(hwnd,&ps); break; //退出 case WM_CLOSE: if (IDYES == MessageBox(hwnd, "是否真的结束?", "windows", MB_YESNOCANCEL)) { DestroyWindow(hwnd); //销毁窗口 } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; }创建一个完整的窗口需要经过下面四个操作步骤: 1、设计一个窗口类; 2、注册窗口类; 3、创建窗口; 4、显示及更新窗口 队列消息会被送到系统消息队列,然后到线程消息队列。Windows维护一个系统消息 队列,每个GUI线程也有一个线程消息队列。其中包括键盘鼠标消息,WM_PAINT、 WM_TIMER、WM_CLOSE、WM_QUIT、WM_LBUTTONDOWN 等。Windows应用程序的输入由Windows 系统以消息的形式发送给应用程序的窗口,这些窗口通过窗口过程来接收和处理消息,然后 把控制返还给Windows. 消息循环从消息队列中得到消息,如果不是快捷键消息或对话框消息,就进行消息转换和派发, 让目的窗口的窗口过程来处理。当得到消息WM_QUIT,退出消息循环。 **WM_DESTROY 销毁窗口,并释放资源。 WM_CLOSE 只是关闭窗口,并不释放资源,可以在后台运行。**
运行结果如下: