友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
飞读中文网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

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

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




                    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) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!