爱爱小说网 > 其他电子书 > windows环境下32位汇编语言程序设计 >

第43章

windows环境下32位汇编语言程序设计-第43章

小说: windows环境下32位汇编语言程序设计 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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  

返回目录 上一页 下一页 回到顶部 2 2

你可能喜欢的