⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 generic2.asm

📁 可靠的UDP实现库,基于x86汇编实现,window xp/2000 mmx/sse指令集下验证通过
💻 ASM
字号:
;程序清单: generic2.asm(对话框及窗口控件)
.386
.model flat, stdcall
option casemap :none   ; case sensitive
include     windows.inc
include     user32.inc
include     kernel32.inc
includelib  user32.lib
includelib  kernel32.lib
ICO_MAIN    equ 1000
DLG_MAIN    equ 2000
IDC_USER    equ 2001
IDC_LOGIN   equ 2002
IDC_LOGOUT  equ 2003
IDC_INFO    equ 2004
IDC_TEXT    equ 2005
.data
hInstance       dword   ?
hWinMain        dword   ?
bLogin          dword   0
szUserName      byte    12 dup (?)
szText          byte    256 dup (?)
szMyTitle       byte    20 dup (?)
szOtherTitle    byte    20 dup (?)
szFmt           byte    '[%s]: %s',0
szChat1         byte    'Chat 1',0
szChat2         byte    'Chat 2',0
hwndOther       dword   ?
.code
_ProcDlgMain    proc    uses ebx edi esi hWnd,wMsg,wParam,lParam
local   @szBuffer[512]:byte
        mov     eax,wMsg
        .if eax ==  WM_INITDIALOG
            push    hWnd
            pop     hWinMain
            invoke  FindWindow,NULL,addr szChat1
            ; 是否已经存在标题为"Chat 1"的窗口?
            .if  eax == NULL
                ; 如果不存在,设定本对话框的标题为"Chat 1"
                invoke  lstrcpy,addr szMyTitle,addr szChat1
                invoke  lstrcpy,addr szOtherTitle,addr szChat2
            .else
                ; 如果已存在,设定本对话框的标题为"Chat 2"
                invoke  lstrcpy,addr szMyTitle,addr szChat2
                invoke  lstrcpy,addr szOtherTitle,addr szChat1
            .endif
            invoke  SetWindowText,hWinMain,addr szMyTitle
            ; 设定本对话框的图标
            invoke  LoadIcon,hInstance,ICO_MAIN
            invoke  SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
            ; 用户名编辑框允许最多输入11个字符
            invoke  SendDlgItemMessage,hWinMain,IDC_USER,
                                       EM_SETLIMITTEXT,11,0
            ; 发送文本编辑框允许最多输入250个字符
            invoke  SendDlgItemMessage,hWinMain,IDC_TEXT,
                                       EM_SETLIMITTEXT,250,0
        .elseif eax ==  WM_COMMAND
            mov     eax,wParam
            ; 输入用户名后,允许"Login"按钮
            .if ax == IDC_USER
                invoke  GetDlgItemText,hWinMain,IDC_USER,
                                       addr szUserName,sizeof szUserName
                invoke  GetDlgItem,hWinMain,IDC_LOGIN
                .if szUserName && (bLogin == 0)
                    invoke  EnableWindow,eax,TRUE
                .else
                    invoke  EnableWindow,eax,FALSE
                .endif
            ; 输入聊天语句后,允许"Send"按钮
            .elseif ax ==   IDC_TEXT
                invoke  GetDlgItemText,hWinMain,IDC_TEXT,
                                       addr szText,sizeof szText
                invoke  GetDlgItem,hWinMain,IDOK
                .if szText
                    invoke  EnableWindow,eax,TRUE
                .else
                    invoke  EnableWindow,eax,FALSE
                .endif
            .elseif ax ==   IDC_LOGIN
                mov     bLogin, 1
                ; Login后,禁止Login按钮, 允许Logout按钮、发送文本编辑框
                invoke  GetDlgItem,hWinMain,IDC_LOGIN
                invoke  EnableWindow,eax,FALSE
                invoke  GetDlgItem,hWinMain,IDC_LOGOUT
                invoke  EnableWindow,eax,TRUE
                invoke  GetDlgItem,hWinMain,IDC_TEXT
                invoke  EnableWindow,eax,TRUE
            .elseif ax ==   IDC_LOGOUT
                mov     bLogin, 0
                ; 允许Login按钮, 禁止Logout按钮、发送文本编辑框、发送按钮
                invoke  GetDlgItem,hWinMain,IDC_LOGIN
                invoke  EnableWindow,eax,TRUE
                invoke  GetDlgItem,hWinMain,IDC_LOGOUT
                invoke  EnableWindow,eax,FALSE
                invoke  GetDlgItem,hWinMain,IDC_TEXT
                invoke  EnableWindow,eax,FALSE
                invoke  GetDlgItem,hWinMain,IDOK
                invoke  EnableWindow,eax,FALSE
            .elseif ax ==   IDOK
                ; 构造一个字符串,包括用户名和待发送的文本
                invoke  wsprintfA,addr @szBuffer,addr szFmt,
                                  addr szUserName,addr szText
                ; 将字符串添加到列表框的第1行
                invoke  SendDlgItemMessage,hWinMain,IDC_INFO,
                                           LB_INSERTSTRING,0,addr @szBuffer
                ; 查找到另一个对话框窗口
                invoke  FindWindow,NULL,addr szOtherTitle
                mov     hwndOther,eax
                ; 将字符串添加到另一个对话框的列表框的第1行
                invoke  SendDlgItemMessage,hwndOther,IDC_INFO,
                                           LB_INSERTSTRING,0,addr @szBuffer
                ; 清除发送文本编辑框中的内容
                invoke  SetDlgItemText,hWinMain,IDC_TEXT,NULL
                ; 将输入焦点设置到发送文本编辑框上
                invoke  GetDlgItem,hWinMain,IDC_TEXT
                invoke  SetFocus,eax
            .else
                mov     eax,FALSE
                ret
            .endif
        .elseif eax ==  WM_CLOSE
            invoke  EndDialog,hWinMain,NULL
        .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,0
        invoke  ExitProcess,NULL
end     _start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -