【原创】玩笑程序1,看看你是否能点中"否"按钮

来源:互联网 发布:阿里巴巴农村淘宝骗局 编辑:程序博客网 时间:2024/05/21 19:27
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Name    : Dialog2.asm

;Function: 玩话程序,看看你是否能点中"否"按钮
;Author  : Purple Endurer
;Version : 0.1 
;--------------------------------------------------------------------------
;Date        Summary
;2005-07-02    Created 
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386
.model flat,stdcall
option casemap:none 

include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
include /masm32/include/shell32.inc 

includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
includelib /masm32/lib/shell32.lib 

DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Static  PROTO  :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD 
btn_NewWndProc    PROTO :DWORD, :DWORD, :DWORD, :DWORD


m2m MACRO d1, d2
    push d2
    pop d1
ENDM


.const
IDC_btnYES     equ 3000
IDC_btnNO      equ 3001
IDC_btnAbout   equ 3002 

.data
szDlgName db "MyDialog",0
szAppName db "程序设计语言用户调查",0 

szYes db "是", 0
szNo  db "否", 0
szAgree db "您的回答真令我高兴,因为"
szAboutMsg db 13, 10, "☆ 我就是由【Purple Endurer】用纯32位汇编语言编写的!☆", 0
szAboutTitle db "汇编语言用户调查程序 1.0", 0
szStaticTxtName db "STATIC", 0
szWarning db "你必须接受调查!", 0 

g_dwReplied         dword 0

.data?
hInstance   HINSTANCE ?
g_hWnd      HWND ?
g_hbtnYes   HWND ?
g_hbtnNo    HWND ?
btnNo_OldWndProc    dd  ?
btnYes_OldWndProc   dd  ?

g_dwCurrentYesBtn   dd  ?
g_dwCurrentNoBtn    dd  ?


.code

start:
      invoke GetModuleHandle, NULL
      mov    hInstance,eax
      invoke DialogBoxParam, hInstance, ADDR szDlgName, NULL, addr DlgProc, NULL
      Invoke ExitProcess,eax 

;==================================================================
DlgProc proc hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM
;------------------------------------------------------------------      
    .IF uMsg == WM_INITDIALOG
        push hWnd
        pop  g_hWnd

    ;Get the handle of btnNo
        invoke GetDlgItem, hWnd, IDC_btnNO
        mov g_hbtnNo, eax
        mov g_dwCurrentNoBtn, eax

    ;----------------------------------------- 
        ; Subclass btnNo! 
        ;----------------------------------------- 
        invoke SetWindowLong,eax,GWL_WNDPROC, addr btn_NewWndProc
        mov btnNo_OldWndProc, eax

        ;Get the handle of btnYes
        invoke GetDlgItem, hWnd, IDC_btnYES
        mov g_hbtnYes, eax
        mov g_dwCurrentYesBtn, eax
        invoke SetFocus, eax

        ;----------------------------------------- 
        ; Subclass btnYes! 
        ;----------------------------------------- 
        invoke SetWindowLong,g_hbtnYes, GWL_WNDPROC, addr btn_NewWndProc
        mov btnYes_OldWndProc, eax
         
    .ELSEIF uMsg == WM_CLOSE
        .if g_dwReplied==0
            invoke MessageBox, hWnd, ADDR szWarning, ADDR szAppName,
                         MB_OK + MB_ICONWARNING
        .else
            invoke EndDialog, hWnd, NULL
        .endif
    .ELSEIF uMsg == WM_COMMAND
        .if lParam
            ;pushad
            mov edx,wParam
            mov eax,edx
            shr edx,16
            .IF dx == BN_CLICKED
                .if ax == IDC_btnAbout
                    invoke ShellAbout, hWnd, ADDR szAboutTitle, ADDR szAboutMsg, 0
                .else
                    .IF g_dwReplied==0
                        invoke Static, ADDR szAgree, hWnd, 15, 90, 230, 85, 3
                        mov g_dwReplied, 1
                    .ENDIF
                .endif
            .ENDIF
            ;popad
        .endif                        
    .ELSE
        mov eaxFALSE
        ret
    .ENDIF

    mov eax,TRUE
    ret
DlgProc endp 


;======================================================================
Static proc lpText: DWORD, hParent: DWORD, dwLeft: DWORD, dwTop: DWORD,
            dwWidth: DWORD, dwHeight :DWORD,ID:DWORD
;======================================================================
    invoke CreateWindowEx, WS_EX_STATICEDGE or WS_EX_WINDOWEDGE,
           ADDR szStaticTxtName, lpText,
           WS_CHILD or WS_VISIBLE or SS_LEFT,
           dwLeft, dwTop, dwWidth, dwHeight, hParent, ID,
           hInstance,NULL
    ret 
Static endp 


;===========================================================================
btn_NewWndProc PROC hBtn: DWORD, uMsg: DWORD, wParam: DWORD, lParam: DWORD 
;===========================================================================
    m2m eax, hBtn
    .IF g_dwCurrentYesBtn != eax
        .if uMsg==WM_MOUSEMOVE  
            m2m g_dwCurrentNoBtn, g_dwCurrentYesBtn
            m2m g_dwCurrentYesBtn, hBtn

            ;--------------------------
            ;Must use SendMessage
            ;--------------------------
            invoke SendMessage, g_dwCurrentYesBtn, WM_SETTEXT, NULL, ADDR szYes
            invoke SendMessage, g_dwCurrentNoBtn, WM_SETTEXT, NULL, ADDR szNo
        .elseif uMsg==WM_SETFOCUS
            invoke PostMessage, g_dwCurrentYesBtn,WM_SETFOCUS, hBtn, NULL
        .elseif uMsg==WM_KEYDOWN
            invoke PostMessage, g_dwCurrentYesBtn, WM_KEYDOWN, wParam, lParam
        .else
            jmp @F
        .endif 
        xor eax,eax 
        ret
    .ENDIF

@@:
    mov eax,g_hbtnNo
    .IF g_dwCurrentYesBtn == eax
        mov eax, btnNo_OldWndProc
    .ELSE
        mov eax, btnYes_OldWndProc
    .ENDIF
    invoke CallWindowProc, eax, hBtn, uMsg, wParam, lParam 
    ret

btn_NewWndProc endp 

end start



;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;rsrc.rc
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#include "/masm32/include/resource.h" 

#define IDC_btnYES                                   3000
#define IDC_btnNO                                    3001
#define IDC_btnAbout                                 3002
#define IDC_Question                                 3003 

MyDialog DIALOG 10, 10, 215, 70 

STYLE 0x0001 | DS_CENTER | WS_CAPTION  | DS_SYSMODAL |
WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
| WS_POPUP | WS_SYSMENU | WS_EX_TOOLWINDOW  

CAPTION "程序设计语言用户调查"
/*CLASS "DLGCLASS"*/ 

{
    DEFPUSHBUTTON   "是", IDC_btnYES, 131, 10, 52, 13
    PUSHBUTTON      "否", IDC_btnNO,  131, 30, 52, 13
    PUSHBUTTON      "[&A]关于…", IDC_btnAbout, 131, 50, 52, 13
    LTEXT           "问题:/r/r你喜欢用汇编语言写程序吗?",IDC_Question,10, 10, 110, 55
}
原创粉丝点击