太子爷小说网 > 杂集电子书 > windows环境下32位汇编语言程序设计 >

第35节

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

小说: windows环境下32位汇编语言程序设计 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!



时候,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 szClass2;

                        offset szCaption2;WS_OVERLAPPEDWINDOW;

                        100;100;300;300;

                        NULL;NULL;hInstance;NULL

                mov     hWin2;eax

                invoke  ShowWindow;hWin2;SW_SHOWNORMAL

                invoke  UpdateWindow;hWin2

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

; 设置定时器

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

                invoke  SetTimer;NULL;NULL;100;addr _ProcTimer

                mov @hTimer;eax

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

; 消息循环

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

                。while  TRUE

                        invoke  GetMessage;addr @stMsg;NULL;0;0

                        。break  。if eax  0

                        invoke  TranslateMessage;addr @stMsg

                        invoke  DispatchMessage;addr @stMsg

                。endw

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

; 清除定时器

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

                invoke  KillTimer;NULL;@hTimer

                ret

 

_WinMain        endp

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

start:

                call        _WinMain

                invoke  ExitProcess;NULL

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

                end     start

这个程序的代码用到的大部分知识都是前面各章已经讲到的,在_WinMain中,用一个同样的窗口类建立了两个窗口,两个窗口属于同一个窗口类,所以它们的窗口过程都是_ProcWinMain,为了关闭任何一个窗口都可以结束程序,WM_CLOSE消息中用DestroyWindow函数摧毁了两个窗口。程序设置了一个周期为100 ms的定时器,Windows会每隔100 ms调用_ProcTimer子程序。在_ProcTimer中,将其中一个窗口的客户区拷贝到另一个窗口的客户区中,方法是通过GetDC获取窗口的DC句柄,并用BitBlt函数完成拷贝工作(这些函数的具体用法在下面的内容中会讲到),所以在右边的窗口显示了一句“Win32 Assembly; Simple and powerful!”,左边的窗口中也会出现这句话。

这个程序能演示出什么效果来呢?图7。2就是程序运行的结果,屏幕上的两个并排的正方形窗口就是DcCopy程序建立的窗口,程序每100 ms将右边窗口的客户区拷贝到左边的窗口客户区中,通过左边窗口的客户区就可以了解右边客户区DC对应的究竟是什么内容。


图7。2  DcCopy程序的运行结果



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


第7章 图形操作


7。1 GDI原理(4)

    
   现在用其他程序将右边窗口客户区的一部分覆盖掉,通过左边窗口的变化可以惊奇地发现:右边窗口客户区的内容并不是程序自己输出到客户区的那句文本,而是以客户区为矩形区域的屏幕上我们真正看到的东西,它竟然包括其他窗口覆盖在上面的东西。这就意味着,扫雷游戏和纸牌游戏通过自己客户区对应的设备环境画图形,图形数据竟然画到了DcCopy窗口客户区对应的设备环境中。

这个例子验证了“设备环境”只是“环境”而不是“设备”,它并不存储发给它的图形数据,图形数据透过它写到了它所描述的“设备”上,每个窗口客户区的“设备环境”对应的设备都是屏幕,但它们在位置上可

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的