进行Windows程序设计,实际上是在进行一种对象导向的程序设计(OOP)。这一点在Windows中使用得最多的对象上表现最为明显。这种对象正是Windows之所以命名为「Windows」的原因,它具有人格化的特征,甚至可能会在您的梦中出现,这就是那个叫做「窗口」的东西。

桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。另一类窗口是对话框,它可以有标题列也可以没有标题列。

装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。

作为对象,使用者会在屏幕上看到这些窗口,并通过键盘和鼠标直接与它们进行交互操作。更有趣的是,程序写作者的观点与使用者的观点极其类似。窗口以「消息」的形式接收窗口的输入,窗口也用消息与其它窗口通讯。对讯息的理解将是学习如何写作Windows程序所必须越过的障碍之一。

这有一个Windows的消息范例:我们知道,大多数的Windows程序都有大小合适的应用程序窗口。也就是说,您能够通过鼠标拖动窗口的边框来改变窗口的大小。通常,程序将通过改变窗口中的内容来响应这种大小的变化。您可能会猜测(并且您也是正确的),是Windows本身而不是应用程序在处理与使用者重新调整窗口大小相关的全部杂乱程序。由于应用程序能改变其显示的样子,所以它也「知道」窗口大小改变了。

应用程序是如何知道使用者改变了窗口的大小的呢?由于程序写作者习惯了往常的文字模式程序,操作系统没有设置将此类消息通知给使用者的机制。问题的关键在于理解Windows所使用的架构。当使用者改变窗口的大小时,Window给程序发送一个消息指出新窗口的大小。然后程序就可以调整窗口中的内容,以响应大小的变化。

「Windows给程序发送消息。」我们希望读者不要对这句话视而不见。它到底表达了什么意思呢?我们在这里讨论的是程序代码,而不是一个电子邮件系统。操作系统怎么给程序发送消息呢?

其实,所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息。这种位于Windows程序中的函数称为「窗口消息处理程序」。

无疑,读者对程序呼叫操作系统的做法是很熟悉的。例如,程序在打开磁盘文件时就要使用有关的系统呼叫。读者所不习惯的,可能是操作系统呼叫程序,而这正是Windows对象导向架构的基础。

程序建立的每一个窗口都有相关的窗口消息处理程序。这个窗口消息处理程序是一个函数,既可以在程序中,也可以在动态链接库中。Windows通过呼叫窗口消息处理程序来给窗口发送消息。窗口消息处理程序根据此消息进行处理,然后将控制传回给Windows。

更确切地说,窗口通常是在「窗口类别」的基础上建立的。窗口类别标识了处理窗口消息的窗口消息处理程序。使用窗口类别使多个窗口能够属于同一个窗口类别,并使用同一个窗口消息处理程序。例如,所有Windows程序中的所有按钮均依据同一个窗口类别。这个窗口类别与一个处理所有按钮消息的窗口消息处理程序(位于Windows的动态链接库中)联结。

在对象导向的程序设计中,对象是程序与数据的组合。窗口是一种对象,其程序是窗口消息处理程序。数据是窗口消息处理程序保存的信息和Windows为每个窗口以及系统中那个窗口类别保存的信息。

窗口消息处理程序处理给窗口发送消息。这些消息经常是告知窗口,使用者正使用键盘或者鼠标进行输入。这正是按键窗口知道它被「按下」的奥妙所在。在窗口大小改变,或者窗口表面需要重画时,由其它消息通知窗口。

Windows程序开始执行后,Windows为该程序建立一个「消息队列」。这个消息队列用来存放该程序可能建立的各种不同窗口的消息。程序中有一小段程序代码,叫做「消息循环」,用来从队列中取出消息,并且将它们发送给相应的窗口消息处理程序。有些消息直接发送给窗口消息处理程序,不用放入消息队列中。

如果您对这段Windows架构过于简略的描述将信将疑,就让我们去看看在实际的程序中,窗口、窗口类别、窗口消息处理程序、消息队列、消息循环和窗口消息是如何相互配合的。这或许会对您有些帮助。

HELLOWIN程序

建立一个窗口首先需要注册一个窗口类别,那需要一个窗口消息处理程序来处理窗口消息。处理窗口消息对每个Windows程序都带来了些负担。程序3-1所示的HELLOWIN程序中整个做的事情差不多就是料理这些事情。

程序3-1 HELLOWIN

HELLOWIN.C
/*------------------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
-----------------------------------------------------------------------*/
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND   hwnd ;
MSG    msg ;
WNDCLASwndclass ;
wndclass.style        = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc  = WndProc ;
wndclass.cbClsExtra   = 0 ;
wndclass.cbWndExtra   = 0 ;
wndclass.hInstance    = hInstance ;
wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuNam  = NULL ;
wndclass.lpszClassName= szAppName ;
if (!RegisterClass (&wndclass))
{
MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
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
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC                   hdc ;
PAINTSTRUCT ps ;
RECT          rect ;
switch (message)
{
case WM_CREATE:
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case   WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case   WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}

Windows程序设计相关推荐

  1. Windows程序设计学习笔记(1):一个简单的windows程序

    <Windows程序设计>(第五版)(美Charles Petzold著) 1 #include<windows.h> 2 3 LRESULT CALLBACK WndProc ...

  2. Windows程序设计------字体不等宽引出的问题及其细节知识

    在写Windows程序设计的Typer程序时,我并不是在每一个使用HDC的地方都重新创建选中字体,而是在一开始选中之后,就没有再删除它,代码如图: 结果我的字体不是等宽字体! 起先我以为是没有设置WM ...

  3. Windows程序设计“圣经”

    Windows程序设计"圣经" 十年依旧畅销不衰的神品 传奇大师带你走入Windows编程圣殿 "Windows程序设计最举足轻重的书当然就是Charles Petzol ...

  4. 侯捷:搞Windows程序设计我们需要啥

    侯捷:搞Windows程序设计我们需要啥 如果你是一位资深的Windows程序员,相信你对Jeffrey Richter一定不会陌生,是不是有些崇拜和景仰?如果你是一位刚涉足这个领域的Windows程 ...

  5. Windows程序设计之创建窗口示例

    Windows程序设计书本上的创建窗口示例,手敲代码,拿出了show,记录一下而已~~~ 一.代码如下: #include <tchar.h> #include <windows.h ...

  6. c语言lnk1168无法打开exe,跪求大佬帮帮看看LINK : fatal error LNK1168: 无法打开 F:\windows程序设计\窗口\......

    马上注册,结交更多好友,享用更多功能^_^ 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 运行的结果显示是这样: 1>------ 已启动生成: 项目: 窗口, 配置: Debug W ...

  7. createprocess重启程序_C++_VC程序设计中CreateProcess用法注意事项,对于windows程序设计来说,启动 - phpStudy...

    VC程序设计中CreateProcess用法注意事项 对于windows程序设计来说,启动一个进程有三种方法:WinExec,ShellExecute,CreateProcess.这里仅对Create ...

  8. windows程序设计.第一个windos程序

    Windows程序设计(第5版) windows程序需要调用API. 第一个Windows程序 1 /*HelloMsg.c -- Displays "Hello World!" ...

  9. [渝粤教育] 中国地质大学 Windows程序设计 复习题 (2)

    <Windows程序设计>模拟题 一单选题 1.所有的Windows应用程序都是由()驱动的. A.事件 B.消息 C.命令 D.菜单 2.一般应用程序不会派生自己的()类. A.主框架 ...

  10. MATLAB飞机大战第二版,windows程序设计——飞机大战札记(单文档文件登陆界面)...

    windows程序设计--飞机大战笔记(单文档文件登陆界面) //2015/07/21 /by xbw/// /环境 VS 2013 飞机大战做的差不多了,闲来无事加点高大上的东西,关于单文档的登陆界 ...

最新文章

  1. 如何把 XML 文件显示为 HTML 表格
  2. php 实现对称加密算法,PHP实现简单的对称加密和解密方法
  3. Xamarin.iOS项目提示error MSB3174:”TargetFrameworkVersion”的值无效
  4. php install with mysql on w2k3 and IIS mannually
  5. git diff的用法
  6. Python2.x自学笔记(一)——Json格式与请求
  7. php动态+trait,详解PHP神奇又有用的Trait
  8. tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导
  9. IOS-状态栏的简单操作
  10. vue : 引入、安装 jquery 、bootstrap
  11. [gtest][001] A quick introduction to the Google C++ Testing Framework
  12. adnroid中LayoutParams的简单总结
  13. 中国石油大学--生活学习简易FAQ
  14. 计算机毕业设计-SSM在线视频教育网站-JavaWeb在线视频教育网站
  15. 除了php云和骑士还有什么_PHP云人才系统 VS 骑士cms人才系统
  16. 三剑客python自学笔记--02
  17. 最快的 Hexo 博客搭建方法
  18. 机动车污染排放检验信息系统信息化建设目标及规范
  19. 半监督3D医学图像分割(三):URPC
  20. 基础——树莓派3B配置

热门文章

  1. 基于Java+数据爬虫+SSM架构实现手机购物网站前后台项目
  2. 软考计算机网络知识点,软考网络管理员备考知识点精讲之计算机网络的分类
  3. 网页自动浏览.刷票.自动留言之登陆篇(VB)
  4. BMP180气压传感器调试
  5. 莫烦python教程下载_Python 有哪些好的学习资料或者博客?
  6. 从BIO到NIO、AIO和零拷贝
  7. 2021年毕节民中高考成绩查询,毕节民族中学2021年排名
  8. PSP自制固件procfw编译 – 小问题汇总
  9. 养龟小记-宠物的命运
  10. FFmpeg 编译安装使用总结