八喜电子书 > 经管其他电子书 > windows环境下32位汇编语言程序设计 >

第38部分

windows环境下32位汇编语言程序设计-第38部分

小说: windows环境下32位汇编语言程序设计 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                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_WINDOW + 1

                mov     @stWndClass。lpszClassName;offset szClassName

                invoke  RegisterClassEx;addr @stWndClass

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

; 建立并显示窗口

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

                invoke  CreateWindowEx;NULL;

                        offset szClassName;offset szClassName;

                        WS_POPUP or WS_SYSMENU;

                        100;100;CLOCK_SIZE;CLOCK_SIZE;

                        NULL;NULL;hInstance;NULL

                Mov     hWinMain;eax

                invoke  ShowWindow;hWinMain;SW_SHOWNORMAL

                invoke  UpdateWindow;hWinMain

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

; 消息循环

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

                。while  TRUE

                        invoke  GetMessage;addr @stMsg;NULL;0;0

                        。break  。if eax  0

                        invoke  TranslateMessage;addr @stMsg

                        invoke  DispatchMessage;addr @stMsg

                。endw

                ret

 

_WinMain        endp

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

start:

                call        _WinMain

                invoke  ExitProcess;NULL

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

                end     start

首先简单分析一下程序的结构,主程序中先用RegisterClassEx注册窗口类,再用CreateWindowEx建立窗口的过程,这是标准的创建窗口的代码,惟一的特殊之处是建立窗口使用的窗口风格是WS_POPUP或WS_SYSMENU,这样建立的窗口没有标题栏,以便以后实现圆形的窗口。

程序中的坐标算法和7。2节的Clock。asm是一样的,所以有些子程序沿用了上一个程序中的相关子程序,如计算坐标的_CalcX和_CalcY,绘画指针的_DrawLine子程序等。

在窗口过程的WM_CREATE消息中,程序用CreatePopupMenu创建了一个Popup菜单,用来在按下右键的时候弹出该菜单,并多次调�

返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)

你可能喜欢的