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章 通用控件 · 9.1 通用控件简介(2) 下页:第09章 通用控件 · 9.2 使用状态栏(2)

第09章 通用控件

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