Windows程序设计(第五版)源代码A(chap08)
- 格式:doc
- 大小:52.00 KB
- 文档页数:16
5(1)使用菜单及上下文菜单设置窗体颜色(2)使用Timer控件及状态栏控件实现在状态栏中显示当前时间及鼠标移动时的坐标位置。
-------------------------------5.1实验代码-----------------------------------using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace _5{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void redToolStripMenuItem1_Click(object sender, EventArgs e){this.BackColor = Color.Red;}private void redToolStripMenuItem_Click(object sender, EventArgs e){this.BackColor = Color.Red;}private void greenToolStripMenuItem_Click(object sender, EventArgs e){this.BackColor = Color.Green;}private void yellowToolStripMenuItem_Click(object sender, EventArgs e){this.BackColor = Color.Yellow;}private void blackToolStripMenuItem_Click(object sender, EventArgs e)this.BackColor = Color.Black;}private void pinkToolStripMenuItem_Click(object sender, EventArgs e){this.BackColor = Color.Pink;}private void Form1_Load(object sender, EventArgs e){groupBox1.Left = -1;groupBox1.Width = this.Width + 100;groupBox1.Height = this.Height + 100;}}}---------------------------------------5.2 实验代码------------------------- using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;namespace WindowsFormsApplication1{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){timer1.Start();}private void timer1_Tick(object sender, EventArgs e)l1.Text = DateTime.Now.ToString();}private void Form1_FormClosing(object sender, FormClosingEventArgs e){timer1.Stop();}private void Form1_MouseMove(object sender, MouseEventArgs e){if (e.Button == MouseButtons.Left){l2.Text = "X=" + e.X + ":" + "Y=" + e.Y;}}}}6(1)使用菜单设计打开文件、保存文件对话框(打开及保存对话框点击确认按钮后,使用对话框输出选中的文件名称);颜色对话框、字体对话框设置文本框字体颜色及字体。
windows程序设计(第五版)Windows程序设计(第五版)引言随着计算机技术的飞速发展,Windows操作系统已经成为个人计算机和企业环境中最为广泛使用的操作系统之一。
Windows程序设计是计算机科学领域中一个重要且具有挑战性的主题。
《Windows程序设计》(第五版)作为经典教材,为读者提供了深入理解Windows操作系统工作原理和开发Windows应用程序所需的知识。
Windows操作系统概述Windows操作系统是一个多任务、多用户、图形界面的操作系统。
它提供了丰富的用户界面和强大的系统服务,支持广泛的硬件设备和软件应用。
从最早的Windows 1.0到现在的Windows 10,Windows操作系统经历了多次重大更新和改进。
Windows程序设计基础1. 编程语言选择Windows程序设计可以使用多种编程语言,包括C、C++、C#、 等。
每种语言都有其特点和优势,开发者可以根据项目需求和个人偏好选择合适的编程语言。
2. 开发环境Visual Studio是微软推出的集成开发环境(IDE),它提供了代码编辑、调试、版本控制等工具,是开发Windows应用程序的首选工具。
3. API的使用Windows应用程序的开发离不开对Windows API的调用。
Windows API是一组预定义的函数、常量和数据类型,它们允许应用程序与操作系统进行交互。
用户界面设计用户界面是应用程序与用户交互的窗口。
在Windows程序设计中,用户界面的设计至关重要。
1. 窗口和控件窗口是应用程序的基本组成部分,控件则是窗口中的交互元素,如按钮、文本框、列表框等。
2. 布局管理合理的布局管理可以提高用户界面的可用性和美观性。
开发者需要考虑控件的大小、位置和对齐方式。
3. 响应用户输入应用程序需要能够响应用户的输入,如鼠标点击、键盘敲击等,并根据用户的输入执行相应的操作。
系统编程系统编程涉及到操作系统的底层操作,如文件操作、进程和线程管理、内存管理等。
Windows核⼼编程第五版学习笔记(⼀)第⼀章错误处理1、$err, hr 在vs的watch窗⼝中监视这个可以获得刚执⾏的windows api 的错误代码及详细解释。
2、⾃定义消息码Bits:31-30292827-1615-0 Contents Severity Microsoft/customer Reserved Facility code Exception codeMeaning0=Success1 =Informational2 = Warning3 = Error 0 = Microsoft-definedcode1 = customer-definedcodeMust be 0The first 256 values are reserved byMicrosoftMicrosoft/customer-definedcode注意第29位,⾃定义的消息码必须为1。
3、FormatMessage函数可以把消息码格式化成其对应的字符串。
第⼆章字符和字符串处理1、在Windows vista中,每个Unicode字符都使⽤UTF-16编码,UTF-16将每个字符编码为两个字节。
16位不⾜以表⽰某些语⾔的所有字符,对于这些语⾔UTF-16⽀持使⽤代理,后者是⽤32位来表⽰⼀个字符的⽅式,因为只有少数程序需要⽀持这些字符,所以UTF-16在节省控件和简化编码之间做了⼀个很好的折衷。
其他的编码还有UTF-8和UTF-32,UTF-8把⼀个字符编码为2-4个字节,值在0x0080⼀下的压缩为⼀个字节(美国合适),0x0080到0x07FF之间的字符⽤两个字节(欧洲和中东),0x0800以上的字符⽤三个字节(东亚),使⽤代理的转换为四个字节表⽰。
对值为0x0800以上的⼤量字符编码时不如UTF-16有效。
2、⾃从WindowsNT起,Windows的所有版本都完全⽤Unicode来构建,所有的核⼼函数都需要Unicode字符串,如果传⼊或返回的是ANSI 字符串,函数内部会进⾏ANSI和Unicode的相互转换,为了执⾏这些转换,系统会产⽣时间和内存上的开销。
windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
王艳平的《windows程序设计》《Windows程序设计》是王艳平所著的一本专业书籍,它为读者提供了深入了解Windows操作系统编程的基础知识和高级技术。
这本书不仅适合初学者学习,也适合有一定基础的开发者进行深入研究。
全书内容丰富,覆盖了从Windows编程的基本概念到复杂的系统级编程技巧。
第一章:Windows编程基础本章介绍了Windows操作系统的基本概念,包括操作系统的发展历程、Windows的架构以及Windows编程的特点。
此外,还详细讲解了Windows编程环境的搭建,包括开发工具的选择、SDK的安装和配置等。
第二章:Windows API概述Windows API是Windows编程的核心,本章对Windows API进行了全面的介绍。
包括API的分类、调用方式、参数传递机制等。
同时,还介绍了如何使用API来实现窗口的创建、消息的发送和接收等基本操作。
第三章:窗口与消息处理窗口是Windows应用程序的基本组成元素。
本章详细讲解了窗口的创建过程、窗口的属性设置、窗口的显示与隐藏等。
同时,还深入探讨了消息循环的概念,以及如何通过消息循环来处理用户输入和系统事件。
第四章:图形与文本绘制图形和文本是用户界面的重要组成部分。
本章介绍了Windows GDI(图形设备接口)的基本概念和使用方法,包括如何使用GDI进行图形绘制、文本输出以及字体和颜色的设置等。
第五章:动态链接库与资源动态链接库(DLL)和资源是Windows编程中常用的技术。
本章讲解了DLL的基本概念、创建和使用,以及资源文件的创建和管理。
通过本章的学习,读者可以掌握如何在应用程序中使用DLL和资源来增强程序的功能和可扩展性。
第六章:多线程编程多线程是提高程序性能的重要手段。
本章详细介绍了Windows多线程编程的基本概念和实现方法,包括线程的创建、同步、通信以及线程池的使用等。
通过本章的学习,读者可以掌握如何编写高效的多线程应用程序。
c语⾔程序设计第五版课后答案谭浩强第⼋章课后答案c语⾔程序设计第五版课后答案谭浩强习题答案第⼋章善于利⽤指针本章习题均要求使⽤指针⽅法处理。
1. 输⼊3个整数,要求按由⼩到⼤的顺序输出。
解题思路:先获取到三个变量的地址,然后获取三个数据,通过指针进⾏⽐较转换即可答案:#include <stdio.h>void swap(int *p_a, int *p_b){int temp = *p_a;*p_a = *p_b;*p_b = temp;}int main(){int a, b, c, *p_a = &a, *p_b = &b, *p_c = &c; // 获取每个变量空间的地址printf("Please enter three numbers:");scanf_s("%d%d%d", p_a, p_b, p_c);if (*p_a > *p_b) {swap(p_a, p_b);//通过指针进⾏指向空间内的数据交换}if (*p_a > *p_c) {swap(p_a, p_c);}if (*p_b > *p_c) {swap(p_b, p_c);}printf("%d %d %d\n", *p_a, *p_b, *p_c);system("pause");return 0;}2. 输⼊3个字符串,要求按由⼩到⼤的顺序输出。
解题思路:字符串的⽐较可以使⽤strcmp函数,返回值>0表⽰⼤于,返回值⼩于0表⽰⼩于,返回追等于0表⽰相同。
其他的⽐较排序思路与数字的排序交换没有区别,逐个进⾏⽐较先找出最⼤的,然后找出第⼆⼤的。
答案:#include <stdio.h>int main(){char str[3][32];char *p[3];printf("Please enter three strings:");for (int i = 0; i < 3; i++) {p[i] = str[i];scanf_s("%s", p[i], 32);//后边的数字限制缓冲区边界,防⽌缓冲区溢出访问越界}//让p[0]和p[1]/p[2]分别进⾏⽐较,找出最⼤的字符串,i+1之后,则让p[1]和p[2]进⾏⽐较,找出第⼆⼤//i循环总个数-1次,最后⼀个是不需要⽐较的for (int i = 0; i < 2; i++) {for (int j = i + 1; j < 3; j++) {if (strcmp(p[i], p[j]) > 0) {char *tmp = p[i]; p[i] = p[j]; p[j] = tmp;}}}printf("%s %s %s\n", p[0], p[1], p[2]);system("pause");return 0;}3. 输⼊10个整数,将其中最⼩的数与第⼀个数对换, 把最⼤的数与最后⼀个数对换。
《Windows核心编程》Word文档这篇笔记是我在读《Windows核心编程》第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的。
开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯。
海量细节。
第1章错误处理1.GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖。
2.GetLastError可能用于描述成功的原因(CreatEvent)。
3.VS监视窗口err,hr。
4.FormatMessage。
5.SetLastError。
第2章字符和字符串处理1.ANSI版本的API全部是包装Unicode版本来的,在传参和返回是多了一次编码转换。
2.MS的C库的ANSI和Unicode版本之间也是没有互相调用关系的,没有编码转换开销。
3.宽字符函数:_tcscpy,_tcscat,_tcslen。
4.UNICODE宏是Windows API使用的,而MS的C库中,对于非标准的东西用_前缀区分,所以_UNICODE宏是MS的C API使用的。
5.MS提供的避免缓冲区溢出攻击的函数在文件中,包括StringCbCat和StringCchCat等函数(其中Cb表示Count of Byte,Cch表示Count of Character,都用于表示衡量目标缓冲大小的单位);另外中有_tcscpy_s等_s后缀的函数。
在源串过短时,的函数截断,的函数断言。
6.要想接管CRT的错误处理(比如assert),使用_set_invalid_parameter_handler设置自己的处理函数,然后使用_CrtSetReportMode(_CRT_ASSERT, 0);来禁止CRT弹出对话框。
7.Windows也提供了字符串处理函数,但lstrcat、lstrcpy(针对T字符的)已经过时了,因为没考虑缓冲区溢出攻击。
第9章 GDI编程2—文字、位图与图标与DOS等传统字符界面用点阵模板显示文字不同,GUI中的文字一般是利用轮廓字体中的控制点数据经计算后再绘制出来的。
Windows中的文字,采用的是基于二次贝塞尔曲线的TrueType轮廓字体(字体文件为*.TTF)。
MFC中的字体类为CFont,在字体对象选入DC 后,可用TextOut等函数进行文字的绘制输出。
位图是指由像素阵列组成的数字化点阵图像,是GUI的基本元素。
位图可分成与设备相关和无关的两类,分别用于图像的显示和存储,对应的MFC类分别为CBitmap和CImage。
图标是一类大小固定的方型小位图,用于代表应用程序或文档子窗口。
为了满足不同显示设备和不同使用目的的需要,在一个程序的图标资源中,一般包含多个不同大小和颜色位数的图像。
MFC为应用程序提供了默认的图标,可用资源编辑器对其进行修改。
9.1 输出文本一般使用CDC类的TextOut等函数,采用DC中的当前字体和文本颜色等来输出文本。
还可用SetTextAlign函数来设置文本的对齐方式,并分别用SetTextColor和SetBkColor函数来设置文本的前景和背景颜色。
9.1.1 文本输出函数在CDC类中,封装了多种文本输出函数,它们都是使用当前的字体、文本颜色和背景颜色,在屏幕或打印机上输出文本(绘制文字)。
常用的文本输出函数有基本的TextOut、限定矩形区域的DrawText和可裁减与调字间距之扩展的ExtTextOut,其中最常用的是TextOut函数。
1.TextOutTextOut的函数原型为:virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );BOOL TextOut( int x, int y, const CString& str );其中,x与y为显示串的左上角坐标,lpszString或str为要显示的文本串,nCount为串lpszString中的字符数。
chap08-Beeper1/*-----------------------------------------BEEPER1.C -- Timer Demo Program No. 1(c) Charles Petzold, 1998-----------------------------------------*/#include <windows.h>#define ID_TIMER 1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Beeper1") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;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.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Beeper1 Timer Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;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) {static BOOL fFlipFlop = FALSE ;HBRUSH hBrush ;HDC hdc ;PAINTSTRUCT ps ;RECT rc ;switch (message){case WM_CREATE:SetTimer (hwnd, ID_TIMER, 1000, NULL) ;return 0 ;case WM_TIMER :MessageBeep (-1) ;fFlipFlop = !fFlipFlop ;InvalidateRect (hwnd, NULL, FALSE) ;return 0 ;case WM_PAINT :hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rc) ;hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ; FillRect (hdc, &rc, hBrush) ;EndPaint (hwnd, &ps) ;DeleteObject (hBrush) ;return 0 ;case WM_DESTROY :KillTimer (hwnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}chap08-Beeper2/*----------------------------------------BEEPER2.C -- Timer Demo Program No. 2(c) Charles Petzold, 1998----------------------------------------*/#include <windows.h>#define ID_TIMER 1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;VOID CALLBACK TimerProc (HWND, UINT, UINT, DWORD ) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Beeper2") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;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.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;hwnd = CreateWindow (szAppName, TEXT ("Beeper2 Timer Demo"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;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) {switch (message){case WM_CREATE:SetTimer (hwnd, ID_TIMER, 1000, TimerProc) ;return 0 ;case WM_DESTROY:KillTimer (hwnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}VOID CALLBACK TimerProc (HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) {static BOOL fFlipFlop = FALSE ;HBRUSH hBrush ;HDC hdc ;RECT rc ;MessageBeep (-1) ;fFlipFlop = !fFlipFlop ;GetClientRect (hwnd, &rc) ;hdc = GetDC (hwnd) ;hBrush = CreateSolidBrush (fFlipFlop ? RGB(255,0,0) : RGB(0,0,255)) ;FillRect (hdc, &rc, hBrush) ;ReleaseDC (hwnd, hdc) ;DeleteObject (hBrush) ;}chap08-Clock/*--------------------------------------CLOCK.C -- Analog Clock Program(c) Charles Petzold, 1998--------------------------------------*/#include <windows.h>#include <math.h>#define ID_TIMER 1#define TWOPI (2 * 3.14159)LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("Clock") ;HWND hwnd;MSG msg;WNDCLASS wndclass ;wndclass.style = CS_HREDRAW | CS_VREDRAW ;wndclass.lpfnWndProc = WndProc ;wndclass.cbClsExtra = 0 ;wndclass.cbWndExtra = 0 ;wndclass.hInstance = hInstance ;wndclass.hIcon = NULL ;wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;wndclass.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Analog Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}void SetIsotropic (HDC hdc, int cxClient, int cyClient){SetMapMode (hdc, MM_ISOTROPIC) ;SetWindowExtEx (hdc, 1000, 1000, NULL) ;SetViewportExtEx (hdc, cxClient / 2, -cyClient / 2, NULL) ;SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;}void RotatePoint (POINT pt[], int iNum, int iAngle){int i ;POINT ptTemp ;for (i = 0 ; i < iNum ; i++){ptTemp.x = (int) (pt[i].x * cos (TWOPI * iAngle / 360) + pt[i].y * sin (TWOPI * iAngle / 360)) ;ptTemp.y = (int) (pt[i].y * cos (TWOPI * iAngle / 360) -pt[i].x * sin (TWOPI * iAngle / 360)) ;pt[i] = ptTemp ;}}void DrawClock (HDC hdc){int iAngle ;POINT pt[3] ;for (iAngle = 0 ; iAngle < 360 ; iAngle += 6){pt[0].x = 0 ;pt[0].y = 900 ;RotatePoint (pt, 1, iAngle) ;pt[2].x = pt[2].y = iAngle % 5 ? 33 : 100 ;pt[0].x -= pt[2].x / 2 ;pt[0].y -= pt[2].y / 2 ;pt[1].x = pt[0].x + pt[2].x ;pt[1].y = pt[0].y + pt[2].y ;SelectObject (hdc, GetStockObject (BLACK_BRUSH)) ;Ellipse (hdc, pt[0].x, pt[0].y, pt[1].x, pt[1].y) ;}}void DrawHands (HDC hdc, SYSTEMTIME * pst, BOOL fChange){static POINT pt[3][5] = { 0, -150, 100, 0, 0, 600, -100, 0, 0, -150,0, -200, 50, 0, 0, 800, -50, 0, 0, -200,0, 0, 0, 0, 0, 0, 0, 0, 0, 800 } ; int i, iAngle[3] ;POINT ptTemp[3][5] ;iAngle[0] = (pst->wHour * 30) % 360 + pst->wMinute / 2 ;iAngle[1] = pst->wMinute * 6 ;iAngle[2] = pst->wSecond * 6 ;memcpy (ptTemp, pt, sizeof (pt)) ;for (i = fChange ? 0 : 2 ; i < 3 ; i++){RotatePoint (ptTemp[i], 5, iAngle[i]) ;Polyline (hdc, ptTemp[i], 5) ;}}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static int cxClient, cyClient ;static SYSTEMTIME stPrevious ;BOOL fChange ;HDC hdc ;PAINTSTRUCT ps ;SYSTEMTIME st ;switch (message){case WM_CREATE :SetTimer (hwnd, ID_TIMER, 1000, NULL) ;GetLocalTime (&st) ;stPrevious = st ;return 0 ;case WM_SIZE :cxClient = LOWORD (lParam) ;cyClient = HIWORD (lParam) ;return 0 ;case WM_TIMER :GetLocalTime (&st) ;fChange = st.wHour != stPrevious.wHour ||st.wMinute != stPrevious.wMinute ;hdc = GetDC (hwnd) ;SetIsotropic (hdc, cxClient, cyClient) ;SelectObject (hdc, GetStockObject (WHITE_PEN)) ;DrawHands (hdc, &stPrevious, fChange) ;SelectObject (hdc, GetStockObject (BLACK_PEN)) ;DrawHands (hdc, &st, TRUE) ;ReleaseDC (hwnd, hdc) ;stPrevious = st ;return 0 ;case WM_PAINT :hdc = BeginPaint (hwnd, &ps) ;SetIsotropic (hdc, cxClient, cyClient) ;DrawClock (hdc) ;DrawHands (hdc, &stPrevious, TRUE) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY :KillTimer (hwnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}chap08-DigClock/*-----------------------------------------DIGCLOCK.c -- Digital Clock(c) Charles Petzold, 1998-----------------------------------------*/#include <windows.h>#define ID_TIMER 1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("DigClock") ;HWND hwnd ;MSG msg ;WNDCLASS wndclass ;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.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("Program requires Windows NT!"), szAppName, MB_ICONERROR) ;return 0 ;}hwnd = CreateWindow (szAppName, TEXT ("Digital Clock"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}void DisplayDigit (HDC hdc, int iNumber){static BOOL fSevenSegment [10][7] = {1, 1, 1, 0, 1, 1, 1, // 00, 0, 1, 0, 0, 1, 0, // 11, 0, 1, 1, 1, 0, 1, // 21, 0, 1, 1, 0, 1, 1, // 30, 1, 1, 1, 0, 1, 0, // 41, 1, 0, 1, 0, 1, 1, // 51, 1, 0, 1, 1, 1, 1, // 61, 0, 1, 0, 0, 1, 0, // 71, 1, 1, 1, 1, 1, 1, // 81, 1, 1, 1, 0, 1, 1 } ; // 9static POINT ptSegment [7][6] = {7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10,6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11,36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11,7, 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40,6, 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41,36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41,7, 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 } ; int iSeg ;for (iSeg = 0 ; iSeg < 7 ; iSeg++)if (fSevenSegment [iNumber][iSeg])Polygon (hdc, ptSegment [iSeg], 6) ;}void DisplayTwoDigits (HDC hdc, int iNumber, BOOL fSuppress){if (!fSuppress || (iNumber / 10 != 0))DisplayDigit (hdc, iNumber / 10) ;OffsetWindowOrgEx (hdc, -42, 0, NULL) ;DisplayDigit (hdc, iNumber % 10) ;OffsetWindowOrgEx (hdc, -42, 0, NULL) ;}void DisplayColon (HDC hdc){POINT ptColon [2][4] = { 2, 21, 6, 17, 10, 21, 6, 25,2, 51, 6, 47, 10, 51, 6, 55 } ;Polygon (hdc, ptColon [0], 4) ;Polygon (hdc, ptColon [1], 4) ;OffsetWindowOrgEx (hdc, -12, 0, NULL) ;}void DisplayTime (HDC hdc, BOOL f24Hour, BOOL fSuppress){SYSTEMTIME st ;GetLocalTime (&st) ;if (f24Hour)DisplayTwoDigits (hdc, st.wHour, fSuppress) ;elseDisplayTwoDigits (hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress) ;DisplayColon (hdc) ;DisplayTwoDigits (hdc, st.wMinute, FALSE) ;DisplayColon (hdc) ;DisplayTwoDigits (hdc, st.wSecond, FALSE) ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static BOOL f24Hour, fSuppress ;static HBRUSH hBrushRed ;static int cxClient, cyClient ;HDC hdc ;PAINTSTRUCT ps ;TCHAR szBuffer [2] ;switch (message){case WM_CREATE:hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ;SetTimer (hwnd, ID_TIMER, 1000, NULL) ;// fall throughcase WM_SETTINGCHANGE:GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ;f24Hour = (szBuffer[0] == '1') ;GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2) ;fSuppress = (szBuffer[0] == '0') ;InvalidateRect (hwnd, NULL, TRUE) ;return 0 ;case WM_SIZE:cxClient = LOWORD (lParam) ;cyClient = HIWORD (lParam) ;return 0 ;case WM_TIMER:InvalidateRect (hwnd, NULL, TRUE) ;return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;SetMapMode (hdc, MM_ISOTROPIC) ;SetWindowExtEx (hdc, 276, 72, NULL) ;SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;SetWindowOrgEx (hdc, 138, 36, NULL) ;SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;SelectObject (hdc, GetStockObject (NULL_PEN)) ;SelectObject (hdc, hBrushRed) ;DisplayTime (hdc, f24Hour, fSuppress) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:KillTimer (hwnd, ID_TIMER) ;DeleteObject (hBrushRed) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}chap08-WhatClr/*------------------------------------------WHATCLR.C -- Displays Color Under Cursor(c) Charles Petzold, 1998------------------------------------------*/#include <windows.h>#define ID_TIMER 1void FindWindowSize (int *, int *) ;LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){static TCHAR szAppName[] = TEXT ("WhatClr") ;HWND hwnd ;int cxWindow, cyWindow ;MSG msg ;WNDCLASS wndclass ;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.lpszMenuName = NULL ;wndclass.lpszClassName = szAppName ;if (!RegisterClass (&wndclass)){MessageBox (NULL, TEXT ("This program requires Windows NT!"),szAppName, MB_ICONERROR) ;return 0 ;}FindWindowSize (&cxWindow, &cyWindow) ;hwnd = CreateWindow (szAppName, TEXT ("What Color"),WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_BORDER, CW_USEDEFAULT, CW_USEDEFAULT,cxWindow, cyWindow,NULL, NULL, hInstance, NULL) ;ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;while (GetMessage (&msg, NULL, 0, 0)){TranslateMessage (&msg) ;DispatchMessage (&msg) ;}return msg.wParam ;}void FindWindowSize (int * pcxWindow, int * pcyWindow){HDC hdcScreen ;TEXTMETRIC tm ;hdcScreen = CreateIC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;GetTextMetrics (hdcScreen, &tm) ;DeleteDC (hdcScreen) ;* pcxWindow = 2 * GetSystemMetrics (SM_CXBORDER) +12 * tm.tmAveCharWidth ;* pcyWindow = 2 * GetSystemMetrics (SM_CYBORDER) +GetSystemMetrics (SM_CYCAPTION) +2 * tm.tmHeight ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {static COLORREF cr, crLast ;static HDC hdcScreen ;HDC hdc ;PAINTSTRUCT ps ;POINT pt ;RECT rc ;TCHAR szBuffer [16] ;switch (message){case WM_CREATE:hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;SetTimer (hwnd, ID_TIMER, 100, NULL) ;return 0 ;case WM_DISPLAYCHANGE:DeleteDC (hdcScreen) ;hdcScreen = CreateDC (TEXT ("DISPLAY"), NULL, NULL, NULL) ;return 0 ;case WM_TIMER:GetCursorPos (&pt) ;cr = GetPixel (hdcScreen, pt.x, pt.y) ;if (cr != crLast){crLast = cr ;InvalidateRect (hwnd, NULL, FALSE) ;}return 0 ;case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rc) ;wsprintf (szBuffer, TEXT (" %02X %02X %02X "),GetRValue (cr), GetGValue (cr), GetBValue (cr)) ;DrawText (hdc, szBuffer, -1, &rc,DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;EndPaint (hwnd, &ps) ;return 0 ;case WM_DESTROY:DeleteDC (hdcScreen) ;KillTimer (hwnd, ID_TIMER) ;PostQuitMessage (0) ;return 0 ;}return DefWindowProc (hwnd, message, wParam, lParam) ;}。