Windows程序设计(第五版)源代码A(chap08)

合集下载

WINDOWS 程序设计教程(4章)

WINDOWS 程序设计教程(4章)

} RECT;
4.7代号(句柄)
• 代号(句柄)是什么?
内核对象及其句柄
1 内核对象的作用
在内核以外有很多的系统组件,处理它们的资源分配、 安全认证等都要执行体付出不可忽略的策略开销。内核通过 一组称作“内核对象”的简单对象帮助控制、处理并支持执 行体对象的创建,以降低这种开销。大多数执行体级别的对 象都封装了一个或多个内核对象。 2 内核对象的种类 一个称作“控制对象”的内核对象集合为控制各种操作 系统功能建立了语义。这个对象集合包括内核进程对象、窗 口、文件和几个由I/O系统使用的对象(例如中断对象)等。
内核对象的映射关系。程序几乎总是通过调用Windows函数
来取得和使用句柄,以使用它代表的内核对象。
当调用一个创建内核对象的函数时,该函数就返回一
个用于标识该对象的句柄。然后我们的程序中就可以使用 这个句柄,将这个句柄传递给Windows的各个对内核对象进 行操作的函数,这样,系统就能知道你想操作哪个内核对 象。例如: HANDLE CreateFile(
HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32];
} PAINTSTRUCT;
4.6 RECT介绍
typedef struct _RECT {
LONG left; LONG top; LONG right; LONG bottom;


4.3 窗口类结构WNDCLASS
• 窗口类结构与窗口类的联系和区别? • 窗口类结构是内定的。
4.3 窗口类结构WNDCLASS
WNDCLASS的实现 虚拟窗口类结构WNDCLASS分别取作WNDCLASSA或WNDCLASSW。 它们的实现软件如下: #ifdef UNICODE//如果是UNICODE码 typedef WNDCLASSW WNDCLASS ; typedef PWNDCLASSW PWNDCLASS ;//指针 typedef NPWNDCLASSW NPWNDCLASS ;//近指针 typedef LPWNDCLASSW LPWNDCLASS ;//长指针 #else //不是UNICODE码 typedef WNDCLASSA WNDCLASS ; typedef PWNDCLASSA PWNDCLASS ;//指针 typedef NPWNDCLASSA NPWNDCLASS ;//近指针 typedef LPWNDCLASSA LPWNDCLASS ;//长指针 #endif

WINDOWS 程序设计教程(5章)

WINDOWS 程序设计教程(5章)

几个与窗口类有关的函数
• LoadCursor()函数 HCURSOR LoadCursor(
HINSTANCE hInstance, // handle to application instance LPCTSTR lpCursorName // name string or cursor resource identifier
5.1 窗口类概述
• 系统全局窗口类(System Global Class)—是系统 内定的窗口类,预先定义好的窗口类共有七种: COMBOBOX EDIT USEBOX 2. SCROLLBAR STATIC MDICLIENT • 系统全局窗口类不需要注册,不能破坏,不能删 除
5.1 窗口类概述
部分位图,而不是一个兼容的位图。这个标志在装载一个位图,而不是映射它的颜色到显示设备 时非常有用。 LR_DIFAULTSIZE:若 cxDesired或cyDesired未被设为零,使用系统指定的公制值标识光标或 图标的宽和高。如果这个参数不被设置且cxDesired或cyDesired被设为零,函数使用实际资源尺 寸。如果资源包含多个图像,则使用第一个图像的大小。 LR_LOADFROMFILE:根据参数lpszName的值装载图像。若标记未被给定,lpszName的值为 资源名称。 LR_LOADMAP3DCOLORS:查找图像的颜色表并且按下面相应的3D颜色表的灰度进行替换。 颜色替代:Dk Gray RGB(128,128,128)COLOR_3DSHADOW;Gray RGB(192,192, 192)COLOR_3DFACE Lt Gray RGB(223,223,223) COLOR_3DLIGHT LR_LOADTRANSPARENT;找到图像中的一个像素颜色值并且根据颜色表中系统的缺省颜色 值替代其相应接口的值。图像中所有使用这种接口的像素的颜色都变为系统的缺省窗体颜色。此 至仅用来申请相应的颜色表。 若fuLoad包括LR_LOADTRANSPARENT和LR_LOADMAP3DCOLORS两个值,则 LR_LOADTRANSPARENT优先。但是,颜色表接口由COLOR_3DFACE替代,而不是 COLOR_WINDOW。 LR_MONOCHROME:装载黑白图。 LR_SHARED:若图像将被多次装载则共享。如果LR_SHARED未被设置,则再向同一个资源第 二次调用这个图像是就会再装载以便这个图像且返回不同的句柄。

windows程序设计实验代码

windows程序设计实验代码

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操作系统概述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. 响应用户输入应用程序需要能够响应用户的输入,如鼠标点击、键盘敲击等,并根据用户的输入执行相应的操作。

系统编程系统编程涉及到操作系统的底层操作,如文件操作、进程和线程管理、内存管理等。

第8讲 Windows程序设计

第8讲  Windows程序设计

17
板 钟 讲
9.2.1 按钮控件
Button(按钮)控件用来接收用户的操作命令,激发 相应的事件,例如, “确定”或者“取消”。 在设计时,通常先添加控件,再为其Click事件编写代 码;在程序运行时,单击该按钮就会执行Click事件方法。 常用的属性有Name、Text、Visible、Enabled、FlatStyle、 Image和ImageAlign。 其中,Text属性指定要显示的标题文字,在字母前添 加“&”字符“可设置快捷键。 Image属性可以指定要显示的图像; ImageAlign、TextAign和TextImageRelation属性用来设置 图像与文本的排列方式。 18
20
板 钟 讲
2.RichTextBox控件
RichTextBox用于显示和输入格式化的文本(又称富 文本格式Rich Text Format,RTF),可以显示字体、颜 色和链接,从文件加载文本和加载嵌入的图像,以及查找 指定的字符,因此RichTextBox常常称为增强的文本框。 RichTextBox 控件通常用于提供类似字处理应用程序 (如 Microsoft Word)的文本操作和显示功能。 RichTextBox控件的默认设置是水平和垂直滚动条均根据 需要显示,并且拥有更多的滚动条设置。 RichTextBox常见的属性见表9-7。
25
板 钟 讲
9.3.1 RadioButton控件
RadioButton(单选按钮)控件为用户 提供由两个或多个互斥选项组成的选项集。 用户在一组单选按钮中只能选择一个。 表9-9和表9-10列出了RadioButton控件的常 用属生和事件。
26
板 钟 讲
9.3.2 CheckBox控件

Windows核心编程第五版学习笔记(一)

Windows核心编程第五版学习笔记(一)

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位汇编语言程序设计附书代码

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.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。

【2024版】操作系统教程第5版第3章【PV】

【2024版】操作系统教程第5版第3章【PV】
int X2=Aj; if(X2>=1) {
X2- -; Aj=X2; {输出一张票}; } else {输出信息"票已售完"}; }
13
3、与时间有关的错误(例子3 )
T1、T2并发执行,可能出现如下交叉情况: T1:X1=Aj; //X1=m T2:X2=Aj; //X2=m T2:X2--;Aj=X2;{输出一张票}; //Aj=m-1 T1:X1--;Aj=X1;{输出一张票}; //Aj=m-1 同一张票卖给两位旅客
22
4.2.1 互斥与临界区(1)
并发进程中,与共享变量有关的程序段叫“临 界区”, 共享变量代表的资源叫“临界资源” 。
与同一变量有关的临界区分散在各进程的程序 段中,而各进程的执行速度不可预知。
如果保证进程在临界区执行时,不让另一个进 程进入临界区,即各进程对共享变量的访问是 互斥的,就不会造成与时间有关的错误。
……
……
Step1: P先上CPU
28
软件方法1
free:临界区空闲标志 true:有进程在临界区;false:无进程在临界区 初值:free为false
P:
Q:
……
…… CPU 2
while(free);CPU free=true;
1
while(free); free=true;
临界区
临界区
➢ 顺序程序设计是把一个程序设计成一个顺序执行 的程序模块,顺序的含义不但指一个程序模块内 部,也指两个程序模块之间。
3
顺序程序设计特点
程序执行的顺序性 程序环境的封闭性 程序执行结果的确定性 计算过程的可再现性
顺序程序设计的缺点:计算机系统效率不高。
4
4.1.2 进程的并发性
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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) ;}。

相关文档
最新文档