windows环境下32位汇编语言程序设计-第34章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
; 画 _dwDegree 角度的线条,半径=_dwRadius
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DrawLine proc _hDC;_dwDegree;_dwRadius
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。3 创建和使用位图(2)
local @dwX1;@dwY1;@dwX2;@dwY2
invoke _CalcX;_dwDegree;_dwRadius
mov @dwX1;eax
invoke _CalcY;_dwDegree;_dwRadius
mov @dwY1;eax
add _dwDegree;180
invoke _CalcX;_dwDegree;10
mov @dwX2;eax
invoke _CalcY;_dwDegree;10
mov @dwY2;eax
invoke MoveToEx;_hDC;@dwX1;@dwY1;NULL
invoke LineTo;_hDC;@dwX2;@dwY2
ret
_DrawLine endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CreateClockPic proc
local @stTime:SYSTEMTIME
pushad
invoke BitBlt;hDcClock;0;0;CLOCK_SIZE;CLOCK_SIZE;
hDcBack;0;0;SRCCOPY
;********************************************************************
; 画时钟指针
;********************************************************************
invoke GetLocalTime;addr @stTime
invoke CreatePen;PS_SOLID;1;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wSecond
mov ecx;360/60
mul ecx ;秒针度数 = 秒 * 360/60
invoke _DrawLine;hDcClock;eax;60
pop eax
invoke DeleteObject;eax
;********************************************************************
invoke CreatePen;PS_SOLID;2;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wMinute
mov ecx;360/60
mul ecx ;分针度数 = 分 * 360/60
invoke _DrawLine;hDcClock;eax;55
pop eax
invoke DeleteObject;eax
;********************************************************************
invoke CreatePen;PS_SOLID;3;0
push eax
invoke SelectObject;hDcClock;eax
movzx eax;@stTime。wHour
。if eax 》= 12
sub eax;12
。endif
mov ecx;360/12
mul ecx
movzx ecx;@stTime。wMinute
shr ecx;1
add eax;ecx
invoke _DrawLine;hDcClock;eax;50
pop eax
invoke DeleteObject;eax
;********************************************************************
popad
ret
_CreateClockPic endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_CreateBackGround proc
local @hDc;@hDcCircle;@hDcMask
local @hBmpBack;@hBmpCircle;@hBmpMask
;********************************************************************
; 建立需要的临时对象
;********************************************************************
invoke GetDC;hWinMain
mov @hDc;eax
invoke CreatepatibleDC;@hDc
mov hDcBack;eax
invoke CreatepatibleDC;@hDc
mov hDcClock;eax
invoke CreatepatibleDC;@hDc
mov @hDcCircle;eax
invoke CreatepatibleDC;@hDc
mov @hDcMask;eax
invoke CreatepatibleBitmap;@hDc;CLOCK_SIZE;CLOCK_SIZE
mov hBmpBack;eax
invoke CreatepatibleBitmap;@hDc;CLOCK_SIZE;CLOCK_SIZE
mov hBmpClock;eax
invoke ReleaseDC;hWinMain;@hDc
invoke LoadBitmap;hInstance;dwNowBack
mov @hBmpBack;eax
invoke LoadBitmap;hInstance;dwNowCircle
mov @hBmpCircle;eax
mov eax;dwNowCircle
inc eax
invoke LoadBitmap;hInstance;eax
mov @hBmpMask;eax
invoke SelectObject;hDcBack;hBmpBack
invoke SelectObject;hDcClock;hBmpClock
invoke SelectObject;@hDcCircle;@hBmpCircle
invoke SelectObject;@hDcMask;@hBmpMask
;
;********************************************************************
; 以背景图片填充
;********************************************************************
invoke CreatePatternBrush;@hBmpBack
push eax
invoke SelectObject;hDcBack;eax
invoke PatBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;PATCOPY
invoke DeleteObject;eax
;********************************************************************
; 画钟面
;********************************************************************
invoke BitBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;
@hDcMask;0;0;SRCAND
invoke BitBlt;hDcBack;0;0;CLOCK_SIZE;CLOCK_SIZE;
@hDcCircle;0;0;SRCPAINT
;
invoke DeleteDC;@hDcCircle
invoke DeleteDC;@hDcMask
invoke DeleteObject;@hBmpBack
invoke DeleteObject;@hBmpCircle
invoke DeleteObject;@hBmpMask
ret
_CreateBackGround endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_DeleteBackGround proc
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。3 创建和使用位图(3)
invoke DeleteDC;hDcBack
invoke DeleteDC;hDcClock
invoke DeleteObject;hBmpBack
invoke DeleteObject;hBmpClock
ret
_DeleteBackGround endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_Init proc
local @hBmpBack;@hBmpCircle
;********************************************************************
; 初始化菜单
;********************************************************************
invoke CreatePopupMenu
mov hMenu;eax
invoke AppendMenu;hMenu;0;IDM_BACK1;offset szMenuBack1
invoke AppendMenu;hMenu;0;IDM_BACK2;offset szMenuBack2
invoke AppendMenu;hMenu;MF_SEPARATOR;0;NULL
invoke AppendMenu;hMenu;0;IDM_CIRCLE1;offset szMenuCircle1
invoke AppendMenu;hMenu;0;IDM_CIRCLE2;offset szMenuCircle2
invoke AppendMenu;hMenu;MF_SEPARATOR;0;NULL
invoke AppendMenu;hMenu;0;IDM_EXIT;offset szMenuExit
invoke CheckMenuRadioItem;hMenu;IDM_BACK1;IDM_BACK2;
IDM_BACK1;NULL
invoke CheckMenuRadioItem;hMenu;IDM_CIRCLE1;IDM_CIRCLE2;
IDM_CIRCLE1;NULL
;********************************************************************
; 设置圆形窗口并设置“总在最前面”
;********************************************************************
invoke CreateEllipticRgn;0;0;CLOCK_SIZE+1;CLOCK_SIZE+1
push eax
invoke SetWindowRgn;hWinMain;eax;TRUE
pop eax
invoke DeleteObject;eax
invoke SetWindowPos;hWinMain;HWND_TOPMOST;0;0;0;0;
SWP_NOMOVE or SWP_NOSIZE
;********************************************************************
; 建立背景
;********************************************************************
mov dwNowBack;IDB_BACK1
mov dwNowCircle;IDB_CIRCLE1
invoke _CreateBackGround
invoke _CreateClockPic
invoke SetTimer;hWinMain;ID_TIMER;1000;NULL
ret
_Init endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_Quit proc
invoke KillTimer;hWinMain;ID_TIMER
invoke DestroyWindow;hWinMain
invoke PostQuitMessage;NULL
invoke _DeleteBackGround
invoke DestroyMenu;hMenu
ret
_Quit endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_ProcWinMain proc uses ebx edi esi hWnd;uMsg;wParam;lParam
local @stPS:PAINTSTRUCT
local @hDC
local @stPos:POINT
mov eax;uMsg
;********************************************************************
。if eax WM_TIMER
invoke _CreateClockPic
invoke InvalidateRect;hWnd;NULL;FALSE
;********************************************************************
。elseif eax WM_PAINT
invoke BeginPaint;hWnd;addr @stPS
mov @hDC;eax
mov eax;@stPS。rcPaint。right
sub eax;@stPS。rcPaint。left
mov ecx;@stPS。rcPaint。bottom
sub ecx;@stPS。rcPaint。top
invoke BitBlt;@hDC;
@stPS。rcPaint。left;@stPS。rcPaint。top;
eax;ecx;hDcClock;@stPS。rcPaint。left;
@stPS。rcPaint。top;SRCCOPY
invoke EndPaint;hWnd;addr @stPS
;********************************************************************
。elseif eax WM_CREATE
mov eax;hWnd
mov hWinMain;eax
invoke _Init
;********************************************************************
。elseif eax WM_MAND
mov eax;wParam
;********************************************************************
;由于印刷宽度的问题,影响源代码的缩进格式,请读者注意
;********************************************************************
。if ax IDM_BACK1
mov dwNowBack;IDB_BACK1
invoke CheckMenuRadioItem;hMenu;I