上次,我们在第一个Windows程序中,弹出了一个对话框,对话框是Windows窗口中的一种,但是,这个对话框不是我们自己写的,而是微软写的,并将它封装在Usr32.dll中,供我们使用,相信,很多人在想,如何自己写一个窗口吧,今天,我会让你们如愿以偿,我们今天的目标就是一起写一个windows窗口,虽然这个窗口非常简单,但是,它却描述了创建一个窗口需要的所有东西。具体如例1所示。
例1 我们的第2个程序
/* ************************************ *《Windows程序设计快速入门》 * 我们的第2个程序 **************************************/ /* 预处理 */ /* 头文件 */ #include <windows.h> /* 全局变量 */ HINSTANCE hinst; /* 函数声明 */ int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int); LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); /* ************************************ * 功能:显示一个窗口 **************************************/ int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wcx; // 窗口类 HWND hwnd; // 窗口句柄 MSG msg; // 消息 BOOL fGotMessage; // 是否成功获取消息 hinst = hinstance; // 应用程序实例句柄,保存为全局变量 // 填充窗口类的数据结构 wcx.cbSize = sizeof(wcx); // 结构体的大小 wcx.style = CS_HREDRAW | CS_VREDRAW; // 样式:大小改变时重绘界面 wcx.lpfnWndProc = MainWndProc; // 窗口消息处理函数 wcx.cbClsExtra = 0; // 不使用类内存 wcx.cbWndExtra = 0; // 不使用窗口内存 wcx.hInstance = hinstance; // 所属的应用程序实例句柄 wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 图标:默认 wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // 光标:默认 wcx.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH); // 背景:白色 wcx.lpszMenuName = NULL; // 菜单:不使用 wcx.lpszClassName = "MainWClass"; // 窗口类名 wcx.hIconSm = (HICON)LoadImage(hinstance, // 小图标 MAKEINTRESOURCE(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR); // 注册窗口类 if (!RegisterClassEx(&wcx)) { return 1; } // 创建窗口 hwnd = CreateWindow( "MainWClass", // 窗口名 "我们的第二个程序", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口样式 CW_USEDEFAULT, // 水平位置X:默认 CW_USEDEFAULT, // 垂直位置Y:默认 CW_USEDEFAULT, // 宽度:默认 CW_USEDEFAULT, // 高度:默认 (HWND)NULL, // 父窗口:无 (HMENU)NULL, // 菜单:使用窗口类的菜单 hinstance, // 应用程序实例句柄 (LPVOID)NULL); // 窗口创建时数据:无 if (!hwnd) { return 1; } // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 while ( (fGotMessage = GetMessage(&msg, (HWND)NULL, 0, 0)) != 0 && fGotMessage != -1) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* ************************************ * MainWndProc * 功能:窗口消息处理函数,对所有的消息都使用默认处理函数 **************************************/ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_DESTROY: ExitThread(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } }运行效果如图1所示:
图1 运行效果
程序的运行效果如图1所示,虽然非常简单,但是却可以帮助我们建立信心,希望大家回去实践一下,下次课程,我们主要讲解这个程序的流程。