API入门系列之一个正儿八经的SDK程序计算机二级考试

文章作者 100test 发表时间 2009:06:15 09:03:47
来源 100Test.Com百考试题网


  上一篇,讲了一个简单的SDK程序的多种版本的编写,弹出了一个窗口,显示了我们计算1到10的结果,计算的程序不是重点,重点在于,一:让大家认识到Unicode版本的程序和ASCII版本的程序在编程方面的区别,以及怎么样编写出通用代码的程序。二:怎么样运用API或者c 库函数格式化非字符数据到一个字符串中显示出来。
  不过,那个相当简单的程序,还算不上是一个正儿八经的SDK程序,也就是说还不是一个纯爷们儿,因为我们并亲自完成一个SDK程序的经典步骤。而是调用了一个MessageBox API函数,这个函数虽然使用简单,但是在它的内部,那可是相当复杂啊~~~。怎么个复杂法,具体的我不知道,但是我知道的是一个SDK程序的经典步骤它是都用到了的,什么是编写SDK程序的经典步骤呢?新手朋友们听好了哦,现在我就告诉你。
  第一步:注册窗口类
  第二步:创建窗口
  第三步:消息循环
  第四步:编写窗口消息处理函数
  上面我所说的,听起来都比较专业,下面我就解释一下,什么是注册窗口类呢?注册窗口类就是使用一个 窗口类结构体(WNDCLASSEX) 来描述一类窗口,这类窗口具有相同的属性,也就是你在结构体WNDCLASSEX中指定的那些值。只要是用这个窗口类创建的窗口都具有这些特性。至于WNDCLASS能描述哪些特性,下面会具体讲,这里你只要了解是用一个名叫WNDCLASSEX的结构体来描述一个窗口的类别。
  创建窗口应该比较好理解吧,就是创建一个具体的窗口,好像是一句废话嘛。也就是说这个窗口是根据一个窗口类而创建的,不是凭空而造的。意思是你要创建一个窗口,那么必须要有一个已经注册的窗口类。
  对于前两步,我打一个比方,就好比你要造一辆车,那们第一步首先是干什么? 当然是设计图纸啦,图纸上就有说明这种车有哪些特性。然后第二步才是根据这个图纸来创建一个具体的看得见的车。所以我上面说的注册窗口类就好比设计窗口的图纸,然后就是根据这个窗口的图纸来创建一个具体的窗口。都说成这样了,应该明了了吧~~
  至于消息循环,就是创建的窗口随时都有可能发生很多事情,那么发生的这些事情怎么通知你呢?比如窗口最小化了,窗口大小改变了,怎么通知你呢?  其实就就是通过消息循环不断的取得窗口所发生的事情,然后以消息的形式发送给我们后面要介绍的窗口消息处理函数。
  消息处理函数呢就是我们程序员负责编写代码对具体的消息进行具体的处理,当然你也可以不处理,交给系统的默认处理函数来处理。
  对于这两步,我也打一个比方。消息循环就好比汽车的一个总传感器,它源源不断的将汽车内部所发生的事情以消息的形式通过仪表板传达给开车的人,开车的人根据具体的事情而采取具体的操作,当然你也可以不操作,无动于衷,对于windows消息来说,不操作倒没有什么,而对于开车的人来说,不操作的后果就不好说了。 在这里,这个总传感器就相当于SDK程序的消息循环,不断的发送消息,而开车的人就相当于窗口消息处理函数,负责处理各种消息。明白了吧,还不明白的话就看看下面的具体的程序吧,也需还有最后一丝希望可以让你恍然大悟。
  讲了正儿八经的SDK程序的经典步骤后,我们进入正式的代码阶段,通过代码结合上面所讲理论进一步巩固知识。我讲逐步讲解并逐步编写一个自己注册窗口类,创建窗口,带消息循环,并自己编写消息处理过程的程序。
  首先给出程序框架
  /* BY beyondcode */
  #include
  #include
  LRESULT CALLBACK WinMessageProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ).
  int WINAPI _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nShowCmd )
  {
  return 0.
  }
  第一个函数声明,返回类型为LRESULT,本质经查看是long,然后函数调用约定CALLBACK和WINAPI是一样的,都是__stdcall,说明函数调用相关的约定,不必深究。你只负责编写它的代码,至于调用,系统会在有消息的时候自动调用它。WinMessageProc的参数类型和个数是规定好了的,不然系统怎么知道怎么掉用,所以不能更改。
  再解释一下这四个参数吧,第一个参数是一个窗口的句柄,也就是告诉你,是哪个窗口的消息,第二个参数是消息的类型,告诉你是什么消息,第三个和第四个参数是这个消息所带的一些额外的但是必须的数据。你在窗口消息处理函数中只使用他们就可以了,他们的值都是系统传递进来的。你只是根据他们来判断是哪个窗口的什么消息,并且获取该消息的额外参数信息。
  有了程序框架,我们来第一步,注册一个窗口类
   //注册一个名叫MyWindowClass的窗口类
  WNDCLASSEX wc.
  wc.cbSize = sizeof( wc ).
  wc.style = CS_VREDRAW | CS_HREDRAW.
  wc.cbClsExtra = 0.
  wc.cbWndExtra = 0.
  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH).
  wc.hCursor = LoadCursor( NULL, IDC_ARROW ).
  wc.hIcon = LoadIcon( NULL, IDI_APPLICATION ).
  wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION ).
  wc.hInstance = hInstance.
  wc.lpfnWndProc = WinMessageProc.
  wc.lpszMenuName = NULL.
  wc.lpszClassName = _T("MyWindowClass").
  if( !RegisterClassEx( &.wc ) )
  {
  MessageBox( NULL, _T("注册窗口类出错"), _T("出错"), MB_OK ).
  return 0.
  }

相关文章


API入门系列之Unicode还是ASCII计算机二级考试
API入门系列之一个相当简单的SDK程序计算机二级考试
API入门系列之一个正儿八经的SDK程序计算机二级考试
计算机二级VB控件:Data控件的主要方法计算机二级考试
计算机二级VB控件:数据感知控件的属性计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛