首页
社区
课程
招聘
[求助]一个自定义标志的问题`!
发表于: 2008-8-15 14:57 4412

[求助]一个自定义标志的问题`!

2008-8-15 14:57
4412
别人说很简单`小弟第1次接触不是很理解~请高手们帮忙理解下~!
----------------------------------------------------------------------------------------------------------
        .386
        .model flat, stdcall
        option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    equ    1000
DLG_MAIN    equ    1000
IDC_COUNTER    equ    1001
IDC_PAUSE    equ    1002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data?
hInstance    dd    ?
hWinMain    dd    ?
hWinCount    dd    ?
hWinPause    dd    ?

dwOption    dd    ?
F_PAUSE        equ    0001h
F_STOP        equ    0002h
F_COUNTING    equ    0004h

        .const
szStop        db    '停止计数',0
szStart        db    '计数',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

        .code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_Counter    proc

        or    dwOption,F_COUNTING
        and    dwOption,not (F_STOP or F_PAUSE)
        invoke    SetWindowText,hWinCount,addr szStop
        invoke    EnableWindow,hWinPause,TRUE

        xor    ebx,ebx
        .while    ! (dwOption & F_STOP)
            .if    !(dwOption & F_PAUSE)
                inc    ebx
                invoke    SetDlgItemInt,hWinMain,IDC_COUNTER,ebx,FALSE
            .endif
        .endw

        invoke    SetWindowText,hWinCount,addr szStart
        invoke    EnableWindow,hWinPause,FALSE
        and    dwOption,not (F_COUNTING or F_STOP or F_PAUSE)
        ret

_Counter    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
        local    @dwThreadID

        mov    eax,wMsg
;********************************************************************
        .if    eax ==    WM_COMMAND
            mov    eax,wParam
            .if    ax ==    IDOK
                .if    dwOption & F_COUNTING
                    or    dwOption,F_STOP
                .else
                    call    _Counter
                .endif
            .elseif    ax ==    IDC_PAUSE
                xor    dwOption,F_PAUSE
            .endif
;********************************************************************
        .elseif    eax ==    WM_CLOSE
            invoke    EndDialog,hWnd,NULL
;********************************************************************
        .elseif    eax ==    WM_INITDIALOG
            push    hWnd
            pop    hWinMain
            invoke    GetDlgItem,hWnd,IDOK
            mov    hWinCount,eax
            invoke    GetDlgItem,hWnd,IDC_PAUSE
            mov    hWinPause,eax
;********************************************************************
        .else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret

_ProcDlgMain    endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    GetModuleHandle,NULL
        mov    hInstance,eax
        invoke    DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
----------------------------------------------------------------------------------------------------------
上面是全部代码~
   小弟把不懂的写出来`希望那位前辈帮助理解一下~!
dwOption    dd    ?
F_PAUSE        equ    0001h
F_STOP        equ    0002h
F_COUNTING    equ    0004h 自定义标志 0001 0002 0004
---------------------------------------------------------------
.if    eax ==    WM_COMMAND
mov    eax,wParam
.if    ax ==    IDOK
.if    dwOption & F_COUNTING
or    dwOption,F_STOP
.else
call    _Counter
.endif
.elseif    ax ==    IDC_PAUSE
xor    dwOption,F_PAUSE
.endif      这里是判断按下消息 然后判断通知码是不是按下开始按钮`是的话就执行下面2句
.if    dwOption & F_COUNTING
or    dwOption,F_STOP  我不理解这2句的意思`

.elseif    ax ==    IDC_PAUSE
xor    dwOption,F_PAUSE 这个判断是不是暂停按钮 然后下面的异或有什么用?
-------------------------------------------------------------------------------
然后就是_Counter子程序里的一些运算`  如何算我知道`但是为什么要这样算我不理解~请前辈们指教!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
2
1 xor 1 = 0
0 xor 1 = 1
点一下0变1,再点一下1变0
2008-8-15 15:16
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
...谢谢了
2008-8-15 17:54
0
游客
登录 | 注册 方可回帖
返回
//