按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
;********************************************************************
。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
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。2 使用状态栏(2)
mov hWinEdit;eax
call _Resize
invoke SetTimer;hWnd;1;300;NULL
;********************************************************************
。elseif eax WM_MAND
mov eax;wParam
。if ax IDM_EXIT
invoke EndDialog;hWnd;NULL
。elseif ax ID_EDIT
invoke GetWindowTextLength;hWinEdit
invoke wsprintf;addr @szBuffer;
addr szFormat1;eax
invoke SendMessage;hWinStatus;SB_SETTEXT;
1;addr @szBuffer
。endif
;********************************************************************
。elseif eax WM_MENUSELECT
invoke MenuHelp;WM_MENUSELECT;wParam;lParam;
lParam;hInstance;hWinStatus;offset dwMenuHelp
。elseif eax WM_SIZE
call _Resize
;********************************************************************
; 检测用户在第3栏的按鼠标动作并将文字在“插入”和“改写”之间切换
;********************************************************************
。elseif eax WM_NOTIFY
。if wParam ID_STATUSBAR
mov eax;lParam
mov eax;'eax + NMHDRde'
。if eax NM_CLICK
;********************************************************************
invoke GetCursorPos;addr @stPoint
invoke GetWindowRect;hWinStatus;addr @stRect
mov eax;@stRect。left
mov ecx;eax
add eax;140
add ecx;172
。if (@stPoint。x 》= eax) && (@stPoint。x 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
start:
invoke InitmonControls
invoke GetModuleHandle;NULL
mov hInstance;eax
invoke DialogBoxParam;hInstance;DLG_MAIN;
NULL;offset _ProcDlgMain;NULL
invoke ExitProcess;NULL
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
end start
资源脚本文件StatusBar。rc的内容如下:
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#include
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
#define ICO_MAIN 1000
#define DLG_MAIN 1000
#define IDM_MAIN 1000
#define IDM_OPEN 1101
#define IDM_SAVE AS 1102
#define IDM_PAGESETUP 1103
#define IDM_EXIT 1104
#define IDM_FIND 1201
#define IDM_REPLACE 1202
#define IDM_SELFONT 1203
#define IDM_SELCOLOR 1204
#define IDM_MENUHELP 1300
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
ICO_MAIN ICON 〃Main。ico〃
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
DLG_MAIN DIALOG 150; 180; 250; 130
MENU IDM_MAIN
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION |
WS_SYSMENU | WS_THICKFRAME
CAPTION 〃状态栏示例〃
FONT 9; 〃宋体〃
{
}
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
IDM_MAIN menu discardable
BEGIN
popup 〃文件(&F)〃
BEGIN
menuitem 〃打开文件(&O)。。。〃;IDM_OPEN
menuitem 〃文件另存为(&C)。。。〃;IDM_SAVEAS
menuitem separator
menuitem 〃页面设置(&P)。。。〃;IDM_PAGESETUP
menuitem separator
menuitem 〃退出(&X)〃;IDM_EXIT
END
popup 〃查看(&V)〃
BEGIN
menuitem 〃查找字符串(&S)。。。〃;IDM_FIND
menuitem 〃替换字符串(&R)。。。〃;IDM_REPLACE
menuitem separator
menuitem 〃选择字体(&F)。。。〃;IDM_SELFONT
menuitem 〃选择颜色(&B)。。。〃;IDM_SELCOLOR
END
END
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
stringtable discardable
BEGIN
IDM_MENUHELP 〃包含文件操作的命令〃
IDM_MENUHELP+1 〃包含操作视图的命令〃
IDM_OPEN 〃打开需要编辑的文件〃
IDM_SAVEAS 〃以另外一个文件名保存文件〃
IDM_PAGESETUP 〃选择打印机以及设置页边距、纸张大小等打印参数〃
IDM_EXIT 〃退出本程序〃
IDM_FIND 〃在窗口中搜索文字〃
IDM_REPLACE 〃在窗口中搜索文字并替换〃
IDM_SELFONT 〃选择窗口中文字使用的字体〃
IDM_SELCOLOR 〃选择窗口的背景颜色〃
END
//》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。2 使用状态栏(3)
上述程序的结构和8。1节中演示通用对话框的例子几乎一模一样,使用的对话框和菜单都没有改变,但是源程序中将处理菜单项的代码全部去掉了,在菜单中保留这些菜单项仅为了演示在状态栏上显示菜单提示信息的功能,菜单提示信息字符串被定义在资源文件的字符串表中。
程序在初始化对话框的WM_INITDIALOG消息(如果建立的是窗口而不是对话框应该是WM_CREATE)中建立了一个状态栏和一个EDIT控件,并设置了一个定时器,用来在状态栏上显示时间。当窗口改变大小的时候,程序在WM_SIZE消息中重新安排状态栏和EDIT控件的位置。
另外,程序也处理状态栏发送的WM_NOTIFY通知消息,这是为了检测用户在第3栏上按下鼠标的动作,以便将文字在“插入”和“改写”之间切换,如果状态栏仅用于输出信息,那么就可以不处理WM_NOTIFY消息。
9。2。1 创建状态栏
创建状态栏可以使用CreateStatusWindow函数:
invoke CreateStatusWindow;style;lpszText;hwndParent;wID
mov hStatus;eax
style参数指明状态栏的风格,它可以是以下取值的组合:
● SBARS_SIZEGRIP——显示状态栏右下角的斜条,用户可以拖动这里来改变主窗口的大小。
● CCS_TOP,CCS_BOTTOM或CCS_NOMOVEY——代表状态栏的初始位置,分别表示位于主窗口上方、下方(默认值)和禁止沿Y方向移动。
● CCS_NOPARENTALIGN——状态栏只自动设置自己的高度,不自动设置自己的宽度,也不自动移动位置。
● CCS_NORESIZE——禁止状态栏所有的自动移动和自动设置自己大小的特性。并禁止CCS_TOP,CCS_BOTTOM,CCS_NOMOVEY和CCS_NOPARENTALIGN风格。
lpszText指向一个初始化的时候显示在状态栏上的字符串。hwndParent指明状态栏的父窗口。wID为状态栏控件的ID,这个ID值可以用来在WM_NOTIFY消息中判断消息是否来自于状态栏。
在例子程序中,用以下代码建立了一个自动缩放的状态栏,状态栏的ID值被定义为ID_STATUSBAR:
invoke CreateStatusWindow;WS_CHILD OR WS_VISIBLE OR
SBS_SIZEGRIP;NULL;hWinMain;ID_STATUSBAR
mov hWinStatus;eax
当然,使用CreateWindowEx函数也可以完成同样的功能,只不过多了很多没有必要指定的参数而已:
szClass db 'msctls_statusbar32';0
。。。
invoke CreateWindowEx;NULL;addr szClass;NULL;
WS_CHILD OR WS_VISIBLE OR SBS_SIZEGRIP;
0;0;0;0;hWnd;ID_STATUSBAR;hInstance;NULL
mov hWinStatus;eax
这几句语句的效果和使用CreateStatusWindow函数创建状态栏是一样的,语句中将位置和大小参数设置为0是因为状态栏有自动调整位置和大小的能力。
9。2。2 状态栏的控制消息
1。 将状态栏分栏
状态栏刚建立的时候只有1栏,为了在状态栏上显示不同种类的信息,有时候需要将状态栏划分成多个栏目,如图9。2中的状态栏就被划分成了4栏,我们使用了前面的3栏来显示信息。
可以通过向状态栏发送SB_SETPARTS消息来将它分栏:
dwStatusWidth dd 60;140;172;…1
。。。
invoke SendMessage;hWinStatus;SB_SETPARTS;4;offset wStatusWidth
其中SB_SETPARTS消息的wParam 参数4代表所分的栏目数量,lParam指向一个Y方向的坐标列表,坐标列表中的坐标数量和栏目数量相对应。如上面的代码将状态栏分为4栏,前面3栏分界点分别位于X方向的60、140和172处,最后一个坐标为?1,表示最后一栏占据了剩下的所有宽度。如果最后一个坐标指定的不是?1,比如说指定的是60,140,172,200,那么状态栏会是图9。3所示的样子——被分栏的地方是凹下的,剩余的地方则保持凸起的状态。
图9。3 状态栏的分栏
在程序中也可以获取分栏的状态,通过向状态栏发送SB_GETPARTS 消息就可以做到这一点:
dwStatusWidth dd 4 dup (?)
。。。
invoke SendMessage;hWinStatus;SB_GETPARTS;4;offset wStatusWidth
其中消息的wParam参数4代表用来接收分栏坐标的缓冲区的大小,lParam参数指向用来接收分栏坐标数据的缓冲区,SB_GETPARTS消息的返回值是状态栏的总栏目数。
2。 维护状态栏中的信息
通过向状态栏发送SB_SETTEXT消息可以将字符串显示到指定的状态栏分栏中:
invoke SendMessage;hWinStatus;SB_SETTEXT;iPart or uType;lpsz
消息的第一个参数指定分栏号和显示信息的方法,iPart表示分栏号,分栏编号从0开始,uType可以指定以下的方法:
● SBT_NOBORDERS——显示的文本不带边框(即分栏不显示为凹下的形状)。
● SBT_OWNERDRAW——分栏由用户自己绘画,当状态栏收到这样的消息后,会马上向父窗口发送WM_DRAWITEM 消息,并在WM_DRAWITEM 消息的lParam参数中指明一个DRAWITEMSTRUCT 结构,这个结构中包括需要绘画的分栏的hDC与坐标等参数,程序可以用任何GDI函数对这个hDC进行绘画,包括使用BitBlt函数将一幅位图画到状态栏分栏中。
● SBT_POPOUT——默认状态下,状态栏的分栏显示为凹下,指定SBT_POPOUT标志将使分栏以凸起的形状显示。
消息的第二个参数lParam中放置的lpsz指向需要显示的字符串。
程序也可以通过发送SB_GETTEXT消息来获取状态栏中某个分栏的文字:
invoke SendMessage;hWinStatus;SB_GETTEXT;iPart;lpsz
iPart参数指定需要获取的分栏编号,lpsz指向一个缓冲区,用来接收返回