《WINDOWS编程启示录》PDF下载

  • 购买积分:12 如何计算积分?
  • 作  者:(美)RAYMOND CHEN著;聂雪军译
  • 出 版 社:北京:机械工业出版社
  • 出版年份:2007
  • ISBN:9787111219194
  • 页数:335 页
图书介绍:本书通过一系列短文来讲解Windows基本原理,例如:窗口和对话框的管理机制,如何设计像自动售货机那样有效的用户界面,对性能优化的理解,向后兼容的关键技术细节,Windows程序的安全漏洞,如何使程序更好地在Windows系统中运行等。本书不仅讲解Windows幕后的许多故事、宝贵的技术建议,还包括了许多启发性的轶事,这些都将帮助读者最大程度地理解Windows。本书面向的读者应该对编程技术有所了解,并且对Windows的历史有着一定的兴趣。

第1章 用户界面设计初探 1

1.1 为什么要单击“开始”按钮来关机 1

1.2 为什么Windows没有“专家模式” 2

1.3 对话框的默认按钮是“取消” 2

1.4 最好的设置是:即使你没有意识到这些设置的存在,但它们依然按照你所期望的方式在工作 4

1.5 为了显示我们超群的智慧,现在就来问一个你回答不了的问题 4

1.6 为什么安装程序不会问你是否希望保留操作系统文件的新版本 5

1.7 功能设计的思考 6

1.8 什么时候应该禁用选项,而什么时候又该删除选项 8

1.9 什么时候应该将“…”放在按钮或者菜单项的后面 8

1.10 自动售货机的用户界面设计 9

1.11 室内门锁的用户界面设计 10

1.12 Windows界面中“睫毛膏”的演变 10

第2章 Windows95的精选回忆 12

2.1 为什么在世界地图中,当前时区没有被加亮显示 12

2.2 为什么当内存超过1G时,Windows 95无法启动 13

2.3 为什么在Windows 95中有些函数叫作BEAR、BUNNY和PIGLET 14

2.4 BOZOSLIVEHERE和TABTHETEXTOUT-FORWIMPS表示什么含义 14

2.5 在Windows 95特别版的包装盒中都有些什么东西 15

2.6 Windows引出了每个人的罗尔沙赫氏测试 15

2.7 登录时的武术图片 16

2.8 为什么一个非常大的词典反而不好 17

2.9 了解Windows 95的启动声音 17

2.10 如果不在意正确性的话,那么编写专栏文章很容易 17

2.11 为什么在系统属性页中对内存的大小进行了取整 18

2.12 为什么硬盘指示灯每隔几秒钟闪一下 18

2.13 寻求更快的系统陷阱 19

2.14 一个字节曾经价值一美元 19

2.15 每个产品支持电话的成本相当于卖出一个Windows拷贝 20

2.16 为什么在Windows的光盘中没有包含Tweak UI 20

2.17 不能通过xcopy来安装Windows 21

2.18 买下一个Egghead软件商店 22

2.19 Windows PowerToy的历史故事 22

2.20 Windows如何选择最终构建编号 23

2.21 为什么在安装系统补丁包时系统的构建编号不会增加 24

第3章 GetWindowText函数的秘密 26

3.1 窗口如何来管理文本 26

3.2 深入GetWindowText函数 26

3.3 如果不喜欢这些规则,该怎么办 27

3.4 能否给出一个说明这种差异的示例 27

3.5 为什么GetWindowText的规则如此奇怪 28

第4章 任务栏与通知区域 30

4.1 为什么有些人把任务栏叫作“托盘” 30

4.2 为什么任务栏默认是在屏幕的底部 31

4.3 为什么在任务栏中的时钟并不显示秒 32

4.4 为什么不在任务栏中显示模拟时钟 32

4.5 为什么当任务栏竖直停靠时,“开始”按钮上的文本消失了 32

4.6 为什么当用户点击“X”按钮,通知图标不会收到消息 33

第5章 令人困惑的界面问题 34

5.1 那些小小的覆盖图标是什么 34

5.2 为什么当我登录的时候,有些不希望看到的文件/文件夹会自动打开 34

5.3 对文件来说,文件名字体的颜色代表什么含义 36

5.4 为什么在高级选项对话框中,每个选项后面都会加上“开”或者“关” 37

5.5 Alt+Tab中的图标顺序是如何确定的 37

5.6 为什么文件夹的只读属性非常奇怪 37

5.7 当我点击空白任务栏按钮时,这些按钮消失了,发生了什么事 38

5.8 “最小化所有窗口”和“显示桌面”之间的区别是什么 39

5.9 在菜单中的粗体文本表示什么含义 39

5.10 自定义的网页图标从何而来 40

5.11 任务管理器的标签和按钮到哪里去了 40

5.12 拖动一个文件是表示移动还是复制 40

5.13 为什么“链接”文件夹总会不断地自我创建 41

5.14 为什么同时选择多个文档进行打印时,文档的打印顺序是乱的 42

5.15 我在产品支持部门的一天 42

5.16 吹掉连接器上的灰尘 43

5.17 1G字节到底有多少 44

5.18 为什么不能删除“仅用于测试/评估”的标记 44

第6章 GlobalAlloc函数的历史 45

6.1 从前的故事 45

6.2 选择符 46

6.3 过渡到Win32 47

6.4 实现示例 48

第7章 Windows编程中的一些话题 50

7.1 “临时”程序 50

7.2 获得在标题图标中的自定义右键菜单 54

7.3 CreateMenu与CreatePopupMenu有什么区别 55

7.4 为什么窗口管理器会自动销毁菜单 57

7.5 仅当窗口在屏幕上可见时才进行绘制 57

7.6 判断窗口是否被覆盖了 60

7.7 用位图刷实现平铺效果 62

7.8 DC画刷的好处是什么 63

7.9 用ExtTextOut函数绘制实心矩形 65

7.10 用StretchBlt函数绘制实心矩形 66

7.11 在显示字符串时去掉那些难看的方框 67

7.12 没有所有者的信号量 73

7.13 自动复位的事件只是一个毫无意义的信号量 74

第8章 窗口管理 76

8.1 为什么会收到伪WM_MOUSEMOVE消息 76

8.2 为什么没有WM_MOUSEENTER消息 78

8.3 白屏 78

8.4 空心画刷的作用是什么 78

8.5 桌面窗口有什么特殊的地方 79

8.6 禁用窗口和激活窗口的正确顺序 79

8.7 恢复窗口位置时的问题 80

8.8 界面模态与代码模态 81

8.9 WM_QUIT消息与模态 83

8.10 为模态界面设置正确的所有者窗口 85

8.11 与进入模态的程序进行交互 87

8.12 计时消息框的简单版本 88

8.13 临时窗口 89

8.14 在GWLP_USERDATA中的附加窗口数据 90

8.15 计时消息框的改进版本 90

8.16 计时右键菜单 92

8.17 为什么窗口在被销毁之后还会收到消息 92

第9章 关于硬件的回忆 94

9.1 硬件的向后兼容性 94

9.2 光驱 95

9.3 微软公司的网络:比“地狱”差1.7倍 95

9.4 有时候制造商会侮辱他们自己 96

9.5 欺骗WHQL的驱动程序认证过程 96

9.6 20英尺长的计算机 97

9.7 USB手推车 97

9.8 检测到了新设备:波音747 98

9.9 超频带来的问题 98

第10章 对话框管理器的内部工作机制 100

10.1 关于对话框过程 100

10.2 对话框模板的发展 109

10.3 为什么需要对话框模板 134

10.4 对话框是如何创建的 136

10.5 模态对话框的消息循环 141

10.6 嵌套对话框以及DS_CONTROL 151

10.7 为什么需要对话框循环 156

10.8 为什么对话框编辑器从100开始设置控件的ID 157

10.9 在DefDlgProc函数中做了哪些工作 158

10.10 不要将焦点设置在被禁用的控件上 159

10.11 在IsDialog Message中做了什么工作 160

10.12 为什么有些消息框中的X按钮被禁用了 165

第11章 常见的软件问题 166

11.1 为什么夏令时与我们的直觉不同 166

11.2 为什么当文件复制到软盘时,文件的时间戳会发生变化 167

11.3 不要相信返回地址 168

11.4 编写排序比较函数 168

11.5 可以从另一端来理解契约 169

11.6 实用主义和纯粹主义之间的争论 172

11.7 优化通常是违背直觉的 173

11.8 在服务器上,分页等于死机 175

11.9 不要保存任何能够重新计算的结果 176

11.10 通过增加其他组件的开销来提升性能 176

11.11 轮询的性能问题 178

11.12 检测内存泄漏的简单方法 178

11.13 不好的缓存策略将导致内存泄漏 179

第12章 深入研究Visual C++编译器 185

12.1 析构函数在什么时候调用 185

12.2 COM对象的布局 189

12.3 调节转换器 190

12.4 指向成员函数的指针非常奇怪 191

12.5 什么是_purecall 194

第13章 向后兼容性 197

13.1 有些应用程序的本意就是造成崩溃 197

13.2 当程序使用未公开的结构时 197

13.3 为什么不阻止那些使用了未公开结构的程序 199

13.4 为什么16位DOS和16位Windows仍然存在 200

13.5 像NUL和CON这些保留文件名的作用是什么 201

13.6 为什么(有时候)在UNC路径前面是一个驱动器盘符 202

13.7 不要轻视“猎鹿者”这个游戏的威力 203

13.8 有时候,游戏中的错误只有在玩了一段时间后才会显现出来 203

13.9 Shell Folders键的故事 204

13.10 保持错误码的向后兼容性是很重要的 205

13.11 没错,我们实现了这个功能 206

13.12 有些程序在为操作系统打补丁时将陷入困境 207

13.13 即使在内部数据结构中也存在着兼容性问题 208

13.14 为什么Windows让BIOS时间保持为本地时间 208

13.15 版本号的检测 209

13.16 破坏IUnknown::QueryInterface的几种方式 209

13.17 当程序假设系统永远不会发生改变之一 211

13.18 当程序假设系统永远不会发生改变之二 211

13.19 伪显示控制面板 212

13.20 伪可视化风格 213

第14章 一些名字的来源和历史 214

14.1 在WPARAM和LPARAM中,字母W和L分布表示什么意思 214

14.2 为什么在Windows 98中,显示器的最大数量是9 214

14.3 为什么注册表文件叫做蜂窝 214

14.4 16位Windows中对资源的内存管理 215

14.5 HINSTANCE和HMODULE之间的区别是什么 215

14.6 在WinMain函数中,hPrevInstance参数的作用是什么 217

14.7 GlobalWire函数为什么叫这个名字 218

14.8 LocalAlloc和GlobalAlloc之间的区别是什么 218

14.9 GMEM_SHARE标志的作用是什么 220

14.10 为什么在转换到LPARAM之前会进行一个多余的转换 220

14.11 为什么有些注册表函数的名字以Ex结尾 221

14.12 SHGetMalloc、SHAlloc和CoGetMalloc之间的区别是什么 222

14.13 为什么Windows错误报告程序的昵称是Dr.Watson 225

14.14 DirectX 4出了什么问题 226

14.15 为什么HANDLE类型的返回值很不一致 227

14.16 为什么文本文件是以Ctrl+Z来结束的 228

14.17 为什么行结束符是CR+LF 229

14.18 TEXT、_TEXT与_T和UNICODE与UNICODE 229

14.19 为什么对话框在初次创建的时候是隐藏的 230

14.20 当程序在内部进行修改时,没有人会注意 230

14.21 如果FlushInstructionCache没有做任何事情,那么为什么还要调用这个函数 231

14.22 如果InitCommonControls没有做任何事情,那么为什么还要调用这个函数 231

14.23 为什么InterlockedIncrement和Interlo-ckedDecrement这两个函数只是返回结果的符号 232

14.24 为什么会存在WSASetLastError函数 232

14.25 为什么在Windows中使用了基于广播的机制 233

14.26 在任务栏出现之前,窗口最小化之后被放到了什么地方 233

14.27 为什么在计算桌面窗口大小时会把任务栏也包含在内 234

14.28 为什么在按下Alt键时,光标将停止闪烁 235

14.29 ES_OEMCONVERT标志的作用是什么 235

14.30 在文件系统隧道背后隐藏的故事 236

14.31 为什么NTFS和资源管理器在对文件名进行排序时是不一致的 237

14.32 日期/时间控制面板并不是日程表 239

14.33 Windows 95如何重新设定DLL的加载基址 239

14.34 SYSTEM_FONT和DEFAULT_GUI_FONT是什么字体 241

14.35 上下控件中的箭头含义 241

14.36 Windows 95发布会的门票 242

第15章 窗口消息的发送与接收 244

15.1 发送消息和投递消息 244

15.2 发送消息的生命期 248

15.3 投递消息的生命期 248

15.4 生成的投递消息 249

15.5 SendMessageCallback将在什么时候调用回调函数 251

15.6 当消息超时后,SendMessageTimeout函数将会执行什么操作 252

15.7 澄清一些关于消息处理的谬论 252

15.8 如何知道消息的发送者/投递者 253

15.9 不能用PostMessage来模拟键盘输入 253

第16章 国际化编程 254

16.1 在Unicode上进行大小写映射很困难 254

16.2 关于错误大小写映射的趣事 255

16.3 为什么不能旋转文字 255

16.4 0409和1033是些什么目录 257

16.5 注意编码页 258

16.6 为什么默认的8比特编码页叫作“ANSI” 264

16.7 为什么默认的控制台编码页叫作“OEM” 264

16.8 为什么OEM编码页经常叫作ANSI 265

16.9 在Unicode和ANSI之间的转换结果既是合理的但也是奇怪的 265

第17章 安全 267

17.1 所有用户都可以写入的文件 267

17.2 在资源管理器中隐藏文件 268

17.3 窃取密码 268

17.4 未验证驱动程序的静默安装 269

17.5 调试代码可能是一个安全漏洞 270

17.6 为什么共享数据段是一个安全漏洞 270

17.7 IE的增强安全配置并不信任内部网络 273

第18章 Windows 2000和Windows XP 274

18.1 为什么在XP开始菜单的“所有程序”列表中没有智能菜单 274

18.2 为什么没有定义可以访问开始菜单中快速启动列表的函数接口 274

18.3 为什么Windows XP Service Pack 2有时候会忘记CD自动播放设置 276

18.4 不安全设备删除对话框 276

18.5 关于Windows XP中“Comments”按钮的两段回忆 277

18.6 为什么资源管理器在刻录完光盘之后会把光盘弹出来 277

18.7 为什么Windows安装程序会生成新的启动扇区 277

18.8 超自然力调试法:为什么在四处理器的机器中有三个处理器没有发挥作用 278

18.9 超自然力调试法:为什么CPU使用率总在50%上下徘徊 279

18.10 DS_SHELLFONT标志的作用是什么 279

18.11 为什么DS_SHELLFONT=DS_FIXEDSYS|DS_SETFONT 280

18.12 DS_SHELLFONT在属性页上的效果是什么 280

第19章 Win32中的设计问题 282

19.1 为什么在无法解析某个导入函数时,Win32将不会加载这个模块 282

19.2 为什么要仔细检查结构的大小 283

19.3 为什么必须为了WM_DEVICECHANGE返回一个奇怪的值 285

19.4 程序和用户之间的战争 285

19.5 为什么不能截获TerminateProces函数调用 286

19.6 为什么有些进程在被终止之后还停留在任务管理器中 286

19.7 理解WAIT_ABANDONED带来的结果 287

19.8 为什么不能把超链接放在通知图标气球提示中 288

19.9 为什么在树型控件中不能重复使用同一个节点 289

19.10 奇怪的STRRET结构 290

19.11 为什么不能把UTF-8设置为系统的ANSI编码页 291

19.12 什么时候应该使用下沉的客户区 291

19.13 为什么没有包罗万象的Windows版本 292

19.14 为什么可能发生禁用桌面窗口的情况 292

19.15 窗口和菜单的嵌套限制分别是多少 293

19.16 HWND_TOP和HWND_TOPMOST之间的区别是什么 293

第20章 “税收”问题 295

20.1 层次存储管理 295

20.2 地缘政治学 296

20.3 远处桌面连接与绘制 296

20.4 快速用户切换和终端服务 299

20.5 多用户 300

20.6 漫游用户配置文件 300

20.7 重定向文件夹 302

20.8 “我的文档”与“应用程序数据” 304

20.9 大地址空间 304

20.10 电源管理和检测电池的电量 307

20.11 间歇性的网络连接 309

20.12 反走样字体和ClearType技术 310

20.13 高DPI显示 312

20.14 多显示器 316

20.15 工作区 318

20.16 在正确的位置上显示弹出窗口 319

20.17 辅助功能 319

第21章 一些可笑的故事 326

21.1 非常容易误解的“空”操作 326

21.2 不要让市场部门搞砸你的幻灯片 326

21.3 异想天开的错误报告 326

21.4 小心示例URL 327

21.5 任何代码都不是孤立的 328

21.6 “我在Viusal Basic方面很专业” 328

21.7 半透明的塑料 328

21.8 我遭遇的第一次死亡威胁 329

21.9 你无法摆脱这些AOL CD 329

21.10 在接入电脑的电源之前给出严正警告 330

21.11 蜘蛛纸牌不再排名第一 330

21.12 关于Rat Poker的一些事情 331

21.13 注意产品小组的名字 331

21.14 分发列表的命名心理学 332

21.15 经理和程序员之间的区别 332

21.16 用软盘作为信号量 333

21.17 当一个标志中途改变了它所代表的含义 333

21.18 把异想天开的尴尬作为一种温和的指责方式 333

21.19 用物品来作为提醒 334

21.20 办公室里的迪斯科舞会 334

21.21 万圣节主题的大厅 335