xing59741 发表于 2012-7-17 18:31:23

【学习笔记】图标光标载入

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include   windows.inc
include   gdi32.inc
includelibgdi32.lib
include   user32.inc
includelibuser32.lib
include   kernel32.inc
includelibkernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ等值
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_BIG   equ   1000h
ICO_SMALLequ   1001h
CUR_2   equ   1000h
IDM_MAINequ   2000h
IDM_EXITequ   2101h
IDM_BIG   equ   2201h
IDM_SMALLequ   2202h
IDM_CUR1equ   2203h
IDM_CUR2equ   2204h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .data?
hInstancedd    ?
hWinMaindd    ?
hMenu   dd    ?
hIconB   dd    ?
hIconM   dd    ?
hCur1   dd    ?
hCur2   dd    ?
   .const
szClassNamedb    'Icon and Cursor Example',0      ;窗口类名称
szCursorFile db    '1.ani',0
szCaptionMain db    '图标和光标切换',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
   .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Quit    proc
         invokeDestroyWindow,hWinMain   ;摧毁窗口
         invokePostQuitMessage,NULL   ;退出消息循环
   ret
_Quit endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMainproc   uses ebx edi esi hWnd,uMsg,wParam,lParam   ;窗口过程开始
   mov   eax,uMsg
;********************************************************************
   ;.if   eax==WM_CREATE
         ;移动获取句柄函数到主函数成功
;         invokeLoadIcon,hInstance,ICO_BIG
;         mov   hIconB,eax
;         invokeLoadIcon,hInstance,ICO_SMALL
;         mov   hIconM,eax
;         invokeLoadCursorFromFile,addr szCursorFile
;         mov   hCur1,eax
;         invokeLoadCursor,hInstance,CUR_2
;         mov   hCur2,eax
;********************************************************************
         ;成功移植至建立窗口后的代码
         ;invokeSendMessage,hWnd,WM_COMMAND,IDM_BIG,NULL
         ;invokeSendMessage,hWnd,WM_COMMAND,IDM_CUR1,NULL
;********************************************************************
   .ifeax==WM_COMMAND
         mov   eax,wParam
         movzxeax,ax
         .if   eax ==IDM_EXIT
            call_Quit
         .elseifeax ==IDM_BIG
            invokeSetClassLong,hWnd,GCL_HICON,hIconB   ;有效函数
            ;invokeSendMessage,hWnd,WM_SETICON,ICON_BIG,hIconB
               ;ICON_BIG是在程序切换的图标,ICON_SMALL是菜单栏的图标
            invokeCheckMenuRadioItem,hMenu,IDM_BIG,IDM_SMALL,IDM_BIG,MF_BYCOMMAND
               ;函数简介:撤销一组菜单的状态并指定一个菜单为选定状态
         .elseifeax ==IDM_SMALL
            invokeSetClassLong,hWnd,GCL_HICON,hIconM   ;有效函数
            ;invokeSendMessage,hWnd,WM_SETICON,ICON_BIG,hIconM
            invokeCheckMenuRadioItem,hMenu,IDM_BIG,IDM_SMALL,IDM_SMALL,MF_BYCOMMAND
         .elseifeax ==IDM_CUR1
            invokeSetClassLong,hWnd,GCL_HCURSOR,hCur1
               ;替换CLASS结构体成员HCURSOR是光标
            ;invokeSendMessage,hWnd,WM_SETICON,hIconB,hIconB   无效函数
            invokeCheckMenuRadioItem,hMenu,IDM_CUR1,IDM_CUR2,IDM_CUR1,MF_BYCOMMAND
         .elseifeax ==IDM_CUR2
            invokeSetClassLong,hWnd,GCL_HCURSOR,hCur2
            ;invokeSendMessage,hWnd,WM_SETCURSOR,hIconM,hIconM    无效函数
            invokeCheckMenuRadioItem,hMenu,IDM_CUR1,IDM_CUR2,IDM_CUR2,MF_BYCOMMAND
         .endif
;********************************************************************
   .elseifeax   ==WM_CLOSE      ;处理关闭消息
      call   _Quit
;********************************************************************
   .else
         invoke DefWindowProc,hWnd,uMsg,wParam,lParam;将剩下的消息交给WINDOWS处理
         ret             ;直接返回
   .endif
;********************************************************************
xor   eax,eax                ;将EAX寄存器致零。
ret                  ;直接返回
_ProcWinMain endp               ;窗口过程结束
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain   proc                ;主模块执行
local   @stWndClass:WNDCLASSEX         ;申请注册窗口类的结构体@stWndClass
local   @stMsg:MSG            ;申请消息结构体@stMsg
invokeGetModuleHandle,NULL            ;获取本程序句柄
mov   hInstance,eax            ;保存句柄到hInstance变量
invokeLoadMenu,hInstance,IDM_MAIN
mov   hMenu,eax
invokeLoadIcon,hInstance,ICO_BIG
mov   hIconB,eax
invokeLoadIcon,hInstance,ICO_SMALL
mov   hIconM,eax
invokeLoadCursorFromFile,addr szCursorFile
mov   hCur1,eax
invokeLoadCursor,hInstance,CUR_2
mov   hCur2,eax
;********************************************************************
; 注册窗口类
;********************************************************************
invokeRtlZeroMemory,addr @stWndClass,sizeof @stWndClass   ;将结构体@stWndClass全部清0
pushhInstance               ;将程序的实例句柄压栈
pop   @stWndClass.hInstance            ;将程序的实例句柄出栈存储到结构体中
mov   @stWndClass.cbSize,sizeof WNDCLASSEX
mov   @stWndClass.style,CS_HREDRAW or CS_VREDRAW       ;类的风格 CS_HREDRAW当窗口水平方向的宽度变化时重绘整个窗口
                      ;   CS_VREDRAW 当窗口垂直方向的宽度变化时重绘整个窗口
mov   @stWndClass.lpfnWndProc,offset _ProcWinMain       ;窗口回调过程的地址存储到结构体中
mov   @stWndClass.hbrBackground,COLOR_WINDOW + 1       ;画刷:颜色是白色..后面规定要+1
mov   @stWndClass.lpszClassName,offset szClassName      ;给定类名称
invokeRegisterClassEx,addr @stWndClass         ;注册窗口类
;********************************************************************
; 建立并显示窗口
;********************************************************************
invokeCreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\    ;建立窗口窗口风格扩展client客户 + edge边缘,后面的是类名称
      offset szCaptionMain,\         ;窗口标题
      WS_OVERLAPPEDWINDOW,\         ;复合窗口风格
      200,200,500,400,\
      NULL,hMenu,hInstance,NULL
mov   hWinMain,eax            ;将返回句柄存储到hWinMain
invokeSendMessage,hWinMain,WM_COMMAND,IDM_BIG,NULL
invokeSendMessage,hWinMain,WM_COMMAND,IDM_CUR1,NULL
invokeShowWindow,hWinMain,SW_SHOWNORMAL          ;显示窗口SW_SHOWNORMAL普通状态显示
invokeUpdateWindow,hWinMain            ;更新窗口
;********************************************************************
; 消息循环
;********************************************************************
   .whileTRUE             ;TRUE==1
      invoke GetMessage,addr @stMsg,NULL,0,0       ;取得本程序所有的消息放入@stMsg
      .break .if eax == 0         ;如果EAX返回0(收到退出函数就等于0)则立即中断并退出消息循环
      invoke TranslateMessage,addr @stMsg       ;转译@stMsg里面的消息到窗口过程
      invoke DispatchMessage,addr @stMsg      ;派发@stMsg里面的消息到窗口过程
   .endw
ret
_WinMain   endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
   call _WinMain             ;调用子程序_WinMain
   invoke ExitProcess,NULL         ;退出程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end    start               ;程序从start开始执行


===============================================================

RC文件

#include       <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define   ICO_BIG    0x1000
#define   ICO_SMALL   0x1001
#define   CUR_2    0x1000
#define   IDM_MAIN   0x2000
#define   IDM_EXIT   0x2101
#define   IDM_BIG    0x2201
#define   IDM_SMALL   0x2202
#define   IDM_CUR1   0x2203
#define   IDM_CUR2   0x2204
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_SMALLICON    "Small.ico"
ICO_BIG   ICON    "Big.ico"
CUR_2   cursor    "2.cur"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN   menu   discardable
BEGIN
   popup   "文件(&F)"
   BEGIN
         menuitem   "退出(&X)",IDM_EXIT
   END
   popup   "图标和光标(&I)"
   BEGIN
         menuitem   "大图标(&G)", IDM_BIG
         menuitem   "小图标(&M)", IDM_SMALL
         menuitem   separator
         menuitem   "光标A(&A)", IDM_CUR1
         menuitem   "光标B(&b)", IDM_CUR2
   END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

丿夏夜灬彬刂 发表于 2012-7-17 18:47:01

支持下LZ {:5_107:}
页: [1]
查看完整版本: 【学习笔记】图标光标载入