Windows SDK编程初探

 

Windows SDK编程初探

 

  要点:程序的主函数,消息处理函数

 

      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);

 

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

 

   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 讯息放入讯息伫列时的滑鼠座标。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值