WIN32汇编语言教程:第07章 图形操作 · 7.3 创建和使用位图(1)

7.2节探讨了绘制图形的一些函数,虽然绘图操作是图形程序必不可少的一部分,但丰富多彩的界面大部分还是靠设计精美的位图来铺成的,而不是靠绘图函数一点点画出来的。在大部分程序中,使用预先设计好的位图是最普遍的做法,在这一节中,将讨论如何使用位图,并在下一节中讨论使用块传送函数对位图进行操作。

7.3.1 一个使用位图的时钟例子

本节使用另一个时钟的例子,这个时钟的背景和边框用位图组成,程序中有两套背景图片和两套边框图片可供自由选择,图7.9显示了几种不同组合下的时钟外形,最右边的是在时钟上面按下右键弹出的选择菜单。


图7.9 BmpClock时钟程序的运行结果

程序的源代码可以在所附光盘的Chapter07\BmpClock目录中找到,包括汇编源程序BmpClock.asm、资源脚本文件BmpClock.rc和一些图片。

BmpClock.rc源文件如下,中间定义了一些程序中要使用的位图:

//##################################################################
#include       <resource.h>
//##################################################################
#define ICO_MAIN          100
#define IDC_MAIN          100
#define IDC_MOVE          101
#define IDB_BACK1         100
#define IDB_CIRCLE1           101
#define IDB_BACK2         103
#define IDB_CIRCLE2           104
#define IDB_MASK2         105
//##################################################################
ICO_MAIN         ICON           "Main.ico"
IDC_MAIN          CURSOR     "Main.cur"
IDC_MOVE         CURSOR     "Move.cur"
IDB_BACK1      BITMAP     "Back1.bmp"
IDB_CIRCLE1    BITMAP     "Circle1.bmp"
IDB_MASK1      BITMAP     "Mask1.bmp"
IDB_BACK2      BITMAP     "Back2.bmp"
IDB_CIRCLE2    BITMAP     "Circle2.bmp"
IDB_MASK2      BITMAP     "Mask2.bmp"

汇编源程序BmpClock.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 等值定义
;####################################################################
CLOCK_SIZE     equ    150
ICO_MAIN         equ    100
IDC_MAIN         equ    100
IDC_MOVE          equ    101
IDB_BACK1      equ    100
IDB_CIRCLE1    equ    101
IDB_MASK1      equ    102
IDB_BACK2      equ    103
IDB_CIRCLE2    equ    104
IDB_MASK2      equ    105
ID_TIMER          equ    1
IDM_BACK1      equ    100
IDM_BACK2      equ    101
IDM_CIRCLE1    equ    102
IDM_CIRCLE2    equ    103
IDM_EXIT         equ    104
;####################################################################
; 数据段
;####################################################################
                  .data?
hInstance      dd         ?
hWinMain          dd         ?
hCursorMove    dd         ?  ;Cursor when move
hCursorMain    dd         ?  ;Cursor when normal
hMenu          dd        ?
hBmpBack          dd         ?
hDcBack        dd         ?
hBmpClock      dd         ?
hDcClock          dd         ?
dwNowBack      dd         ?
dwNowCircle    dd         ?
;####################################################################
                 .const
szClassName    db     'Clock',0
dwPara180      dw     180
dwRadius          dw     CLOCK_SIZE/2
szMenuBack1    db    '使用格子背景(&A)',0
szMenuBack2    db    '使用花布背景(&B)',0
szMenuCircle1  db    '使用淡蓝色边框(&C)',0
szMenuCircle2  db    '使用粉红色边框(&D)',0
szMenuExit    db    '退出(&X)...',0
;####################################################################
; 代码段
;####################################################################
                 .code
;####################################################################
; 计算时钟圆周上某个角度对应的 X 坐标
; X = 圆心X + Sin(角度) * 半径
;####################################################################
_CalcX         proc       _dwDegree,_dwRadius
                 local  @dwReturn
 
                 fild       dwRadius
                 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       dwRadius
             fild       _dwDegree
             fldpi
             fmul
             fild       dwPara180
             fdivp  st(1),st
             fcos
             fild       _dwRadius
             fmul
             fsubp  st(1),st
             fistp  @dwReturn
             mov    eax,@dwReturn
             ret
 
_CalcY     endp
;####################################################################
; 画 _dwDegree 角度的线条,半径=_dwRadius
;####################################################################
_DrawLine  proc       _hDC,_dwDegree,_dwRadius

上页:第07章 图形操作 · 7.2 绘制图形(6) 下页:第07章 图形操作 · 7.3 创建和使用位图(2)

第07章 图形操作

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号