WIN32汇编语言教程:第05章 使用资源 · 5.4 对话框(10)

              .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    1000h
DLG_MAIN       equ    1
IDC_LISTBOX1    equ    101
IDC_LISTBOX2    equ    102
IDC_SEL1       equ    103
IDC_RESET       equ    104
;####################################################################
; 数据段
;####################################################################
               .data?
hInstance       dd     ?
               .const
szText1        db    '项目1',0
szText2        db    '项目2',0
szText3        db    '项目3',0
szPath          db     '*.*',0
szMessage      db    '选择结果:%s',0
szTitle        db    '您的选择',0
szSelect       db    '您选择了以下的项目:'
szReturn       db     0dh,0ah,0
;####################################################################
; 代码段
;####################################################################
 
    .code
;####################################################################
_ProcDlgMain    proc       uses ebx edi esi hWnd,wMsg,wParam,lParam
              local  @szBuffer[128]:byte
              local  @szBuffer1[128]:byte
              local  @szTextBuff[2048]:byte
              local  @dwCount
 
               mov    eax,wMsg
               .if    eax == WM_CLOSE
                      invoke EndDialog,hWnd,NULL
               .elseif eax == WM_INITDIALOG
                      invoke LoadIcon,hInstance,ICO_MAIN
                       invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
;********************************************************************
; 初始化列表框
;********************************************************************
                      invoke SendDlgItemMessage,hWnd,\
                              IDC_LISTBOX1,LB_ADDSTRING,0,addr szText1
                      invoke SendDlgItemMessage,hWnd,\
                              IDC_LISTBOX1,LB_ADDSTRING,0,addr szText2
                       invoke SendDlgItemMessage,hWnd,\
                              IDC_LISTBOX1,LB_ADDSTRING,0,addr szText3
                      Invoke  SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_DIR,\
                              DDL_ARCHIVE or DDL_DRIVES or DDL_DIRECTORY,\
                              addr szPath
;********************************************************************
             .elseif eax == WM_COMMAND
              mov eax,wParam
;********************************************************************
;由于印刷宽度有限,WM_COMMAND消息处理代码的缩进格式有所影响,请读者注意
; 取多选的列表框项目
;********************************************************************
.if     ax ==  IDOK
       invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_GETSELCOUNT,0,0
       mov    @dwCount,eax
       invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,\
              LB_GETSELITEMS,128/4,addr @szBuffer
       invoke lstrcpy,addr @szTextBuff,addr szSelect
       lea    esi,@szBuffer
       .while @dwCount
              lodsd
               lea    ecx,@szBuffer1
              invoke SendDlgItemMessage,hWnd,\
                      IDC_LISTBOX2,LB_GETTEXT,eax,ecx
               invoke lstrcat,addr @szTextBuff,addr szReturn
               invoke lstrcat,addr @szTextBuff,addr @szBuffer1
               dec    @dwCount
      .endw
      invoke MessageBox,hWnd,addr @szTextBuff,addr szTitle,MB_OK
.elseif ax ==  IDC_RESET
      invoke SendDlgItemMessage,hWnd,IDC_LISTBOX2,LB_SETSEL,FALSE,-1
.elseif ax ==  IDC_LISTBOX1
       shr    eax,16
       .if    ax ==  LBN_SELCHANGE
;********************************************************************
; 将鼠标点击结果显示在文本框中
;********************************************************************
               invoke SendMessage,lParam,LB_GETCURSEL,0,0
             lea    ecx,@szBuffer
             invoke SendMessage,lParam,LB_GETTEXT,eax,ecx
               invoke SetDlgItemText,hWnd,IDC_SEL1,addr @szBuffer
;********************************************************************
; 双击项目则弹出对话框
;********************************************************************
       .elseif ax ==  LBN_DBLCLK
              invoke SendMessage,lParam,LB_GETCURSEL,0,0
             lea    ecx,@szBuffer
               invoke SendMessage,lParam,LB_GETTEXT,eax,ecx
               invoke  wsprintf,addr @szBuffer1,addr szMessage,addr @szBuffer
               invoke MessageBox,hWnd,addr @szBuffer1,addr szTitle,MB_OK
       .endif
;********************************************************************
.elseif ax ==  IDC_LISTBOX2
       shr    eax,16
       .if    ax ==  LBN_SELCHANGE
             invoke SendMessage,lParam,LB_GETSELCOUNT,0,0
               mov    ebx,eax
               invoke GetDlgItem,hWnd,IDOK
               invoke EnableWindow,eax,ebx
       .endif
.endif
;********************************************************************
;恢复代码缩进格式,请读者注意
;********************************************************************
              .else
                      mov    eax,FALSE
                     ret
              .endif0
              mov    eax,TRUE
               ret
 
_ProcDlgMain    endp
;####################################################################
start:
               invoke GetModuleHandle,NULL
               mov    hInstance,eax
               invoke DialogBoxParam,hInstance,\
                      DLG_MAIN,NULL,offset _ProcDlgMain,NULL
               invoke ExitProcess,NULL
;####################################################################
              end    start

上页:第05章 使用资源 · 5.4 对话框(9) 下页:第05章 使用资源 · 5.4 对话框(11)

第05章 使用资源

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号