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章 图形操作
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号