API入门 一个正规的SDK程序
来源:优易学  2011-3-31 15:06:30   【优易学:中国教育考试门户网】   资料下载   IT书店
 
 上面的WNDCLASS的各个成员值我就不一一介绍是什么含义,MSDN上面讲的非常清楚,我只讲一两个比较重点的,第一个lpszClassName这个成员,我们给它指定的是_T("MyWindowClass")这个担馐侵付ㄕ飧龃翱诶嗟拿质鞘裁矗蛭旅娴拇唇ù翱诨嵊玫秸飧雒帧?/p>
  lpfnWndProc这个成员是WinMessageProc这个函数,这是指定这个窗口类所创建的窗口的消息处理函数是哪一个,我们这里指定的是WinMessageProc。其他的参数我就不啰嗦了,各位不懂的MSDN一下或者在群里来交流一下。
  指定了这个窗口类有哪些特性后就完了?当然没有,没有注册怎么使用啊,所以还需要注册,注册调用RegisterClassEx这个API函数,将刚才的WNDCLASS变量的地址传给它就可以进行注册了,如果注册失败,返回值为零,成功的话返回值为非零。
  注册了窗口类,我们来第二步,创建一个窗口。代码如下:
  // 根据上面注册的一个名叫MyWindowClass 的窗口类创建窗口
  HWND newWind = CreateWindowEx( 0L, _T("MyWindowClass"), _T("beyondcode"), WS_OVERLAPPEDWINDOW, 0, 0, 200, 200, NULL, NULL, hInstance, NULL );
  if( NULL==newWind )
  {
  MessageBox( NULL, _T("创建窗口出错"), _T("出错"), MB_OK );
  return 0;
  }
  ShowWindow( newWind, nShowCmd );
  UpdateWindow( newWind );
  可见,创建窗口用CreateWindowEx这个API函数,它的第一个参数是扩展样式,我们这里不设置扩展样式,所以传递0L,第二个参数就是窗口类的名字,我们这里指定我们上面已经注册了的那个名叫MyWindowClass的窗口类,第三个参数是窗口的标题,随便设置,第四个参数是窗口的样式,我们这里设置的是WS_OVERLAPPEDWINDOW,一般主窗口都用这个样式,就是有最大化,最小化框,有标题栏,有系统菜单。。具体的可以参见MSDN,第五个,六个,七个,八个参数分别指定窗口的初始坐标和长宽,第九个参数指定父窗口是哪个,这里没有父窗口,所以传递NULL,第十个参数指定菜单的句柄,我们这里不设置菜单,所以传递NULL,第十一个是应用程序句柄,用WinMain传递进来的那个hInstance参数,第十二个参数表示额外数据,不设置,所以为NULL。
  这个API函数有点复杂,不过用熟悉了也就不觉得了。这样我们就创建了一个窗口,返回值是一个窗口的句柄,如果是NULL的话,说明创建窗口失败了,如果不是NULL的话,说明成功了。
  ShowWindow和UpdateWindow,参数就是刚才创建成功的那个窗口的句柄,至于ShowWindow的第二个参数是指显示的类型,是最大化显示呢还是最小化显示呢,不过在程序中第一次调用ShowWindow必须使用WinMain所传递进来的参数的第四个参数的值。这是MSDN上说的~
  窗口创建成功了,下面一步是消息循环了,消息循环说起来复杂,其实代码挺简单的,而且基本格式固定,如下:
  //消息循环
  MSG msg;
  while( GetMessage( &msg, NULL, 0, 0 ) )
  {
  TranslateMessage( &msg );
  DispatchMessage( &msg );
  }
  看到了吗? 一直在一个循环里面,一直调用GetMessage,只要GetMessage所取得的消息不是WM_QUIT的话,那么GetMessage的返回值就不是0,那么循环就一直进行。在循环内部,将GetMessage取得的消息传递给TranslateMessage和DispatchMessage两个API函数进行处理.其中DispatchMessage就是将消息发送给了对应的窗口的窗口消息处理函数进行处理。至于TranslateMessage呢,则进行一些消息的转换,可以先不深究。
  最后就是编写窗口消息处理函数的代码了,你需要处理那些消息,那么你就编写处理那些消息的代码,对于你不处理的消息,则统统交给一个叫DefWindowProc的API函数进行默认的处理。
  LRESULT CALLBACK WinMessageProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
  {
  switch ( msg )
  {
  case WM_DESTROY:
  {
  PostQuitMessage( 0 );
  break;
  }
  default:
  return DefWindowProc( hwnd, msg, wParam, lParam );
  }
  return 0;
  }
  这里我们只处理了WM_DESTROY这个消息,这个消息是在窗口被销毁的时候发送给窗口消息处理函数的,在窗口处理函数中,我们判断这个消息是不是WM_DESTROY,如果是,就调用PostQuitMessage这个API函数,如果是其他消息,我们就不管,将参数全部传递给DefWindowProc这个函数进行处理。
  而PostQuitMessage这个API函数的功能就是发送一个WM_QUIT的消息。而我们前面说到过, 在消息循环中GetMessage一旦取得WM_QUIT这个消息,就返回值为0,那么消息循环也就结束了,进而整个程序也就结束了,如果在这里我们处理WM_DESTORY函数,但是不调用PostQuitMessage,那么结果会怎样呢,读者朋友们思考一下~~
  好了,到这里,这个什么功能也没有的SDK程序也就完了,它只显示一个带有标题栏的可最大化,最小化的窗口,除了能够关闭它,你几乎不能进行其他任何操作,因为我们除了处理窗口销毁这个消息,其他任何消息我们都没处理。

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训