友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
八万小说网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

windows环境下32位汇编语言程序设计-第40部分

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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指向一个缓冲区,用来接收返回
返回目录 上一页 下一页 回到顶部 7 6
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!