xing59741 发表于 2013-2-3 23:29:38

【学习笔记】状态栏学习

状态栏学习
----------------------------------

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                .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: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                ;创建状态栏子窗口,ID_STATUSBAR为ID
                        mov        hWinStatus,eax
                        invoke        SendMessage,hWinStatus,SB_SETPARTS,4,offset dwStatusWidth                                        ;将状态栏分成按照dwStatusWidth里的4个数据划分长度(1,2,3,4)
                        mov        lpsz1,offset sz1
                        mov        lpsz2,offset sz2
                        invoke        SendMessage,hWinStatus,SB_SETTEXT,2,lpsz1                                                        ;发送消息:设置第三个项目的字符窜lpsz1:插入(0,1,2,3)

                        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
                        mov        hWinEdit,eax

                        call        _Resize                                                                                                ;调整程序布局
                        invoke        SetTimer,hWnd,1,300,NULL                                                                        ;定时器:0.3s频率
;********************************************************************
                .elseif        eax ==        WM_COMMAND
                        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                                                                                ;CreateStatusWindow中的第一个参数ID
                                mov        eax,lParam
                                mov        eax,                                                                        ;得到CODE通知码(将方括号里面的地址相加后的地址数据存入eax)
                                .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 <= ecx)                                        ;大于状态栏第二个项目小于第三个项目
                                                mov        eax,lpsz1
                                                xchg        eax,lpsz2
                                                mov        lpsz1,eax                                                                ;数据互换
                                                invoke        SendMessage,hWinStatus,SB_SETTEXT,2,lpsz1                                ;将字符窜写入状态栏第三个项目
                                        .endif
                                .endif
                        .endif
                .else
                        mov        eax,FALSE
                        ret
                .endif
                mov        eax,TRUE
                ret

_ProcDlgMain        endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
                invoke        InitCommonControls
                invoke        GetModuleHandle,NULL
                mov        hInstance,eax
                invoke        DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
                invoke        ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
                end        start
状态栏学习.rc
----------------------------------------------
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include                <resource.h>
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define        ICO_MAIN                1000
#define        DLG_MAIN                1000
#define        IDM_MAIN                1000
#define        IDM_OPEN                1101
#define        IDM_SAVEAS                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_FIND        "在窗口中搜索文字"
        IDM_REPLACE        "在窗口中搜索文字并替换"
        IDM_SELFONT        "选择窗口中文字使用的字体"
        IDM_SELCOLOR        "选择窗口的背景颜色"
        IDM_OPEN        "打开需要编辑的文件"
        IDM_SAVEAS        "以另外一个文件名保存文件"
        IDM_PAGESETUP        "选择打印机以及设置页边距、纸张大小等打印参数"
        IDM_EXIT        "退出本程序"
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>








xing59741 发表于 2013-2-3 23:30:30

状态栏学习..............

shansongh 发表于 2013-2-5 16:53:33

没看懂……

newu 发表于 2013-2-5 21:28:48

这是什么东东啊 !

风之残月 发表于 2013-2-6 11:51:31

下下来学习一下
页: [1]
查看完整版本: 【学习笔记】状态栏学习