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

📄 list.inc

📁 一个背单词源码
💻 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 + -