转自孙鑫老师的VC++系列第一课
#include <windows.h> #include <stdio.h> //窗口过程函数,即回调函数,该函数的代码由操作系统自动调用,CALLBACK表示__stdcall标准调用约定 LRESULT CALLBACK WinSunProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息识别符 WPARAM wParam, // 第一个消息参数 LPARAM lParam // 第二个消息参数 ); //WinMain函数由系统调用,里面的四个参数均由系统赋值 int WINAPI WinMain( HINSTANCE hInstance, // 当前程序的实例句柄 HINSTANCE hPrevInstance, // 之前程序的实例句柄 LPSTR lpCmdLine, // Cmd运行的指令 int nCmdShow // 显示的状态,如最大最小 ) { //开始设计窗口类 WNDCLASS wndcls; wndcls.cbClsExtra=0;//类的额外内存,默认为0即可 wndcls.cbWndExtra=0;//窗口的额外内存,默认为0即可 wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取画刷句柄(将返回的HGDIOBJ进行强制类型转换) wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);//设置光标 wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);//设置窗体左上角的图标 wndcls.hInstance=hInstance;//设置窗体所属的应用程序实例 wndcls.lpfnWndProc=WinSunProc;//设置窗体的回调函数 wndcls.lpszClassName="Weixin2003";//设置窗体的类名 wndcls.lpszMenuName=NULL;//设置窗体的菜单 wndcls.style=CS_HREDRAW | CS_VREDRAW;//设置窗体风格为水平重画和垂直重画 RegisterClass(&wndcls);//向操作系统注册窗体 HWND hwnd; //产生一个窗体,并返回该窗体的句柄,第一个参数必须为要创建的窗体的类名,第二个参数为窗体标题名 hwnd=CreateWindow("Weixin2003","北京维新科学技术培训中心",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL);//把窗体显示出来 UpdateWindow(hwnd);//更新窗体 MSG msg; //消息循环 while(GetMessage(&msg,NULL,0,0))//如果消息不是WM_QUIT,返回非零值;如果消息是WM_QUIT,返回零 { TranslateMessage(&msg);//翻译消息,如把WM_KEYDOWN和WM_KEYUP翻译成一个WM_CHAR消息 DispatchMessage(&msg);//派发消息 } return 0; } LRESULT CALLBACK WinSunProc( HWND hwnd, // 窗口句柄 UINT uMsg, // 消息识别符 WPARAM wParam, // 第一个消息参数 LPARAM lParam // 第二个消息参数 ) { switch(uMsg)//通过判断消息进行消息响应 { case WM_CHAR: char szChar[20]; sprintf(szChar,"char is %d",wParam); MessageBox(hwnd,szChar,"weixin",0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"mouse clicked","weixin",0); HDC hdc; hdc=GetDC(hwnd);//GetDC与ReleaseDC组合使用 TextOut(hdc,0,50,"计算机编程语言培训",strlen("计算机编程语言培训")); ReleaseDC(hwnd,hdc);//要释放HDC,如果不释放会导致内存泄漏 break; case WM_PAINT://响应重绘消息 /*当窗体的width和height改变的时候(比如用鼠标调整了窗体的大小)会触发重绘事件, 但是通过标题栏移动窗体不会触发重绘事件,窗体第一次显示的时候也会触发重绘事件。 BeginPaint和EndPaint必须组合使用,并且只能出现在响应重绘消息的地方*/ HDC hDC; PAINTSTRUCT ps; hDC=BeginPaint(hwnd,&ps); TextOut(hDC,0,0,"维新培训",strlen("维新培训")); EndPaint(hwnd,&ps); break; case WM_CLOSE: if(IDYES==MessageBox(hwnd,"是否真的结束?","weixin",MB_YESNO)) { DestroyWindow(hwnd);//销毁窗口并发送WM_DESTROY消息,但是程序没有退出 } break; case WM_DESTROY: PostQuitMessage(0);//发出WM_QUIT消息,结束消息循环 break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam);//对不感兴趣的消息进行缺省处理,必须有该代码,否则程序有问题 } return 0; }