查看: 2883|回复: 24

Windows SDK编程初探

[复制链接]
发表于 2012-9-30 06:42:00 | 显示全部楼层 |阅读模式
要点:程序的主函数,消息处理函数

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

主函数:就像C语言时程序的主函数main()的功能是一样的,他代表了程序的入口。但是这个函数看上去比main()似乎繁的多,如果是第一次看见这个函数肯定会感觉一头雾水,但是不要紧我们来看看这个函数各个参数的意义,(其实开始的时候完全可以不理会他们的意义)hInstance是本实例的句柄,句柄可以理解为操作系统管理使用我们的应用程序的别名,它跟指针类似但又不同于指针,操作系统通过hInstance就可以找到我们现在的这个程序。hPrevInstance是前一个实例的句柄。

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

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





消息处理函数其实是一个消息循环,是一个回调函数,什么是回调函数暂不管它,只管理解为,函数由你定义而不归你调用,是由操作系统来调用的

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);
[/td][/tr]
[/table]
发表于 2012-9-30 18:10:49 | 显示全部楼层
一个鸡蛋跑到青藏高原,结果它变成了氢弹;  
发表于 2012-10-1 13:14:23 | 显示全部楼层
长时间没来看了 ~~  
发表于 2012-10-2 03:13:22 | 显示全部楼层
一个有信念者所开发出的力量,大于99个只有兴趣者。  
发表于 2012-10-2 08:49:30 | 显示全部楼层
应该加分  
发表于 2012-10-3 18:19:57 | 显示全部楼层
顶你一下,好贴要顶!  
发表于 2012-10-6 11:57:23 | 显示全部楼层
女人啊真是那句话~~~无理占三分~~忘记怎么说了 呵呵 ~~你帮我想想  
发表于 2014-10-6 21:47:30 | 显示全部楼层
天泽在线http://www.ak69v.com,升官发财  
发表于 2015-2-27 21:05:31 | 显示全部楼层
呵呵 哪天得看看 `~~~~  
发表于 2015-3-28 06:25:09 | 显示全部楼层
呵呵 那就好好玩吧~~~~  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则