《windows环境下32位汇编语言程序设计》

下载本书

添加书签

windows环境下32位汇编语言程序设计- 第39节


按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!

        invoke   EndPaint;hWnd;addr stPS

        xor      eax;eax

        ret

读者可以发现中间并没有调用ValidateRect来使无效区域变得有效,这是因为BeginPaint函数和EndPaint函数隐含有这个功能,如果不是以BeginPaint/EndPaint当做消息处理代码的头尾的话,那么在WM_PAINT消息返回的时候就必须调用ValidateRect函数。

BeginPaint函数的第二个参数是一个绘图信息结构的缓冲区地址,Windows会在这里返回绘图信息结构,结构中包含了无效区域的位置和大小,绘图信息结构的定义如下:

PAINTSTRUCT STRUCT

  hdc           DWORD      ?

  fErase        DWORD      ?

  rcPaint       RECT       

  fRestore      DWORD      ?

  fIncUpdate    DWORD      ?

  rgbReserved   BYTE 32 dup(?)

PAINTSTRUCT ENDS

其中hdc字段是窗口的设备环境句柄(在下一节中将要讲到),rcPaint字段是一个RECT结构,它指定了无效区域矩形的对角顶点,fErase字段如果为非零值,表示Windows在发送WM_PAINT消息前已经用背景色擦除了无效区域,后面3个字段是Windows内部使用的,应用程序不必去理会它们。

7。1。2  设备环境

好了,解决了“When”的问题,让我们来考虑一个新的问题,在DOS操作系统中,向屏幕输出数据实际上是把输出内容拷贝到视频缓冲区中,在第1章的图1。1中就已经说明:如果在文本模式下显示信息,只需要把内容拷贝到B8000h处的内存中;显示图形信息,可以把图形数据拷贝到A0000h处的内存中。

在Windows中,GDI接口把程序和硬件分隔开来,在Win32编程中,再也不能通过直接向视频缓冲区拷贝数据的办法来显示信息了,那么,究竟该往哪里输出图形呢——这就是“Where”的问题。答案是:通过“设备环境”来输出图形。

1。 什么是设备环境

在Windows中,所有与图形相关的操作都是用统一的方法来完成的(不然就不能称为“图形设备接口”了)。不管是绘画屏幕上的一个窗口,还是把图形输出到打印机,或者对一幅位图进行绘画,使用的绘图函数都是相同的,为了实现方法上的统一,必须将所有的图形对象看成是一个虚拟的设备,这些设备可能有不同的属性,如黑白打印机和彩色屏幕的颜色深度是不同的,不同打印机的尺寸和分辨率可能是不同的,绘图仪只支持矢量而不支持位图等。不同设备的不同属性就构成了一个绘图的“环境”,就像DOS操作系统中把视频缓冲区当做图形操作的对象一样,这个绘图的“环境”就是Win32编程中图形操作的对象,把它叫做“设备环境”。设备环境实际上是一个数据结构,结构中保存的就是设备的属性,当对设备环境进行图形操作的时候,Windows可以根据这些属性找到对应的设备进行相关的操作。

在实际使用中,通过“设备环境”可以操作的对象很广泛,除了可以是打印机或绘图仪等硬件设备外,也可以是窗口的客户区,包括大大小小的所有可以被称为窗口的按钮与控件等的客户区,也可以是一个位图。总之,任何需要用到图形操作的东西都可以通过“设备环境”进行绘图。

为了更好地理解“设备环境”是什么,先来看一个例子,例子的代码在所附光盘的Chapter07DcCopy目录中,DcCopy。asm中的代码如下:

                    。386

                    。model flat;stdcall

                    option casemap:none

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; Include 文件定义

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

include         windows。inc

include         gdi32。inc

includelib      gdi32。lib

include         user32。inc

includelib      user32。lib

include         kernel32。inc

includelib      kernel32。lib

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

ID_TIMER            equ 1

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 数据段

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                    。data?

hInstance       dd      ?

hWin1           dd      ?

hWin2           dd      ?

 

                    nst

szClass1            db  'SourceWindow';0

szClass2            db  'DestWindow';0

szCaption1      db  '请尝试用别的窗口覆盖本窗口!';0

szCaption2      db  '本窗口图像拷贝自另一窗口';0

szText          db  'Win32 Assembly; Simple and powerful !';0

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

                    de

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 定时器过程

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_ProcTimer      proc        _hWnd;uMsg;_idEvent;_dwTime

                    local   @hDc1;@hDc2

                    local   @stRect:RECT

 

                    invoke  GetDC;hWin1

                    mov     @hDc1;eax

                    invoke  GetDC;hWin2

                    mov     @hDc2;eax

                    invoke  GetClientRect;hWin1;addr @stRect

                    invoke  BitBlt;@hDc2;0;0;@stRect。right;@stRect。bottom;



 
来源:电子工业出版社 作者:罗云彬 上一页         回书目         下一页          
上一页         回书目         下一页          
  


第7章 图形操作


7。1 GDI原理(3)

    
                            @hDc1;0;0;SRCCOPY

                    invoke  ReleaseDC;hWin1;@hDc1

                    invoke  ReleaseDC;hWin2;@hDc2

                    ret

 

_ProcTimer      endp

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

; 窗口过程

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_ProcWinMain        proc        uses ebx edi esi;hWnd;uMsg;wParam;lParam

                    local   @stPs:PAINTSTRUCT

                    local   @stRect:RECT

                    local   @hDc

 

                    mov     eax;uMsg

                    mov     ecx;hWnd

;********************************************************************

                    。if eax   WM_PAINT && ecx  hWin1

                        invoke  BeginPaint;hWnd;addr @stPs

                        mov     @hDc;eax

                        invoke  GetClientRect;hWnd;addr @stRect

                        invoke  DrawText;@hDc;addr szText;…1;

                                addr @stRect;

                                DT_SINGLELINE or DT_CENTER or DT_VCENTER

                        invoke  EndPaint;hWnd;addr @stPs

;********************************************************************

                    。elseif eax   WM_CLOSE

                            invoke  PostQuitMessage;NULL

                            invoke  DestroyWindow;hWin1

                            invoke  DestroyWindow;hWin2

;********************************************************************

                    。else

                            invoke  DefWindowProc;hWnd;uMsg;wParam;lParam

                            ret

                    。endif

;********************************************************************

                    xor eax;eax

                    ret

 

_ProcWinMain    endp

;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

_WinMain        proc

                local   @stWndClass:WNDCLASSEX

                local   @stMsg:MSG

                local   @hTimer

            

                invoke  GetModuleHandle;NULL

                mov     hInstance;eax

                invoke  RtlZeroMemory;addr @stWndClass;sizeof @stWndClass

;********************************************************************

                invoke  LoadCursor;0;IDC_ARROW

                mov     @stWndClass。hCursor;eax

                push        hInstance

                pop     @stWndClass。hInstance

                mov     @stWndClass。cbSize;sizeof WNDCLASSEX

                mov     @stWndClass。style;CS_HREDRAW or CS_VREDRAW

                mov     @stWndClass。lpfnWndProc;offset _ProcWinMain

                mov     @stWndClass。hbrBackground;COLOR_WINDOW + 1

                mov     @stWndClass。lpszClassName;offset szClass1

                invoke  RegisterClassEx;addr @stWndClass

                invoke  CreateWindowEx;WS_EX_CLIENTEDGE;offset szClass1;

                        offset szCaption1;WS_OVERLAPPEDWINDOW;

                        450;100;300;300;

                        NULL;NULL;hInstance;NULL

                mov     hWin1;eax

                invoke  ShowWindow;hWin1;SW_SHOWNORMAL

                invoke  UpdateWindow;hWin1

;********************************************************************

                mov     @stWndClass。lpszClassName;offset szClass2

                invoke  RegisterClassEx;addr @stWndClass

                invoke  CreateWindowEx;WS_EX_CLIENTEDGE;offset szCl
小提示:按 回车 [Enter] 键 返回书目,按 ← 键 返回上一页, 按 → 键 进入下一页。 赞一下 添加书签加入书架