windows环境下32位汇编语言程序设计-第43章
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
● 滚动条控件使用WM_VSCROLL或者WM_HSCROLL消息通知父窗口,和窗口自身滚动条使用的消息名称保持一致可以便于使用已经存在的滚动条消息处理代码。
● 除了上面这两种特殊情况外,大部分通用控件使用WM_NOTIFY消息通知父窗口。这样可以避免和菜单或加速键等使用的WM_MAND消息相混淆。
当父窗口收到WM_NOTIFY消息时,wParam参数的内容是通用控件的ID,也就是使用CreateWindowEx函数创建控件时使用的第10个参数,通过这个参数可以判别WM_NOTIFY消息是由哪个通用控件发送的;消息的lParam参数指向一个NMHDR结构:
NMHDR STRUCT
hwndFrom DWORD ? ;发送WM_NOTIFY的通用控件的窗口句柄
idFrom DWORD ? ;发送WM_NOTIFY的通用控件的ID
code DWORD ? ;通知码
NMHDR ends
通过NMHDR结构中的hwndFrom字段和idFrom字段也可以判别发送WM_NOTIFY消息的控件,由于使用CreateWindowEx函数创建多个通用控件的时候可以使用同样的ID值,所以有时候使用ID并不能惟一确定控件,只有在创建的时候对不同的控件使用了不同的ID值,才能用ID值来惟一确定控件。而系统中每个窗口的窗口句柄是惟一的,所以使用hwndFrom字段是肯定能惟一确定控件的。
结构中的code字段是通知码,通过这个字段可以了解到控件上发生的动作,每种控件都有自己独特的通知码集合,但下面的通知码是大部分控件都使用的:
● NM_CLICK——用户在控件上按下了鼠标左键。
● NM_DBLCLK——用户在控件上双击鼠标左键。
● NM_KILLFOCUS——控件失去了键盘输入焦点。
● NM_OUTOFMEMORY——控件在运行中内存耗尽。
● NM_RCLICK——用户在控件上按下了鼠标右键。
● NM_RDBLCLK——用户在控件上双击鼠标右键。
● NM_RETURN——用户在控件上按下了回车键。
● NM_SETFOCUS——控件得到了键盘输入焦点。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第9章 通用控件
9。2 使用状态栏(1)
状态栏一般位于主窗口的底部(当然,如果愿意的话,也可以把它放在主窗口的上方,不过几乎没有人这样做),用来显示程序运行中的一些状态信息。本节中的例子程序创建了一个带状态栏的对话框,运行界面如图9。2的左边窗口所示。状态栏中分别显示了时间、编辑器中的总字节数和插入状态等3栏内容,随着时间的改变和字符的输入,这些信息会随时被更新。状态栏的另一个重要应用是显示菜单项的说明信息。在例子程序中,随着鼠标移到不同的菜单项上,状态栏上的说明信息也随之改变,如图9。2的右边窗口所示。
图9。2 状态栏示例
一般来说,状态栏仅用于输出信息,并不用来输入信息,但有时也会使用状态栏来获取有限功能的输入,如在例子程序中状态栏的第3栏上单击鼠标,文字会在“插入”和“改写”之间切换,一些文本编辑软件就是用这种办法来改变文字输入方式的。
本节提供的例子位于所附光盘的Chapter09StatusBar目录中,包括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 ctl32。inc
includelib ctl32。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 ?
nst
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
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
; 代码段
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
de
;》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
_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
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第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