📄 list.inc
字号:
;procs to be declared publicly
DisplayDetail proto :dword
SeListtPosition proto :dword
SingleQuote2Two proto lpString:dword
.data
Kingsoft_Phonetic_Plain_12 LOGFONT <-16,0,0,0,400,0,0,0,2,3,2,1,2,"Kingsoft Phonetic Plain">
Verdana_10 LOGFONT <-13,0,0,0,400,0,0,0,0,3,2,1,34,"Verdana">
.data?
OldWndProc dd ?
hComboTableName dd ?
.code
MyMainWindowHide proc hWin:dword
invoke ShowWindow,hWin,SW_HIDE
ret
MyMainWindowHide endp
MyMainWindowShow proc hWin:dword
invoke ShowWindow,hWin,SW_SHOW
ret
MyMainWindowShow endp
InitControlAttributs proc hWin:dword
;作用: 设置所有控件的属性
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lfont
invoke CreateFontIndirect,addr Verdana_10
mov lfont,eax
;设置输入框的字数限制 256;字体
invoke GetDlgItem,hWin,IDC_EDT_INPUT
mov hEditInput,eax
invoke SendMessage,hEditInput,EM_LIMITTEXT,60,0
invoke SendMessage,hEditInput,WM_SETFONT,lfont,TRUE
;子类化;
invoke SetWindowLong,hEditInput,GWL_WNDPROC,addr EditWndProc
mov OldWndProc,eax
;设置lhPhone的字体属性
invoke GetDlgItem,hWin,IDC_EDT_PHONE
mov hEdtPhone,eax
invoke CreateFontIndirect,addr Kingsoft_Phonetic_Plain_12
invoke SendMessage,hEdtPhone,WM_SETFONT,eax,TRUE
;设置listbox的字体属性
invoke GetDlgItem,hWin,IDC_LST1
mov hList,eax
invoke SendMessage,hList,WM_SETFONT,lfont,TRUE
;设置combo的字体属性
invoke GetDlgItem,hWin,IDC_CBO
mov hCombo,eax
mov hComboTableName,eax
invoke SendMessage,hCombo,WM_SETFONT,lfont,TRUE
;设置editcontrol的字体属性
invoke GetDlgItem,hWin,IDC_EDT_WORD
mov hWord,eax
invoke SendMessage,hWord,WM_SETFONT,lfont,TRUE
invoke GetDlgItem,hWin,IDC_EDT_EXPL
mov hExpl,eax
invoke SendMessage,hExpl,WM_SETFONT,lfont,TRUE
ret
InitControlAttributs endp
;################################################
InitTableNameCombo proc uses esi hWin:dword
;作用:
;参数: 形同虚设
;返回值:
;
;开发日期
;备注:
LOCAL lhCombo
;invoke GetDlgItem,hWin,IDC_CBO
m2m lhCombo,hComboTableName
invoke ODBCGetTables
mov esi,eax
push esi
assume esi:ptr SQLTABLE
.while 1
invoke CompareString,0,NORM_IGNORECASE,addr [esi].szName,4,SADD("Msys"),4
.if eax==2
jmp @f
.endif
invoke SendMessage,lhCombo,CB_ADDSTRING,0,addr [esi].szName
@@:
add esi,sizeof SQLTABLE
movzx eax,byte ptr [esi]
.if !eax
.break
.endif
.endw
assume esi:nothing
pop esi
invoke GlobalUnlock,esi
invoke GlobalFree,esi
invoke SendMessage,lhCombo,CB_FINDSTRINGEXACT,-1,SADD("encyclopedia")
invoke SendMessage,lhCombo,CB_SETCURSEL,eax,0
ret
InitTableNameCombo endp
;################################################
SetListBox proc hWin:dword
;作用:
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbuf[256]:byte
LOCAL lbufSQL[1024]:byte
invoke GetDlgItemText,hWin,IDC_CBO,addr lbuf,256
invoke wsprintf,addr lbufSQL,SADD("select 单词 from %s"),addr lbuf
invoke ODBCExeDirect,addr lbufSQL
invoke MyMainWindowHide,hList
invoke FillData
invoke MyMainWindowShow,hList
ret
SetListBox endp
;################################################
.data
;用来记录搜索栏中是否遇到通配符;没有则为0,否则记录通配符个数
;仅有以下两个函数用到此变量:CharFilter改变之;DoSearch使用之
isSpecialChar dd 0
.code
CharFilter proc uses edi esi lpString:dword
;作用: 过滤字符串中出现的通配字符?*为SQL格式_%
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbuf[256]:byte
lea edi,lbuf
xor ecx,ecx
mov isSpecialChar,ecx
mov esi,lpString
.while 1
movzx eax,byte ptr [esi+ecx]
.if !eax
.break
.elseif eax=='*'
mov byte ptr [edi+ecx],'%'
inc isSpecialChar
.elseif eax=='?'
mov byte ptr [edi+ecx],'_'
inc isSpecialChar
.else
mov [edi+ecx],al
.endif
inc ecx
.endw
mov eax,edi
ret
CharFilter endp
;################################################
NorMalDisPlay proc hWin:dword
;作用:地址栏中没有通配符时,在listbox中搜索与地址栏所输入单词最相近的单词,定位,显示
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbufTableName[256]:byte
LOCAL lbufWord[256]:byte
LOCAL index:dword
;invoke GetDlgItemText,hWin,IDC_EDT_INPUT,addr lbufWord,256
invoke GetWindowText,hEditInput,addr lbufWord,256
.if !eax
MyDebug "get windowtext error in normaldisplay "
ret
.endif
invoke SendMessage,hList,LB_FINDSTRING,-1,addr lbufWord
mov index,eax
.if eax==LB_ERR
MyText "没有找到所需的单词!!!"
.else
;得到index,将其置顶
invoke SendMessage,hList,LB_SETTOPINDEX,eax,0
;显示
invoke SendMessage,hList,LB_SETCURSEL,index,0
invoke DisplayDetail,hWin
.endif
ret
NorMalDisPlay endp
;################################################
DoSearch proc hWin:dword
;作用:
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbuf[256]:byte
LOCAL lbufSQL[1024]:byte
LOCAL lbufTableName[256]:byte
;取得所输入的字符串
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;invoke GetDlgItemText,hWin,IDC_EDT_INPUT,addr lbuf,256
invoke GetWindowText,hEditInput,addr lbuf,256
.if !eax
mov eax,isSpecialChar
.if eax;若有通配符,重新填充
invoke SetListBox,hWin
.else
invoke SendMessage,hList,LB_SETTOPINDEX,0,0
;显示
invoke SendMessage,hList,LB_SETCURSEL,0,0
invoke DisplayDetail,hWin
ret
.endif
ret
.endif
;转换
invoke CharFilter,addr lbuf
invoke lstrcpy,addr lbuf,eax
invoke GetDlgItemText,hWin,IDC_CBO,addr lbufTableName,256
mov eax,isSpecialChar
.if !eax;若没有通配符,一般显示
invoke NorMalDisPlay,hWin
.else
;制作SQL语句并执行
invoke wsprintf,addr lbufSQL,SADD("select * from %s where 单词 like ",27H,"%s",027h),\
addr lbufTableName,addr lbuf
invoke MyMainWindowHide,hList
invoke SendMessage,hList, LB_RESETCONTENT,0,0
invoke ODBCExeDirect,addr lbufSQL
invoke FillData
invoke MyMainWindowShow,hList
.endif
ret
DoSearch endp
;################################################
DisplayDetail proc hWin:dword
;作用: 当listbox中有item被选中时,在相应的控件显示相应的内容
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbufWord[256]:byte
LOCAL lIndex
LOCAL lbufSQL[1024]:byte
LOCAL lbufTableName[256]:byte
LOCAL item:Item
LOCAL lbufAddr:dword
;得到index
invoke SendMessage,hList,LB_GETCURSEL,0,0
mov lIndex,eax
;得到单词
invoke SendMessage,hList,LB_GETTEXT,lIndex,addr lbufWord
;invoke MessageBox,NULL,addr lbufWord,addr AppName,MB_OK
invoke SingleQuote2Two,addr lbufWord
;sql语句
invoke GetDlgItemText,hWin,IDC_CBO,addr lbufTableName,256
invoke wsprintf,addr lbufSQL,SADD("select * from %s where 单词 = '%s'"),\
addr lbufTableName,addr lbufWord
invoke ODBCExeDirect,addr lbufSQL
;绑定结果区
mov [item.m_no],byte ptr 0
mov [item.m_word],byte ptr 0
mov [item.m_phon],byte ptr 0
mov [item.m_expl],byte ptr 0
mov [item.m_phrase],byte ptr 0
mov [item.m_eg],byte ptr 0
mov [item.m_legd],byte ptr 0
invoke SQLBindCol, hStmt,1,SQL_C_CHAR, addr item.m_word, sizeof item.m_word,addr lbufAddr
invoke SQLBindCol, hStmt,2,SQL_C_CHAR, addr item.m_phon, sizeof item.m_phon,addr lbufAddr
invoke SQLBindCol, hStmt,3,SQL_C_CHAR, addr item.m_expl, sizeof item.m_expl,addr lbufAddr
invoke SQLBindCol, hStmt,4,SQL_C_CHAR, addr item.m_phrase, sizeof item.m_phrase,addr lbufAddr
invoke SQLBindCol, hStmt,5,SQL_C_CHAR, addr item.m_eg , sizeof item.m_eg ,addr lbufAddr
invoke SQLBindCol, hStmt,6,SQL_C_CHAR, addr item.m_legd , sizeof item.m_legd ,addr lbufAddr
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
invoke SQLFetch, hStmt
.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO
;查找成功:
;单词,音标,解释,词组,例句,联想
;invoke SetDlgItemText,hWin,IDC_EDT_INPUT,addr buffer_row_1
invoke SetWindowText,hWord,addr item.m_word
;invoke SetWindowText,h
;音标
invoke SetWindowText,hEdtPhone,addr item.m_phon
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,64*1024
invoke GlobalLock,eax
mov edi,eax
mov [edi],byte ptr 0
invoke lstrlen, addr item.m_expl
.if eax>1
invoke lstrcat,edi,SADD("解释:",13,10)
invoke lstrcat,edi,addr item.m_expl
invoke lstrcat,edi,SADD(13,10)
.endif
invoke lstrlen, addr item.m_phrase
.if eax>1
invoke lstrcat,edi,SADD("词组:",13,10)
invoke lstrcat,edi,addr item.m_phrase
invoke lstrcat,edi,SADD(13,10)
.endif
invoke lstrlen, addr item.m_eg
.if eax>1
invoke lstrcat,edi,SADD("例句:",13,10)
invoke lstrcat,edi,addr item.m_eg
invoke lstrcat,edi,SADD(13,10)
.endif
invoke lstrlen, addr item.m_legd
.if eax>1
invoke lstrcat,edi,SADD("联想:",13,10)
invoke lstrcat,edi,addr item.m_legd
invoke lstrcat,edi,SADD(13,10)
.endif
invoke SetDlgItemText,hWin,IDC_EDT_EXPL,edi
invoke GlobalUnlock,edi
invoke GlobalFree,edi
.else
PrintText "fetch error"
.endif
.else
MyDebug "Odbc Exe direct Error"
.endif
ret
DisplayDetail endp
;################################################
MyResize proc hWin:dword
;作用:
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL rct: RECT
LOCAL x:DWORD
LOCAL y:DWORD
LOCAL x1:DWORD
LOCAL y1:DWORD
LOCAL x2:DWORD
LOCAL y2:DWORD
; LOCAL c_b:dword ;border
; LOCAL c_s:dword ;space
; LOCAL c_h:dword ;commen height
; LOCAL c_w:dword ;commen weight
c_b equ 5
c_s equ 5
c_h equ 24
c_w equ 80
LOCAL t_h:dword ;special height
LOCAL t_w:dword ;special weight
LOCAL hd:dword,flag
invoke GetClientRect,hWin,addr rct
invoke StaTusBarResize,hWin
;X1,Y1:左上角
mov eax,rct.left
mov x1,eax
mov eax,rct.top
mov y1,eax
;X2,Y2:右下角
mov eax,rct.right
mov x2,eax
mov eax,rct.bottom
mov y2,eax
;set x for static
invoke GetDlgItem,hWin,IDC_STC1
MOV hd,eax
mov eax,x1
add eax,c_b
mov x,eax
;set y for hd1
mov eax,y1
add eax,c_b
mov y,eax
invoke MoveWindow,hd,x,y,30,c_h,TRUE
;input Box
mov eax,x
add x,c_b+30
mov eax,x2
sub eax,271
mov t_w,eax
invoke MoveWindow,hEditInput,x,y,t_w,c_h,TRUE
mov eax,x2
sub eax,c_b+40
mov x,eax
mov eax,y1
add eax,c_b+c_b
mov y,eax
invoke MoveWindow,hBtnMain,x,y,40,40,TRUE
mov eax,x
sub eax,c_b+40
mov x,eax
invoke MoveWindow,hBtnDel,x,y,40,40,TRUE
mov eax,x
sub eax,c_b+40
mov x,eax
invoke MoveWindow,hBtnEdit,x,y,40,40,TRUE
mov eax,x
sub eax,c_b+40
mov x,eax
invoke MoveWindow,hBtnAdd,x,y,40,40,TRUE
mov eax,x
sub eax,c_b+40
mov x,eax
push eax
invoke MoveWindow,hBtnSearch,x,y,40,40,TRUE
;Combo
mov eax,y1
add eax,c_b+c_b+c_h
mov y,eax
mov eax,x1
add eax,c_b
mov x,eax
invoke MoveWindow,hCombo,eax,y,142,496,TRUE
;Word
mov eax,x
add eax,c_b +142
mov x,eax
pop eax
sub eax,x
sub eax,c_b+c_b
shr eax,1
mov t_w,eax
invoke MoveWindow,hWord,x,y,t_w,c_h,TRUE
mov eax,x
add eax,t_w
add eax,c_b
mov x,eax
invoke MoveWindow,hEdtPhone,x,y,t_w,c_h,TRUE
;listbox
mov eax,y
add eax,c_b+c_h
mov y,eax
mov eax,x1
add eax,c_b
mov x,eax
mov eax,y2
sub eax,c_h
sub eax,y
invoke MoveWindow,hList,x,y,142,eax,TRUE
;Expl
;set t_w for hd1
mov eax,x
add eax,142+c_b
mov x,eax
mov eax,x2
sub eax,x
sub eax,c_b
mov t_w,eax
;set t_h for hd1
mov eax,y2
sub eax,y
sub eax,c_h
mov t_h,eax
invoke MoveWindow,hExpl,x,y,t_w,t_h,TRUE
;status bar
m2m x,c_b
mov eax,y2
sub eax,c_b
sub eax,20
mov y,eax
mov t_h,20
mov eax,x2
sub eax,x1
sub eax,c_b
sub eax,c_b
mov t_w,eax
invoke GetDlgItem,hWin,IDC_SBR1
MOV hd,eax
invoke MoveWindow,hd,x,y,t_w,t_h,TRUE
ret
MyResize endp
;################################################
EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
; VK_PRIOR 21 PAGE UP key
; VK_NEXT 22 PAGE DOWN key
; VK_END 23 END key
; VK_HOME 24 HOME key
.if uMsg==WM_KEYDOWN
mov eax,wParam
.if al==VK_RETURN
; invoke MessageBox,hEdit,addr Message,addr AppName,MB_OK+MB_ICONINFORMATION
invoke SetFocus,hEdit
.ELSEIF al==VK_DOWN
invoke SeListtPosition,1
.elseif al==VK_UP
invoke SeListtPosition,-1
.ELSEIF al==VK_PRIOR
invoke SeListtPosition,-30
.elseif al==VK_NEXT
invoke SeListtPosition,30
; .elseif al==VK_ESCAPE
; INVOKE GetWindowTextLength,hEdit
; .if eax
; invoke SetWindowText,hEdit,0
; .else
; invoke ShowWindow,hWnd,SW_MINIMIZE
; .endif
.else
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
ret
.endif
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
ret
.else
invoke CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
EditWndProc endp
SeListtPosition proc iStep:dword
;作用:
;参数:
;返回值:
;
;开发日期
;备注:
LOCAL lbuf[256]:byte
invoke SendMessage,hList,LB_GETCURSEL,0,0
add eax,iStep
invoke SendMessage,hList,LB_SETCURSEL,eax,0
;invoke SendMessage,hList,LB_SETTOPINDEX,EAX,0
ret
SeListtPosition endp
;################################################
MainKeyDownProcess proc hWin:dword,wParam:WPARAM
;作用:处理主窗口的按键处理;主要针对up,down,pageup,pagedown,esc
;参数:
;返回值:
;
;开发日期:
;备注:
mov eax,wParam
; .if eax==VK_ESCAPE
; INVOKE GetWindowTextLength,hEditInput
; .if !eax
; invoke SetWindowText,hEditInput,0
; .else
; invoke ShowWindow,hWnd,SW_MINIMIZE
; .endif
; .elseif eax==0
; .endif
ret
MainKeyDownProcess endp
SingleQuote2Two proc uses edi esi lpString:dword
;作用:将lpString 中出现的'替换成两个'
;参数:
;返回值:
;
;开发日期:
;备注: lpString 的长度不能超过256
LOCAL lpbuf[256]:byte
invoke lstrlen,lpString
.if eax>256
MyDebug "词条长度大于256!执行出错在list.inc文件下SingleQuote2Two函数!!!"
ret
.endif
mov esi,lpString
lea edi,lpbuf
.while 1
movzx eax,byte ptr [esi]
.if eax==27H
mov [edi],al
inc edi
.elseif !eax
mov [edi],al
.break
.endif
mov [edi],al
inc esi
inc edi
.endw
invoke lstrcpy,lpString,addr lpbuf
ret
SingleQuote2Two endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -