WIN32汇编语言教程:第09章 通用控件 · 9.2 使用状态栏(1)
状态栏一般位于主窗口的底部(当然,如果愿意的话,也可以把它放在主窗口的上方,不过几乎没有人这样做),用来显示程序运行中的一些状态信息。本节中的例子程序创建了一个带状态栏的对话框,运行界面如图9.2的左边窗口所示。状态栏中分别显示了时间、编辑器中的总字节数和插入状态等3栏内容,随着时间的改变和字符的输入,这些信息会随时被更新。状态栏的另一个重要应用是显示菜单项的说明信息。在例子程序中,随着鼠标移到不同的菜单项上,状态栏上的说明信息也随之改变,如图9.2的右边窗口所示。
图9.2 状态栏示例
一般来说,状态栏仅用于输出信息,并不用来输入信息,但有时也会使用状态栏来获取有限功能的输入,如在例子程序中状态栏的第3栏上单击鼠标,文字会在“插入”和“改写”之间切换,一些文本编辑软件就是用这种办法来改变文字输入方式的。
本节提供的例子位于所附光盘的Chapter09\StatusBar目录中,包括StatusBar.asm文件和StatusBar.rc文件。StatusBar.asm文件的内容如下:
.386 .model flat, stdcall option casemap :none ;#################################################################### ; Include 文件定义 ;#################################################################### include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comctl32.inc includelib Comctl32.lib ;#################################################################### ; Equ 等值定义 ;#################################################################### ICO_MAIN equ 1000 DLG_MAIN equ 1000 IDM_MAIN equ 1000 IDM_EXIT equ 1104 IDM_MENUHELP equ 1300 ID_STATUSBAR equ 1 ID_EDIT equ 2 ;#################################################################### ; 数据段 ;#################################################################### .data? hInstance dd ? hWinMain dd ? hWinStatus dd ? hWinEdit dd ? lpsz1 dd ? lpsz2 dd ? .const szClass db 'EDIT',0 szFormat0 db '%02d:%02d:%02d',0 szFormat1 db '字节数:%d',0 sz1 db '插入',0 sz2 db '改写',0 dwStatusWidth dd 60,140,172,-1 dwMenuHelp dd 0,IDM_MENUHELP,0,0 ;#################################################################### ; 代码段 ;#################################################################### .code ;#################################################################### _Resize proc local @stRect:RECT,@stRect1:RECT invoke MoveWindow,hWinStatus,0,0,0,0,TRUE invoke GetWindowRect,hWinStatus,addr @stRect invoke GetClientRect,hWinMain,addr @stRect1 mov ecx,@stRect1.right sub ecx,@stRect1.left mov eax,@stRect1.bottom sub eax,@stRect1.top sub eax,@stRect.bottom add eax,@stRect.top invoke MoveWindow,hWinEdit,0,0,ecx,eax,TRUE ret _Resize endp ;#################################################################### _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam local @szBuffer[128]:byte local @stST:SYSTEMTIME local @stPoint:POINT,@stRect:RECT mov eax,wMsg ;******************************************************************** .if eax == WM_TIMER invoke GetLocalTime,addr @stST movzx eax,@stST.wHour movzx ebx,@stST.wMinute movzx ecx,@stST.wSecond invoke wsprintf,addr @szBuffer,addr szFormat0,\ eax,ebx,ecx invoke SendMessage,hWinStatus,SB_SETTEXT,\ 0,addr @szBuffer ;******************************************************************** .elseif eax == WM_CLOSE invoke KillTimer,hWnd,1 invoke EndDialog,hWnd,NULL ;******************************************************************** .elseif eax == WM_INITDIALOG mov eax,hWnd mov hWinMain,eax invoke CreateStatusWindow,WS_CHILD OR WS_VISIBLE OR \ SBS_SIZEGRIP,NULL,hWinMain,ID_STATUSBAR mov hWinStatus,eax invoke SendMessage,hWinStatus,SB_SETPARTS,\ 4,offset dwStatusWidth mov lpsz1,offset sz1 mov lpsz2,offset sz2 invoke SendMessage,hWinStatus,SB_SETTEXT,2,lpsz1 invoke CreateWindowEx,WS_EX_CLIENTEDGE,\ addr szClass,NULL,WS_CHILD or WS_VISIBLE or\ ES_MULTILINE or ES_WANTRETURN or WS_VSCROLL or\ ES_AUTOHSCROLL,\ 0,0,0,0,hWnd,ID_EDIT,hInstance,NULL
第09章 通用控件
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号