日期:2014-05-17  浏览次数:20981 次

Windows窗口和消息(2)

Windows窗口和消息(2)
2011年01月20日
  建立窗口 本文内容来自于Windows 程序设计>一书
  作者:Charles Petzold
  译 者:余孟学
  校阅者:林昭仁
  注意文章内容和书中原文并不完全一样,要的地方加入了自己的想法,所以不一定正确!  窗口类定义了窗口的一般特征,因此可以使用同一窗口类别建立许多不同的窗口。实际调用CreateWindow建立窗口时,可能指定有关窗口的更详细的信息。
  Windows程序设计新手有时会混淆窗口类别和窗口之间的区别,以及为什么一个窗口的所有特征不能被一次设定好。实际上,以这种方式分开这些样式信息是非常方便的。例如,所有的按钮窗口都可以依据同样的窗口类别来建立,与这个窗口类别相关的窗口消息处理程序位于Windows内部。由窗口类别来负责处理按钮的键盘和鼠标输入,并定义按钮在屏幕上的外观形象。从这一点看来,所有的按钮都是以同样的方式工作的。但是并非所有的按钮都是一样的。它们可以有不同的大小,不同的屏幕位置,以及不同的字符串。后面的这样一些特征是窗口定义的一部分,而不是窗口类定义的。
  传递给RegisterClass函数的信息会在一个资料结构中设定好,而传递给CreateWindow函数的信息会在函数单独的参数中设定好。下面是HELLOWIN.C中的CreateWindows调用,每一个栏位都做了完整的说明:
  hwnd = CreateWindow (szAppName,    // window class name
  TEXT (   "The Hello Program"),     // window caption
  WS_OVERLAPPEDWINDOW,          // window style
  CW_USEDEFAULT,               // initial x position
  CW_USEDEFAULT,               // initial y position
  CW_USEDEFAULT,               // initial x size
  CW_USEDEFAULT,               // initial y size
  NULL,                            // parent window handle
  NULL,                        // window menu handle
  hInstance,                       // program instance handle
  NULL) ;                          // creation parameters
  标记为「window class name」的参数是szAppName,它含有字符串「HelloWin」-这是程序注册的窗口类别名称。这就是我们建立的窗口联结窗口类别的方式。
  此程序建立的窗口是一个普通的重叠式窗口。它含有一个标题列,标题列左边有一个系统菜单按钮,标题列右边有缩小、放大和关闭图标,四周还有一个表示窗口大小的边框。这是标准样式的窗口,名为WS_OVERLAPPEDWINDOW,出现在CreateWindow的「窗口样式」参数中。如果看一下WINUSER.H,您将会发现此样式是几种位旗标的组合:
  #define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED| \
  WS_CAPTION                                    | \
  WS_SYSMENU                                    | \
  WS_THICKFRAME                             | \
  WS_MINIMIZEBOX                            | \
  WS_MAXIMIZEBOX)
  「窗口标题」是显示在标题列中的文字。
  注释著「initial x position」和「initial y position」的参数指定了窗口左上角相对于屏幕左上角的初始位置。由于这些参数使用CW_USEDEFAULT识别字,指示Windows使用重叠窗口的内定位置。(CW_USEDEFAULT定义为0x80000000。)内定情况下,Windows依次对新建立的窗口定位,使各窗口左上角的垂直和水平距离在屏幕上按一定的大小递增。与此类似,注释著「initial x size」和「initial y size」的参数分别指定窗口的宽度和高度。同样使用了CW_USEDEFAULT识别字,表明希望Windows使用内定尺寸。
  在建立一个「最上层」窗口,如应用程序窗口时,注释为「父窗口句柄」的参数设定为NULL。通常,如果窗口之间存在有父子关系,则子窗口总是出现在父窗口的上面。应用程序窗口出现在桌面窗口的上面,但不必为调用CreateWindow而找出桌面窗口的句柄。
  因为窗口没有菜单,所以「窗口菜单句柄」也设定为NULL。「程序执行实体句柄」设定为执行实体句柄,它是作为WinMain的参数传递给这个程序的。最后,「建立参数」指针设定为NULL,可以用这个参数访问稍后程序中可能引用到的资料。
  Cr