windows环境下32位汇编语言程序设计-第42节
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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;IDM_BACK1;IDM_BACK2;IDM_BACK1;NULL
。elseif ax IDM_BACK2
mov dwNowBack;IDB_BACK2
invoke CheckMenuRadioItem;hMenu;IDM_BACK1;IDM_BACK2;IDM_BACK2;NULL
。elseif ax IDM_CIRCLE1
mov dwNowCircle;IDB_CIRCLE1
invoke CheckMenuRadioItem;hMenu;IDM_CIRCLE1;IDM_CIRCLE2;
IDM_CIRCLE1;NULL
。elseif ax IDM_CIRCLE2
mov dwNowCircle;IDB_CIRCLE2
invoke CheckMenuRadioItem;hMenu;IDM_CIRCLE1;IDM_CIRCLE2;
IDM_CIRCLE2;NULL
。elseif ax IDM_EXIT
call _Quit
xor eax;eax
ret
。endif
;********************************************************************
; 恢复源代码缩进格式
;********************************************************************
invoke _DeleteBackGround
invoke _CreateBackGround
invoke _CreateClockPic
invoke InvalidateRect;hWnd;NULL;FALSE
。elseif eax WM_CLOSE
call _Quit
;********************************************************************
; 按下右键时弹出一个POPUP菜单
;********************************************************************
。elseif eax WM_RBUTTONDOWN
invoke GetCursorPos;addr @stPos
invoke TrackPopupMenu;hMenu;TPM_LEFTALIGN;
@stPos。x;@stPos。y;NULL;hWnd;NULL
;********************************************************************
; 由于没有标题栏,下面代码用于按下左键时移动窗口
; UpdateWindow:即时刷新,否则要等到放开鼠标时窗口才会重画
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第7章 图形操作
7。3 创建和使用位图(4)
;********************************************************************
。elseif eax WM_LBUTTONDOWN
invoke SetCursor;hCursorMove
invoke UpdateWindow;hWnd
invoke ReleaseCapture
invoke SendMessage;hWnd;WM_NCLBUTTONDOWN;HTCAPTION;0
invoke SetCursor;hCursorMain
;********************************************************************
。else
invoke DefWindowProc;hWnd;uMsg;wParam;lParam
ret
。endif
;********************************************************************
xor eax;eax
ret
_ProcWinMain endp
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle;NULL
mov hInstance;eax
invoke LoadCursor;hInstance;IDC_MOVE
mov hCursorMove;eax
invoke LoadCursor;hInstance;IDC_MAIN
mov hCursorMain;eax
;********************************************************************
; 注册窗口类
;********************************************************************
invoke RtlZeroMemory;addr @stWndClass;sizeof @stWndClass
invoke LoadIcon;hInstance;ICO_MAIN
mov @stWndClass。hIcon;eax
mov @stWndClass。hIconSm;eax
push hCursorMain
pop @stWndClass。hCursor
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_W