C语言编写Windows下的实用程序:[3]窗口
1、打开VS2010,建立Win32项目SimpleWindow。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/732a12e265e7340f9a76f69035b9763e20c2b4a6.jpg)
2、设置项目为"空白项目",从而不让VS2010为我们生成代码。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/ba97ffd06de89a61812aa32045e8b004551bada6.jpg)
3、在项目中添加"SimpleWindow.cpp"文件。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/b1454a1bd10ff2260395d3bd9c99e92abbb8a4a6.jpg)
4、这里我们要介绍几个Windows的函数,首先是RegisterClassEx函数。
该函数注册在随后调用CreateWindow函数和CreateWindowEx函数中使用的窗口类。 RegisterClass函数己经由函数RegisterClassEx函数来代替,但是,如始著果不需要设置类的小目标则仍然可以使用RegisterClass函数。
可以参见微软的msdn。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/430174fec314f1c582e1a3723c27ac5307889da6.jpg)
5、CreateWindowEx函数:
该函数创建一个具有扩展风格的层叠式窗口、弹出式窗口或子窗口,其他与CreateWindow函数相同。关于创建窗口和其他参数的内容,请参看CreateWindow。具体仍可见微软的msdn。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/906dbbcadce8904820f39544130e5f20427192a6.jpg)
6、消息处理函数WindowProc :
该函数是一个应用程序定义的函数。它处理发送给窗口的消息。WINDPROC类型定义了一个指向该回调函数的指针。WindowProc是用于应用程序定义函数的占位符。
函数原型:
LRESULT CALLBACK WindowProc (HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
参数:
hwnd:指向窗口的句柄。
uMsg:指定消息类型。
wParam:指定其余的、消息特定的信息。该参数的内容与UMsg参数值有关。
IParam:指定其余的、消息特定的信息。该参数的内容与uMsg参数值有关。
返回值:返回值就是消息处理结果,它与发送的消息有关。
速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0 以上版本;头文件:winuser.h;库文件:用户自定义。
我们这里的窗口处理函数,如图所示,并没有做太多工作,而只是做了简单的消息处理。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/994f412043715fdb102f5b89468920c5270f8ca6.jpg)
7、最终SimpleWindow的代码如下:
#include <Windows.h>
#include <tchar.h>
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
int WinMain(
__in HINSTANCE hInstance,
__in_opt HINSTANCE hPrevInstance,
__in LPSTR lpCmdLine,
__in int nShowCmd
)
{
TCHAR *szName = _T("myWindow");
WNDCLASSEX wc = {0};
HWND hWnd = NULL;
MSG Msg = {0};
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//通过函数来设置一个白色的背景,这里大家设置为NULL看看,会很有趣的
wc.hCursor = NULL;//不设置
wc.hIcon = NULL;//不设置
wc.hIconSm = NULL;//不设置
wc.hInstance = hInstance;//当前程序的句柄,hInstance是有系统给传递的
wc.lpfnWndProc = WinProc;//窗口处理过程的回调函数。
wc.lpszClassName = szName;//窗口类的铲雁名字。
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&wc);//在系统中注册
hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,szName,_T("我的窗口我喜欢"),WS_OVERLAPPEDWINDOW,
200,100,600,400,NULL,NULL,hInstance,NULL);//创建缝棍蕉窗口,窗口标题为"我的窗口我喜欢"
if(hWnd == NULL)
{
MessageBox(NULL,_T("There's an Error"),_T("Error Title"),MB_ICONEXCLAMATION|MB_OK);
return 0;
}
ShowWindow(hWnd,nShowCmd);//显示窗口
UpdateWindow(hWnd);
//下面是对消息的循环处理,大家先不必管这些,下节课我会细说的
while(GetMessage(&Msg,NULL,0,0))
{
TranslateMessage(&Msg);//翻译消息
DispatchMessage(&Msg);//分派消息
}
return Msg.message;
}
//消息处理函数
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
switch(Msg)//处理消息过程
{
case WM_DESTROY://响应鼠标单击关闭按钮事件
PostQuitMessage(0);//退出消息队列
return 0;//退出函数
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
}
编译链接后,得到如图中所示,可以看到我们自己的窗口程序就出来了。
![C语言编写Windows下的实用程序:[3]窗口](https://exp-picture.cdn.bcebos.com/b87bd38920c5260fa33a3f39d2de4507890189a6.jpg)