首页    新闻    下载    文档    论坛     最新漏洞    黑客教程    数据库    搜索    小榕软件实验室怀旧版    星际争霸WEB版    最新IP准确查询   
名称: 密码:      忘记密码  马上注册
安全知识 :: windows技术

Windows SDK编程初探


http://www.gipsky.com/
要点:程序的主函数,消息处理函数



Windows程序具有相对稳定的结构,也就是说Windows程序是有一定的框架的,程序员要做的事情就是用特定的内容来填充这个框架。



主函数:就像C语言时程序的主函数main()的功能是一样的,他代表了程序的入口。但是这个函数看上去比main()似乎繁的多,假如是第一次看见这个函数肯定会感觉一头雾水,但是不要紧我们来看看这个函数各个参数的意义,(其实开始的时候完全可以不理会他们的意义)hInstance是本实例的句柄,句柄可以理解为<b><a href=http://www.baidu.com/s?tn=piglet&ct=&lm=&z=&rn=&word=操作系统 target="_blank"><font color=red>操作系统</font></a></b>治理使用我们的应用程序的别名,它跟指针类似但又不同于指针,<b><a href=http://www.baidu.com/s?tn=piglet&ct=&lm=&z=&rn=&word=操作系统 target="_blank"><font color=red>操作系统</font></a></b>通过hInstance就可以找到我们现在的这个程序。hPrevInstance是前一个实例的句柄。



szCmdLine:是命令行参数,iCmdShow是窗口的显示方式。现在我们没有必要清除每个参数的具体意义,在接下来的学习中我们用的最多的就是hInstance这个参数,但也不多,而且我们使用vc 时,无论有哪种程序生成方式这个函数一般都会自动生成。



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)











消息处理函数其实是一个消息循环,是一个回调函数,什么是回调函数暂不管它,只治理解为,函数由你定义而不归你调用,是由<b><a href=http://www.baidu.com/s?tn=piglet&ct=&lm=&z=&rn=&word=操作系统 target="_blank"><font color=red>操作系统</font></a></b>来调用的



LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)



{



switch(message)



{



case...



case...//这些分支语句用来分别处理不同的消息



}



return DefWindowProc(hwnd,message,wParam,lParam);



/*这个函数是系统默认的消息处理函数,也就是说,我们的窗口程序的消息处理函数处理的只是我们感爱好的消息,即上面的case语句,对于其他的消息我们还是使用系统默认的消息处理函数。我们的消息处理函数是要在我们的窗口主程序中登记的,登记为我们自定义的消息处理函数之后,系统的消息就有它来处理了。所以,在本函数的最后要使用该默认函数,否则其他的消息,本程序就无法处理了。







继续来看程序的主函数,它是程序的容器,程序的主窗体要在其中建立,程序的消息处理函数也要在其中设置。在主体函数中我们要做的就是两件事,一件是注册窗口类,另外一件是建立窗口。所谓注册窗口类就是通过填写一个WNDCLASS结构,我们的窗口就算基本成型,然后要向系统注册。



客户需要自己建立窗口,建立后会得到系统返回的窗口句柄(HWND),后继的针对窗口的操作都针对句柄进行。



  1.注册窗口类

  建立窗口前,需要制定好这个窗口的相关属性,最主要的就是将自己定义的消息处理函数与窗口关联,其他的属性还包括:菜单、图标等等。

  这个属性指定步骤是通过指定"窗口类"来完成的。

  对于自己建立的窗口,这个"窗口类"需要自己制定,也即自己填充一个WNDCLASS结构,然后向系统注册。

  对于一些非凡窗口,如按钮等控件,他们的行为是系统制定好了的,所以不需要自己注册,直接使用对应的“窗口类”名称就行了。

  2.建立窗口

  建立窗口时,注册的"窗口类"名称作为参数传入。

  这样,当有针对该窗口的消息时,将调用“窗口类”中指定的消息处理函数,在其中得到处理。



LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//消息处理函数的声明,定义放在主函数后面



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)



{



static TCHAR szAppName[]=TEXT("Hello");//注册的窗口类的名称,此处为"Hello"



WNDCLASS wndclass;//定义了一个窗口类



wndclass.style=CS_HREDRAW|CS_VREDRAW;



wndclass.lpfnWndProc=WndProc;//此处关联了定义的消息处理函数



wndclass.cbClsExtra=0;



wndclass.cbWndExtra=0;



wndclass.hInstance=hInstance;//实例句柄



wndclass.hIcon=NULL;//窗口的图标,我们这里不设置



wndclass.hCursor=LoadCursor(NULL,IDC_ARROR);//设置光标



wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//画刷



wndclass.lpszMenuName=NULL;



wndclass.lpszClassName=szAppName;//类名称



if(!RegisterClass(&wndclass))//注册窗口



{



MessageBox(NULL,TEXT("窗口注册失败"),szAppName,MB_ICONERROR);



return 0;



}



//下面开始建立窗口



HWND hwnd;



hwnd=CreateWindow(szAppName,TEXT("The Hello Program"),



CW_OVERLAPPEDWINDOW,



CW_USEDEFAULT,



CW_USEDEFAULT,



CW_USEDEFAULT,



CW_USEDEFAULT,



NULL,



hInstance,



NULL);



ShowWindow(hwnd,iCmdShow);



UpdateWindow(hwnd);



//接下来是消息循环,程序不断的从消息队列中取消息,让消息处理函数处理



while(GetMessage(&msg,NULL,0,0))



{



TranslateMessage(&msg);



DispatchMessage(&msg);



}



return msg.wParam;



}



//消息处理函数定义



LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM)//此例子中我们只是处理简单的消息



{



switch(message)



{



case WM_DESTROY:



PostQuitMessage(0);



return 0;



}



return ::DefWindowProc(hwnd,message,wParam,lParam);



}



WINMAIN()



{



申明一个窗口类;



注册该窗口类;



生成一个窗口;



消息循环;



}



WINPROC()



{



针对不同的消息做不同的处理;//switch case default



}



――――――――――――――――――――――――――――――――



消息结构如下:



typedef struct tagMSG



{



HWND hwnd ;



UINT message ;



WPARAM wParam ;



LPARAM lParam ;



DWORD time ;



POINT pt ;



}



MSG, * PMSG ;



。。。。hwnd 接收讯息的视窗代号。在HELLOWIN程式中,这一参数与CreateWindow传回的hwnd值相同,因为这是该程式拥有的唯一视窗。



。。。。message 讯息识别字。这是一个数值,用以标识讯息。对於每个讯息,均有一个对应的识别字,这些识别字定义於Windows表头档案(其中大多数在 WINUSER.H中),以字首WM(「window message」,视窗讯息)开头。例如,使用者将滑鼠游标放在HELLOWIN显示区域之内,并按下滑鼠左按钮,Windows就在讯息伫列中放入一个讯息,该讯息的message栏位等於WM_LBUTTONDOWN。这是一个常数,其值为0x0201。



。。。。wParam 一个32位元的「message parameter(讯息参数)」,其含义和数值根据讯息的不同而不同。



。。。。lParam 一个32位元的讯息参数,其值与讯息有关。



。。。。time 讯息放入讯息伫列中的时间。



。。。。pt 讯息放入讯息伫列时的滑鼠座标。
<< COM接口在不同线程中的传递技巧两则 如何进入程序设计的领域 >>
评分
10987654321
API:
gipsky.com& 安信网络
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。

系统导航

 

Copyright © 2001-2010 安信网络. All Rights Reserved
京ICP备05056747号