Win32程序快速入门指南

合集下载

python3 win32print开发文档

python3 win32print开发文档

python3 win32print开发文档Win32print开发文档Win32print是一个Python模块,用于与Windows操作系统的打印机进行交互。

它提供了一系列函数和常量,使开发人员能够直接控制和管理打印机设备以及与之相关的功能。

本文将一步一步回答与Win32print开发文档相关的问题。

1. 什么是Win32print?Win32print是一个Python模块,它提供了与Windows操作系统打印机相关的函数和常量。

通过使用这个模块,开发人员可以通过Python 程序与打印机设备进行交互。

2. 如何安装Win32print模块?安装Win32print模块非常简单。

首先,确保你已经安装了Python解释器。

然后,可以通过以下步骤来安装Win32print模块:1) 打开命令提示符(cmd)或PowerShell。

2) 运行以下命令:`pip install pywin32`。

安装完成后,你就可以在Python程序中导入并使用Win32print模块了。

3. Win32print提供了哪些常用函数?Win32print提供了一系列常用函数,用于与打印机设备进行交互。

其中一些常用函数包括:- `EnumPrinters`: 枚举系统中的打印机设备。

- `GetDefaultPrinter`: 获取默认打印机的名称。

- `SetDefaultPrinter`: 设置默认打印机。

- `OpenPrinter`: 打开一个已经安装的打印机设备。

- `StartDocPrinter`: 开始一个打印作业。

- `EndDocPrinter`: 结束一个打印作业。

- `StartPagePrinter`: 开始一张打印页。

- `EndPagePrinter`: 结束一张打印页。

- `WritePrinter`: 向打印机发送数据。

- `ClosePrinter`: 关闭一个已经打开的打印机设备。

pywin32简易入门(转)

pywin32简易入门(转)

pywin32简易⼊门(转)停更⼀年多了,最近对PY产⽣了兴趣,应为想解放双⼿,⼜不想⽤按键精灵之类的软件,于是乎就百度到了这个东东“pywin32”打开了新世界的⼤门,So,就在这记录学习笔记吧。

⾔归正传准备部分1pip install pywin32准备部分2⼯欲善其事必先利其器,先装个Spy++,百度⼀⼤把,就不放链接了,具体使⽤⽅法参考这⾥(⼀段简短的介绍)不过也够⽤了。

代码部分⾸先import win32guiimport win32conwin = win32gui.FindWindow('Notepad','新建⽂本⽂档.txt - 记事本')tid = win32gui.FindWindowEx(win,None,'Edit',None)win32gui.SendMessage(tid, win32con.WM_SETTEXT, None, '你好hello word!')win32gui.PostMessage(tid,win32con.WM_KEYDOWN,win32con.VK_RETURN,0)print("%x" % tid)print("%x" % win2)⼀句⼀句解释:win = win32gui.FindWindow('Notepad','新建⽂本⽂档.txt - 记事本')这⾥搬运⼀下⼤佬博客的解释,FindWindow(lpClassName=None, lpWindowName=None)描述:⾃顶层窗⼝(也就是桌⾯)开始搜索条件匹配的窗体,并返回这个窗体的句柄。

不搜索⼦窗⼝、不区分⼤⼩写。

找不到就返回0 参数:lpClassName:字符型,是窗体的类名,这个可以在Spy++⾥找到。

lpWindowName:字符型,是窗⼝名,也就是标题栏上你能看见的那个标题。

PE文件格式之win32应用程序初探

PE文件格式之win32应用程序初探

PE文件格式之win32应用程序初探汉字最好--2008.1几年前曾打算学习PE文件格式,但满篇的英语和c语言令人声畏。

一直到上个月因为需要才硬着头皮学下来。

于是参考了几篇1.9版译文,同时对数个文件反编译、修改,最后自己组装了一个小exe,总算对PE文件有了一个初步的认识。

本文仅仅研究的是win32GUI程序中重要的内容,对dll,驱动,控制台没有涉及,适合最初学的、不懂c语言和英语的学习者学习。

工具:ollice,超级工具,本文用来PE文件在内存中的情况。

Winhex,二进制编辑工具,本文用来查看、编辑、创建PE文件。

Restool,资源工具,本文用来验证资源数据。

以上工具都有前辈的汉化修正版,对不懂鸟语学习者来说是天大的福音。

译者易也,我能理解翻译者的难处,给计算机英语取个好中文名有点难度。

是他们给我节约了学习一门外语的时间,让我不懂英语一样也学到了知识。

本文中不正确的地方望指正!一序言PE文件是微软弄出来的可执行文件格式。

Pe文件中的数据是一节节整齐的排列下去的,所以我们把一节数据称为‘节’。

PE文件的第一个节叫头节,但为了与其他节区别开,我把头节还是叫文件头。

文件头依次包括dos头、pe头、选项头、节头表四个部分。

执行pe文件实际上是系统的pe载入器把PE文件的各节映射到一个虚拟的进程空间后再执行代码的。

这个虚拟的进程空间在32位下有$FFFFFFFF($表示十六进制,相当于c的0x,汇编的H),即4GB大小,即所谓的虚拟内存,里面的地址也就是虚拟地址.这个pe文件在虚拟空间里称为映象文件,映象文件开始的地方叫映象文件基址.而本文后面提到的虚拟地址都是相对虚拟地址,即相对于映象文件基址的偏移量.而pe文件中的偏移量称为物理地址.本章给出了很多重要定义,有一些和1.9版译文不一样.其实起什么名不重要,重要的是能不能理解.另外,本文中称的’**表’除特别说明外指**的数组.如:节头表,就是节头的数组.下面用winhex打开附件中的st.exe对照学习.二dos头(数值和字符串在文件中的形式不用我提了吧?)下面一般有一个dos根结构,是一小段dos程序,对我们初学者没有用,本文就不提了.三PE头四选项头选项头是文件头的第三部分.选项头中的许多选项是告知系统如何在虚拟内存中执行的数据.共$E0字节数据索引表由16条索引组成,索引的前4字节是某种数据的虚拟地址,后4字节是数据的St.exe定义了第1,2,12项,没有用到的都置0,选项头到这里就结束了.其实也只有程序入口,映象文件基址,数据索引表让你斟酌一下,其他都有默认值.五节头表节头表由一串节头组成.每个节头都声明如何把一个节映射到虚拟内存中去.一个节头有常见节属性:我们一起看st.exe,红色标记虚拟地址:00000060 00 00 00 00 00 00 00 00 30 10 00 00 00 00 00 00 ........0.......00000070 00 00 00 00 00 00 40 0000 10 00 00 00 02 00 00 ......@.........$6C处是入口=$1030,$70处是映象文件基址=$400000.00000130 2E 74 65 78 74 00 00 00 .text... 00000140 00 01 00 00 00 10 00 0000 02 00 00 00 02 00 00 ................00000150 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 ............ ..`00000160 2E 72 64 61 74 61 00 00 6A 01 00 00 00 20 00 00.rdata..j.... ..00000170 00 02 00 00 00 04 00 00 00 00 00 00 00 00 00 00 ................00000180 00 00 00 00 40 00 00 40 2E 64 61 74 61 00 00 00 ....@..@.data...00000190 04 00 00 00 00 30 00 0000 00 00 00 00 00 00 00 .....0..........000001A0 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 ............@..?000001B0 2E 72 73 72 63 00 00 00 60 02 00 00 00 40 00 00.rsrc...`....@..000001C0 00 04 00 00 00 06 00 00 00 00 00 00 00 00 00 00 ................000001D0 00 00 00 00 40 00 00 40 ....@..@看这些节都没有超过节对齐,所以都只占一个节对齐..data只是预定了空间,适合变量用.虚拟地址转物理地址:我们看程序入口正好落到了.text节的+$30($1030-$1000)处,来到$200+$30:Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F00000230 6A 00 E8 35 01 00 00 A3 00 30 40 00 E8 4F 01 00 j.?...?0@.鐿..00000240 00 6A 00 68 5E 10 40 00 6A 00 6A 65 FF 35 00 30 .j.h^.@.j.je 5.0可在OLLICE中查看此处代码含义($00401030).在节头表部分,每个节头的虚拟地址,大小,物理地址,属性都要仔细设定.文件头到这里就结束了,不足文件对齐整数倍的要补足0.文件后面紧跟节头表定义的各种节. 当然后面也可能只有一个节.六输入表输入表在虚拟内存中的地址和大小由选项头的数据索引表中第二条索引指定.输入表有点回调函数的味道,是给系统调用的.通过输入表,系统了解程序需要哪些动态库的函数,在加载PE文件时把这些动态库也映射到进程虚拟空间,并把这些函数的地址写到程序指定的地方供调用.输入表实际上是一个‘输入说明结构’的数组.该数组的最后一个成员置0以表结束.上述结构中第2,3项没有找到实例所以跳过,呵呵.动态库名也好理解,关键是第1,5项.地址一是个指针,指向函数索引地址表.这个表里都是函数索引的地址,以空地址(0)表示结束.函数索引由一个2个字节的索引号和进跟其后的一个标准字符串(即函数名)组成.系统的工作就是首先获得动态库名,然后顺着地址一找到函数索引地址表,再一条条地读函数索引,将找到的函数的地址依次写到地址二指定的地址表中,直到读到空地址,再读取下一条输入说明结构,直到为0.有点难于理解?再次用winhex和ollice打开st.exe:000000C0 30 20 00 00 50 00 00 00 00 40 00 00 60 02 00 00 0 ..P....@..`...来到$C0处,输入表的虚拟地址是$2030,大小$50.换成物理地址在$430,在.rdata节中.来到$430处,可以读倒条输入说明结构:00000430 88 20 00 00 00 00 00 00 00 00 00 00 F2 20 00 00?..........?..00000440 08 20 00 009C 20 00 00 00 00 00 00 00 00 00 00. ..?..........00000450 3A 21 00 00 1C 2000 0080 20 00 00 00 00 00 00:!... ..€ ......00000460 00 00 00 00 5C 21 00 00 00 20 00 00 00 00 00 00 ....\!... ......00000470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................上面都是虚拟地址,转成物理地址时-$2000+$400.以第一条为例,地址一为$2088->$488,地址二为$2008->$408,动态库名为$20F2->$4F2. 000004F0 00 00 6B 65 72 6E 65 6C 33 32 2E 64 6C 6C 00 00 ..kernel32.dll..$4F2原来是kernel32.dll.$488处:00000480 E2 20 00 00 CE 20 00 00 ?..?..00000490 BE 20 00 00 B0 20 00 00 00 00 00 00 ?..?......有四个地址,也就是说有四个函数.来到$4E2($2012):000004E0 00 00 3C 02 53 65 74 4C 61 73 74 45 72 72 6F 72 ..<.SetLastError000004F0 00 00 ..找到了一个函数,其它的就这么找.在地址二指向的$408好像看不到什么,到OLLICE中,点’M’图标,,在列表中双击输入表项(Memory map, 条目21),在弹出的窗口中看$400000+$2008处已经写入了函数地址,红色字体表示是载入时写入的.多数情况下程序并不是直接CALL这个地址,而是先CALL一个跳转表,然后JMP到这里: 00401030 >/$ 6A 00 push 0 ; /pModule = NULL 00401032 |. E8 35010000 call <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA0040116C $- FF25 0C204000 jmp dword ptr [<&kernel32.GetModuleH>; kernel32.GetModuleHandleA00401172 $- FF25 08204000 jmp dword ptr [<&kernel32.SetLastErr>; ntdll.RtlSetLastWin32Error一些编译器将地址一都置0,这时系统用地址二代替地址一,此时,地址二指向的地址表要符合函数索引地址表的规范,即以空地址表结束.以Project1.exe(delphi编写的)为例:输入表00002C00 00 00 00 00 00 00 00 00 00 00 00 00 08 61 00 00 .............a..00002C10 78 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 x`..............00002C20 90 62 00 00 D0 60 00 00 00 00 00 00 00 00 00 00 恇..衊..........00002C30 00 00 00 00 BC 62 00 00 DC 60 00 00 00 00 00 00 ....糱..躟......00002C40 00 00 00 00 00 00 00 00 FC 62 00 00 EC 60 00 00 ........黚..靈..00002C50 00 00 00 00 00 00 00 00 00 00 00 00 48 63 00 00 ............Hc..00002C60 00 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .a..............00002C70 00 00 00 00 00 00 00 00地址二指向的地址表00002CD0 9C 62 00 00 AE 62 00 00 00 00 00 00 CA 62 00 00 渂..産......蔮..00002CE0 DE 62 00 00 EE 62 00 00 00 00 00 00 0A 63 00 00 辀..頱.......c..00002CF0 18 63 00 00 26 63 00 00 34 63 00 00 00 00 00 00 .c..&c..4c......00002D00 54 63 00 00 00 00 00 00 Tc......再看看ollice中相应的地方,明白了吗?多打开几个文件看看就会加深映象。

Windows操作系统基本操作指南

Windows操作系统基本操作指南

Windows操作系统基本操作指南- 概述- 桌面环境- 文件操作- 系统设置- 程序使用概述Windows操作系统是一款广泛应用于个人电脑和笔记本电脑的操作系统,具有用户友好的界面和丰富的功能。

本指南将详细介绍Windows操作系统的基本操作,帮助读者快速熟悉和使用该系统。

桌面环境Windows操作系统的桌面环境是用户最常接触和使用的部分。

桌面上通常会有各种快捷方式、文件和文件夹,以及任务栏和开始菜单。

通过任务栏可以方便地切换和管理打开的程序,而开始菜单包含了各种应用程序和系统工具。

文件操作在Windows操作系统中,文件和文件夹的管理十分重要。

通过资源管理器可以打开和浏览电脑上的各种存储设备和文件夹。

用户可以创建、复制、移动、重命名和删除文件和文件夹,同时还可以进行文件搜索和属性查看。

系统设置Windows操作系统提供了丰富的系统设置选项,方便用户进行个性化设置和性能优化。

例如,用户可以更改桌面壁纸、调整屏幕分辨率、设置电源管理模式和网络连接,以及更新和安装驱动程序。

程序使用Windows操作系统支持各种软件和应用程序的安装和使用。

用户可以通过开始菜单中的“程序”或者桌面上的快捷方式来打开各种应用程序。

同时,Windows操作系统还提供了任务管理器,方便用户查看和关闭正在运行的程序。

总结通过本指南的学习,读者可以快速了解和掌握Windows操作系统的基本操作。

从桌面环境到文件操作,再到系统设置和程序使用,Windows操作系统都提供了丰富的功能和选项,方便用户进行个性化设置和优化。

希望本指南对读者在使用Windows操作系统时有所帮助。

创建第一个C++Win32控制台应用程序

创建第一个C++Win32控制台应用程序

创建第一个C++的Win32控制台应用程序
1.打开VS2008,依次选择菜单:文件--→新建--→项目。

2.在新建项目窗口中,依次选择项目类型中的其他语言--→Visual C++ ----→Win32,选择模板中的Win32控制台应用程序。

在名称栏中输入项目名称 Win32ConsoleApplicaiton,项目所在位置可单击浏览按钮选择目录位置。

选择完毕后,单击确定按钮。

3.在Win32应用程序向导中单击“下一步”
4.不用修改任何选项,单击“下一步”
5. 右侧是解决方案的资源管理器,双击文件名可以打开相应文件。

找到相应的main函数。

6.在main函数中输入相应的代码。

7.stdafx.h的作用,当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。

所以,在stdafx.h中填写头部文件。

在有main函数的文件中在添加代码:#include “stdafx.h”
即可。

8.按“Ctrl+F5”可以查看运行结果。

如果按F5或单击工具栏中的“”可以进行调试,
但无法保留最终运行结果。

WIN32汇编程序PPT课件

WIN32汇编程序PPT课件

例4
count darray
.model small .386
;采用32位指令
.stack
.data
equ 10
dd 20,4500h,3f40h,-1,7f000080h
dd 81000000h,0fffffff1h
dd -45000011,12345678
dd 87654321
.code
.startup
条件转移
转移范围可达到32位全偏移
Jcc label
;cc为真,转移到label指定的转段移内范偏围移仍地为址处短转移
JECXZ label ;ECX=0,转移到label指定的段内偏移地址处
LOOP/LOOPZ/LOOPNZ label ;循环指令,32位段采用ECX作为计数器
例1
;将AX的每一位依次重复一次 ;所得的32位结果保存于EAX中 mov ecx,16 mov bx,ax next:shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx
;平衡堆栈
通用寄存器全部进出栈
PUSHA
;顺序将AX/CX/DX/BX/SP/BP/SI/DI压入堆栈
POPA
;顺序从堆栈弹出 DI/SI/BP/SP/BX/DX/CX/AX (与PUSHA相反) ;其中应进入SP的值被舍弃,并不进入SP,SP 通过增加16来恢复
符号扩展和零位扩展
MOVSX r16,r8/m8 ;把r8/m8符号扩展并传送至r16 MOVSX r32,r8/m8/r16/m16 ;把r8/m8/r16/m16符号扩展并传送至r32 MOVZX r16,r8/m8
三、32位指令的程序设计

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

第9章 Win32编程

第9章  Win32编程

第9章
Win32编程
9.1.1 Windows API的有关概念
Windows API都是以DLL输出函数的形式提供的, 大部分核心的API服务都在Kernel32.dll、GUI32.dll和 User32.dll三个文件内,它们位于Windows\System (Winnt\System32)目录内。还有许多重要的API函数在 Windows (Winnt)或Windows\System (Winnt\System32) 目录中的其它DLL文件内(本章第5节将介绍DLL)。这 些函数数量庞大,而且随着Windows版本的升级仍在 不断增加。对于普通程序员来说,不可能也没必要知 道每个API函数的用法,但应了解一些API的知识并且 能在需要时迅速查到自己感兴趣的API函数的资料。
GetActiveWindow、FindWindow等API函数取得其句柄。
第9章
Win32编程
下面一个例子是在当前Windows环境下查找一个标 题为“Hello”的窗口,如果查到该窗口,就将其标题 改为“How Are You”。 HWND hWnd ; if (hWnd = FindWindow (0, "Hello"))
判断一个窗口是否处于最小化状态
改变窗口的位置 改变窗口的位置和大小
第9章
Win32编程
BringWindowToTop FindWindow FlashWindow GetWindowText
将指定的窗口带到顶部 寻找符合某些条件的窗口 使指定的窗口闪烁显示 取窗口的标题或控件的内容
SetWindowText
运行外部应用程序 退出Windows并关闭或重新启动系统等 创建形状各异的窗口 打开剪贴板 清除剪贴板上的数据 关闭剪贴板
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Win32程序快速入门指南
1.程序说明
示例程序放在Win32ShapeOrg中
1.1_tWinMain
_tWinMain是程序入口。

while (GetMessage(&msg, NULL, 0, 0))开始为消息处理循环。

如果程序运行到此处将进入一个消息响应过程,即如果有消息就会进入消息响应函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 1.2全局初始化
如果要做全局初始化可以在tWinMain函数中while (GetMessage(&msg, NULL, 0, 0))前1.3消息响应机制
win32程序是基于消息响应的,最核心的模块是消息响应函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
消息是依附在某个窗口的。

其中hWnd是窗口句柄,windows程序里,每一个窗口都有一个HWND类型的句柄用于标识这个窗口。

message是UINT类型的消息,实质上整数,消息的其它信息包含在wParam和lParam中
1.4绘制函数
WM_PAINT是绘制消息,所有和绘制相关的代码都放在WM_PAINT消息响应部分(具体在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);之间),win32所有绘制函数都带有一个HDC类型设备上下文句柄的参数。

InvalidateRect(hWnd, NULL, true);语句会发出绘制消息。

如果需要更新绘制画面,就可以调用此语句。

Windows绘制机制的基础是图像设备交互(GDI,Graphics Device Interface)。

Brush是用来填充的刷子,绘制的东西是实心的。

Pen相当于画笔,用来描述绘制直线曲线时的颜色粗细样式等等。

如果不做设置,系统会提供默认的设置。

直线和曲线函数在这里,这是一个直线段的例子。

//显示文字
char cMessage[128];
sprintf(cMessage, "%d, %d", g_xPos, g_yPos);
SetBkMode(hdc, TRANSPARENT); //设置背景透明显示模式
TextOut(hdc, g_xPos+10, g_yPos-10, cMessage, strlen(cMessage));
//实心椭圆
int r = 9;
Ellipse(hdc, g_xPos-r, g_yPos-r, g_xPos+r, g_yPos+r); //当前位置坐标&位置+直径:
//空心椭圆
MoveToEx(hdc, g_xPos+r, g_yPos, 0);
AngleArc(hdc, g_xPos, g_yPos, r, 0, 360);
//画线
1.5一些有用的消息
消息和消息队列,Message Types里的System-Defined Messages中的WM,列出了各种类型的消息。

比较常见的消息包括:
●鼠标
左键点击,WM_LBUTTONDOWN,其它各种消息
获取鼠标位置:
int xPos, yPos;
xPos = GET_X_LPARAM(lParam);
yPos = GET_Y_LPARAM(lParam);
为了使用GET_X_LPARAM和GET_Y_LPARAM需要在加上头文件Windowsx.h
●键盘
某个键按下WM_KEYDOWN,按键信息在wParam中
switch(wParam)//看看是哪个键
{
case 'A':
case 'a':
break;
case 'S':
case 's':
break;
}
●时钟
WM_TIMER,启动一个时钟的函数SetTimer,这里是例子
示例中加在程序初始化部分,消息循环之前。

SetTimer(hWnd, 1, 30, NULL);//每隔30毫秒激活一次时钟响应
此语句要用到窗口句柄,放在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)中。

WM_SIZE
窗口大小改变,是Window Notifications系列的消息。

获取窗口尺寸示意代码int nWidth, nHeight;
nWidth = LOWORD(lParam); // width of client area
nHeight = HIWORD(lParam); // height of client area
1.6关于画面的特别讨论
Win32用于动画游戏绘制时,不加特殊处理会出现闪烁情况。

可以使用双缓冲技术来解决。

可以参考,在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);之间使用以下代码
此外还要响应WM_ERASEBKGND消息,直接return FALSE;即可。

2.程序封装
可以对程序进行接口封装处理。

示例程序放在Win32Shape中。

void UserInit(); //用户初始化函数
void UserFinish(); //用户清理函数
bool UserWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);//消息响应函数
void UserRender(HDC hdc); //用户绘制函数
用户添加的程序不再放在VS自动生成的主程序中。

相关文档
最新文档