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

下载本书

添加书签

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


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

invoke  GetNearestColor;hDC;dwColor ;返回真正使用的颜色值

但是当显示设备颜色深度太低的时候,经过Windows自动转换的图像可能会让人觉得很不自然,所以在有些时候,程序员可能希望预先得知设备的颜色深度,然后根据具体情况显示不同的图形。

显示设备的颜色深度可以用以下函数获取:

    invoke  GetDeviceCaps,hDC,PLANES

    mov     ebx,dwPlanes

    invoke  GetDeviceCaps,hDC,BITSPIXEL

    mul     ebx

    mov     dwColorDepth;eax

第一个函数调用返回DC的色彩平面数,第二个函数调用返回每个像素的色彩位数,颜色深度最后可以通过dwPlanes乘以dwBitsPixel得到。

2。 Windows中的坐标系


 
 
要用GDI函数绘图,就必须首先了解这些函数使用的坐标系,在默认的状态下,Windows坐标系以左上角做坐标原点,以右方当做X坐标的正方向,以下方当做Y坐标的正方向。坐标的数值用一个有符号的16位数来表示,范围从―32 768~32 767,坐标的单位为像素,如图7。3所示。这种坐标系定义方法的好处是:窗口中每一点的坐标不会因为窗口的大小改变而改变,试想一下,如果以数学中通常的表示方法,以左下角做坐标原点,那么当窗口高度被用户调整的时候,客户区中每一点的Y坐标都会变化,在具体使用中就会有诸多不便。

但是Windows也提供了其他的一些坐标映射方法供程序员使用,可以用SetMap Mode函数来为一个DC设置新的坐标映射方法:

invoke  SetMapMode,hDC,iMapMode

可以设置的参数包括坐标原点、坐标的逻辑单位和坐标的正方向等,参数中的iMapMode为新的映射方式,其可以选择的取值如表7。1所示,Windows默认使用的映射方法为MM_TEXT。

表7。1  Windows中可用的坐标映射方式

映 射 方 法
 原    点
 逻 辑 单 位
 X 正 方 向
 Y 正 方 向
 
MM_TEXT(默认方式)
 左上
 像素
 右
 下
 
MM_HIENGLISH
 左上
 0。001英寸
 右
 上
 
MM_LOENGLISH
 左上
 0。01英寸
 右
 上
 
MM_HIMETRIC
 左上
 0。01毫米
 右
 上
 
MM_LOMETRIC
 左上
 0。1毫米
 右
 上
 
MM_TWIPS
 左上
 1/1440英寸
 右
 上
 
MM_ISOTROPIC
 可变
 可变(x=y)
 可变
 可变
 
MM_ANISOTROPIC
 可变
 可变(x!=y)
 可变
 可变
 

可以看到,除了默认的MM_TEXT方式外,下面5种映射方式:MM_HIENGLISH,MM_LOENGLISH,MM_HIMETRIC,MM_LOMETRIC和MM_TWIPS采用的都是原点位于左上角、X正方向向上的映射方式,另外,它们的坐标逻辑单位是不同的。

最后的两种映射方式MM_ISOTROPIC和MM_ANISOTROPIC提供了更灵活的选择,设置为这两种映射方式后,程序可以继续调用SetViewportOrgEx,SetViewportExtEx和SetWindowExtEx函数来自由设置坐标系的原点、逻辑单位和坐标的正方向等所有参数。在其他映射方式下的时候,不能使用这3个设置函数,这时任何对它们的调用都会被忽略。



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


第7章 图形操作


7。2 绘 制 图 形(1)

    
有了前面的这些基础,这一节将用一个时钟的例子来演示如何进行简单的绘图,例子的源代码可以在所附光盘的Chapter07Clock目录中找到,程序运行的结果如图7。4所示。


图7。4  时钟程序的运行结果

资源脚本文件Clock。rc中简单定义了一个用做图标的ico文件:

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#include            

//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

#define     ICO_MAIN        Ox1000

ICO_MAIN        ICON            〃Main。ico〃

源文件Clock。asm如下:

                        。386

                        。model flat; stdcall

                        option casemap :none

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

; Include 文件定义

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

include             windows。inc

include             user32。inc

includelib          user32。lib

include             kernel32。inc

includelib          kernel32。lib

include             Gdi32。inc

includelib          Gdi32。lib

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

; Equ 等值定义

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

ICO_MAIN                equ     1000h

ID_TIMER                equ     1

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

; 数据段

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

                        。data?

hInstance           dd      ?

hWinMain                dd      ?

dwCenterX           dd      ?       ;圆心X

dwCenterY           dd      ?       ;圆心Y

dwRadius                dd      ?       ;半径

                        nst

szClassName         db      'Clock';0

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

; 代码段

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

                        de

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

; 计算时钟的位置、大小等参数

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

_CalcClockParam     proc

                        local   @stRect:RECT

 

                        invoke  GetClientRect;hWinMain;addr @stRect

                        mov     eax;@stRect。right

                        sub     eax;@stRect。left        ;eax = 宽度

                        mov     ecx;@stRect。bottom

                        sub     ecx;@stRect。top     ;ecx = 高度

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

; 比较客户区宽度和高度,以小的值用做时钟的直径

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

                        。if     ecx 》 eax

                                mov     edx;eax     ;高度 》 宽度

                                sub     ecx;eax

                                shr     ecx;1

                                mov     dwCenterX;0

                                mov     dwCenterY;ecx

                        。else

                                mov     edx;ecx

                                sub     eax;ecx

                                shr     eax;1

                                mov     dwCenterX;eax

                                mov     dwCenterY;0

                        。endif

                        shr     edx;1

                        mov     dwRadius;edx

                        add     dwCenterX;edx

                        add     dwCenterY;edx

                        ret

 

_CalcClockParam     endp

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

; 计算时钟圆周上某个角度对应的 X 坐标

; X = 圆心X + Sin(角度) * 半径

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

_dwPara180          dw      180

_CalcX              proc        _dwDegree;_dwRadius

                        local   @dwReturn

 

                        fild        dwCenterX

                        fild        _dwDegree

                        fldpi

                        fmul                    ;角度*Pi

                        fild        _dwPara180

                        fdivp   st(1);st        ;角度*Pi/180

                        fsin                    ;Sin(角度*Pi/180)

                        fild        _dwRadius

                        fmul                    ;半径*Sin(角度*Pi/180)

                        fadd                    ;X+半径*Sin(角度*Pi/180)

                        fistp   @dwReturn

                        mov     eax;@dwReturn

                        ret

 

_CalcX              endp

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

; 计算时钟圆周上某个角度对应的 Y 坐标

; Y = 圆心Y … Cos(角度) * 半径

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

_CalcY              proc        _dwDegree;_dwRadius

                        local   @dwReturn

 

                        fild        dwCenterY

                        fild        _dwDegree

                        fldpi

                        fmul

                        fild        _dwPara180

                        fdivp   st(1);st

                        fcos



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


第7章 图形操作


7。2 绘 制 图 形(2)

    
                        fild        _dwRadius

                        fmul

                        fsubp   st(1);st

                        fistp   @dwReturn

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