2 窗口与消息
案例代码
#include <Windows.h> LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; RECT rect; switch(message){ case WM_CREATE: PlaySound(TEXT("hellowin.wav"),NULL,SND_FILENAME|SND_ASYNC); return 0; case WM_PAINT: hdc = BeginPaint(hwnd,&ps); GetClientRect(hwnd,&rect); DrawText(hdc,TEXT("Hello,windows98!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER); EndPaint(hwnd,&ps); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); } int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE preHinstance,PSTR cmdLine,int icmdShow){ static TCHAR szAppName[] = TEXT("helloWin"); HWND hwnd;//画布 MSG msg;//信息 WNDCLASS wndclass;//窗体类别
//对wndclass进行初始化开始 //horizontal redraw //vertical redraw wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口类确定了处理窗口消息的窗口过程,实际是指向该函数的指针 wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; //当前应用程序实例句柄 wndclass.hInstance = hinstance; //加载图标,获得图标句柄以供程序使用 //针对函数LoadIcon,如果要加载本程序内的图标,需将NULL换位本程序实例的句柄 //第二个参数用于识别该图标 //IDI ID for an icon wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION); //加载鼠标光标,获得鼠标句柄以供程序使用 wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); //为该窗口的客户区指定背景色 //handle to a brush //GetStockObject,Windows API函数。该函式检索预定义的备用笔、刷子、字体或者调色板的句柄。 wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; //在创建应用程序窗口之前,必须调用函数RegisterClass来注册窗口类。 if(!RegisterClass(&wndclass))//为应用窗口注册一个窗口类 { MessageBox(NULL,TEXT("The program requires windows NT!"),szAppName,MB_ICONERROR); return 0; } //基于窗口类创建一个窗口 //handle to the window hwnd = CreateWindow(szAppName,// 窗口类名称 TEXT("The Hello program"),// 窗口标题 WS_OVERLAPPEDWINDOW,// 窗口风格 CW_USEDEFAULT,// 初始x坐标 CW_USEDEFAULT,// 初始y坐标 CW_USEDEFAULT,// 初始x方向尺寸 CW_USEDEFAULT,// 初始y方向尺寸 NULL,// 父窗口句柄 NULL,// 窗口菜单句柄 hinstance, // 窗口实例句柄 NULL); // 创建参数 //在CreateWindow完成之后只是在内存中保存了createWindow的一些信息,如果要在屏幕中显示窗口 ShowWindow(hwnd,SW_SHOWNORMAL); //指示窗口对自身进行重绘 UpdateWindow(hwnd); //从消息队列中获取信息,一直检索 //第二个参数~第四个参数均制为NULL或0表明该程序希望获取由该程序所创建的所有窗口消息 while(GetMessage(&msg,NULL,0,0)) { //翻译一些键盘消息 //将msg结构返给windows以进行某些键盘消息的转换 TranslateMessage(&msg); //将消息发送给窗口过程 DispatchMessage(&msg); } //return msg.wParam; return 0; }
提示
(一)如果想要调用PlaySound函数,需要为环境添加winmm.lib的引用,否则会出现如下错误:
无法解析的外部符号 __imp__PlaySoundA@12,该符号在函数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) 中被引用。
具体配置步骤如下:
①:找到解决方案资源管理器,对自己的项目点击右键,选择属性
②:找到配置属性下的连接器下的输入
③:选择附加依赖项后的小三角
④:添加winmm.lib,点击确定,应用即可
⑤:点击运行,即可得到想要的效果
(二)我用的是windows XP经典开机音乐代替hellowin.wav,好资源是需要分享滴,在此分享给大家:helloWin