zoukankan      html  css  js  c++  java
  • Win32汇编对话框资源的综合应用

    这个实验中基本上把改用的对话框资源都用上了,GROUPBOX, AUTOCHECKBOX,COMBOBOX,EDITTEXT,TEXT,SCROLLBAR,PUSHBUTTON...一开始对于控件的位置可能把握不好,但是我想先把一些基本组件的特征写出来,位置,大小都设置为0,保存为RC文件,然后用编译成RES文件,用VC++6.0来编辑这些控件,把位置,大小都弄成合适的大小,保存。也可以另存为一份RC文件,里面把位置,大小的数值都列出来了~~


    资源文件Control.rc源代码如下:

    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    #include        <resource.h>
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    #define ICO_MAIN        0x1000
    #define DLG_MAIN        1
    #define IDB_1           1
    #define IDB_2           2
    #define IDC_ONTOP       101
    #define IDC_SHOWBMP     102
    #define IDC_ALOWCHG     103
    #define IDC_MODALFRAME  104
    #define IDC_THICKFRAME  105
    #define IDC_TITLETEXT   106
    #define IDC_CUSTOMTEXT  107
    #define IDC_BMP         108
    #define IDC_SCROLL      109
    #define IDC_SBVALUE     110
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ICO_MAIN        ICON    "Main.ico"
    IDB_1           BITMAP  "Picture1.bmp"
    IDB_2           BITMAP  "Picture2.bmp"
    //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    DLG_MAIN DIALOG 150, 200, 325, 140
    STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
    CAPTION "对话框空间示例"
    FONT 9, "宋体"
    BEGIN
        GROUPBOX            "选项", -1, 64, 8, 122, 101
        AUTOCHECKBOX        "总在最前", IDC_ONTOP, 74, 23, 100, 8
        AUTOCHECKBOX        "显示图片", IDC_SHOWBMP, 74, 41, 100, 10
        AUTOCHECKBOX        "允许更换图片", IDC_ALOWCHG, 74, 58, 100, 11
        CONTROL             "", -1, "Static", SS_ETCHEDHORZ | WS_VISIBLE | WS_CHILD, 72, 71, 102, 1
        AUTORADIOBUTTON     "模态边框(&Modal Frame)", IDC_MODALFRAME, 74, 78, 100, 10, WS_TABSTOP
        AUTORADIOBUTTON     "可变边框(&Thick Frame)", IDC_THICKFRAME, 74, 92, 72, 10, WS_TABSTOP
     
        GROUPBOX            "标题文字", -1, 201, 8, 123, 101
        COMBOBOX            IDC_TITLETEXT, 208, 23, 102, 70, CBS_DROPDOWNLIST | WS_TABSTOP
        LTEXT               "自定义文字: ", -1, 208, 43, 98, 9
        EDITTEXT            IDC_CUSTOMTEXT, 208, 56, 101, 14
        LTEXT               "请在此选择显示在标题栏上面的文字,或者选择“自定义”后自行输入", -1, 208,75,105,26, WS_BORDER
        CONTROL             "", -1, "Static", SS_ETCHEDHORZ | WS_VISIBLE | WS_CHILD, 0, 115, 325, 1
        DEFPUSHBUTTON       "更换图片(&C)", IDOK, 175, 120, 63, 14
        PUSHBUTTON          "退出(&X)", IDCANCEL, 252, 120, 62, 14
        CONTROL             IDB_1, IDC_BMP, "Static", SS_BITMAP | WS_VISIBLE | WS_CHILD, 11, 8, 43, 100
        SCROLLBAR           IDC_SCROLL, 9, 122, 122, 12
        LTEXT               "0", IDC_SBVALUE, 138, 124, 34, 10
    END

    对于功能函数,对于此例子也学会了对话框的基本性质,以及如何去把握窗口的风格,DS_MODALFRAME 和 WS_THICKFRAME分别可以控制窗口大小是否可变。

          所有控件中,对于SCROLLBAR的控制略显复杂。垂直滚动条发送WM_VSCROLL,水平的则发送WM_HSCROLL消息,对于这两种消息的处理则是大同小异,传参细节如下:

          wParam低16位是nScrollCode   ;动作码

          wParam高16位是nPos             ;滚动条当前位置

          lParam = hwndScrollCode      ;滚动条控件当前句柄

    这些大家都可以在MSDN上更详细的看到

    Control.asm源代码如下:

    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                    .386
                    .model  flat, stdcall
                    option  casemap :none
            
    include         windows.inc
    include         user32.inc
    includelib      user32.lib
    include         kernel32.inc
    includelib      kernel32.lib
    include         gdi32.inc
    includelib      gdi32.lib
    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    ICO_MAIN        equ     1000h   ;图标
    DLG_MAIN        equ     1
    IDB_1           equ     1
    IDB_2           equ     2
    IDC_ONTOP       equ     101
    IDC_SHOWBMP     equ     102
    IDC_ALOW        equ     103
    IDC_MODALFRAME  equ     104
    IDC_THICKFRAME  equ     105
    IDC_TITLETEXT   equ     106
    IDC_CUSTOMTEXT  equ     107
    IDC_BMP         equ     108
    IDC_SCROLL      equ     109
    IDC_VALUE       equ     110
    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                    .data?
    hInstance       dd      ?
    hBmp1           dd      ?
    hBmp2           dd      ?
    dwPos           dd      ?
                    .const
    szText1         db      "Hello, world!",0
    szText2         db      "Win32 Assumbly!",0
    szText3         db      "自定义",0
    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                    .code
    _ProcDlgMain    proc    uses ebx edi esi hWnd, uMsg, wParam, lParam
            local   @szBuffer[126]:BYTE     
            
            .if     uMsg == WM_CLOSE
                    invoke  EndDialog,hWnd,NULL
                    invoke  DeleteObject,hBmp1
                    invoke  DeleteObject,hBmp2
            .elseif uMsg == WM_INITDIALOG
                    ;====================================设置标题栏图标
                    invoke  LoadIcon,hInstance,ICO_MAIN
                    invoke  SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                    ;====================================初始化组合框
                    invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText1
                    invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText2
                    invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_ADDSTRING,0,addr szText3
                    invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_SETCURSEL,0,0
                    invoke  GetDlgItem,hWnd,IDC_CUSTOMTEXT
                    invoke  EnableWindow,eax,FALSE
                    invoke  LoadBitmap,hInstance,IDB_1
                    mov     hBmp1,eax
                    invoke  LoadBitmap,hInstance,IDB_2
                    mov     hBmp2,eax
                    ;====================================初始化单选钮和复选框
                    invoke  CheckDlgButton,hWnd,IDC_SHOWBMP,BST_CHECKED
                    invoke  CheckDlgButton,hWnd,IDC_ALOW,BST_CHECKED
                    invoke  CheckDlgButton,hWnd,IDC_THICKFRAME,BST_CHECKED
                    ;====================================初始化滚动条
                    invoke  SendDlgItemMessage,hWnd,IDC_SCROLL,SBM_SETRANGE,0,100
                    
            .elseif uMsg == WM_COMMAND
                    mov     eax,wParam
                    .if     ax  ==  IDCANCEL
                            invoke  EndDialog,hWnd,NULL
                            invoke  DeleteObject,hBmp1
                            invoke  DeleteObject,hBmp2
                    ;====================================更换图片
                    .elseif ax  ==  IDOK
                            mov     eax,hBmp1
                            xchg    eax,hBmp2
                            mov     hBmp1,eax
                            invoke  SendDlgItemMessage,hWnd,IDC_BMP,STM_SETIMAGE,IMAGE_BITMAP,eax
                    ;===================================="总在最前"
                    .elseif ax  ==  IDC_ONTOP
                            invoke  IsDlgButtonChecked,hWnd,IDC_ONTOP
                            .if     eax ==  BST_CHECKED
                                    invoke  SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
                            .else
                                    invoke  SetWindowPos,hWnd,HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE
                            .endif
                    ;====================================显示或隐藏图片
                    .elseif ax  ==  IDC_SHOWBMP
                            invoke  GetDlgItem,hWnd,IDC_BMP
                            mov     ebx,eax
                            invoke  IsWindowVisible,ebx
                            .if     eax
                                    invoke  ShowWindow,ebx,SW_HIDE
                            .else   
                                    invoke  ShowWindow,ebx,SW_SHOW
                            .endif
                    ;===================================允许和灰化"更换图片"按钮
                    .elseif ax  ==  IDC_ALOW
                            invoke  IsDlgButtonChecked,hWnd,IDC_ALOW
                            .if     eax ==  BST_CHECKED
                                    mov     ebx,TRUE
                            .else
                                    xor     ebx,ebx
                            .endif
                            invoke  GetDlgItem,hWnd,IDOK
                            invoke  EnableWindow,eax,ebx
                    ;=================================="模态边框" 还是 "可变边框"
                    .elseif ax  ==  IDC_MODALFRAME
                            invoke  GetWindowLong,hWnd,GWL_STYLE
                            and     eax,not WS_THICKFRAME
                            invoke  SetWindowLong,hWnd,GWL_STYLE,eax
                    .elseif ax  ==  IDC_THICKFRAME
                            invoke  GetWindowLong,hWnd,GWL_STYLE
                            or      eax,WS_THICKFRAME
                            invoke  SetWindowLong,hWnd,GWL_STYLE,eax
                    ;==================================处理下拉式组合框
                    .elseif ax  ==  IDC_TITLETEXT
                            shr     eax,16
                            .if     ax  ==  CBN_SELENDOK
                                    invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,CB_GETCURSEL,0,0
                                    .if     eax ==  2
                                            invoke  GetDlgItem,hWnd,IDC_CUSTOMTEXT
                                            invoke  EnableWindow,eax,TRUE
                                    .else
                                            mov     ebx,eax
                                            invoke  SendDlgItemMessage,hWnd,IDC_TITLETEXT,/
                                                    CB_GETLBTEXT,ebx,addr @szBuffer
                                            invoke  SetWindowText,hWnd,addr @szBuffer
                                            invoke  GetDlgItem,hWnd,IDC_CUSTOMTEXT
                                            invoke  EnableWindow,eax,FALSE
                                    .endif
                            .endif
                    ;=================================在文本框输入文字
                    .elseif ax  ==  IDC_CUSTOMTEXT
                            invoke  GetDlgItemText,hWnd,IDC_CUSTOMTEXT,addr @szBuffer,sizeof @szBuffer
                            invoke  SetWindowText,hWnd,addr @szBuffer
                    .endif
            ;==========================处理滚动条信息
            .elseif uMsg == WM_HSCROLL
                    mov     eax,wParam
                    .if     ax  ==  SB_LINELEFT
                            dec     dwPos
                    .elseif ax  ==  SB_LINERIGHT
                            inc     dwPos
                    .elseif ax  ==  SB_PAGELEFT
                            sub     dwPos,10
                    .elseif ax  ==  SB_PAGERIGHT
                            add     dwPos,10
                    .elseif ax  ==  SB_THUMBPOSITION || ax == SB_THUMBTRACK ;******
                            mov     eax,wParam
                            shr     eax,16
                            mov     dwPos,eax
                    .else
                            mov     eax,TRUE
                            ret
                    .endif
                    cmp     dwPos,0
                    jge     @F
                    mov     dwPos,0
                    @@:
                    cmp     dwPos,100
                    jle     @F
                    mov     dwPos,100
                    @@:
                    invoke  SetDlgItemInt,hWnd,IDC_VALUE,dwPos,FALSE
                    invoke  SendDlgItemMessage,hWnd,IDC_SCROLL,SBM_SETPOS,dwPos,TRUE ;TRUE表示重绘
            .else
                    mov     eax,FALSE
                    ret
            .endif
            mov     eax,TRUE
            ret
                    
    _ProcDlgMain    endp
    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    start:
                    invoke  GetModuleHandle,NULL
                    mov     hInstance,eax
                    invoke  DialogBoxParam,hInstance,DLG_MAIN,NULL,addr _ProcDlgMain,NULL
                    invoke  ExitProcess,NULL
    ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<              
                    end     start

    注释基本上都写上去了,这个实验本也没有什么技术含量,寒假在家没事的时候做了两遍,出于纪念意义还是贴上去吧!由于图片上传功能暂时关闭,等有时间再把图片贴上去吧

    参考文献:罗云彬的windows下32位汇编教程

    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    请求内部转发与重定向区别
    JSTL标签
    JSP学习总结
    JSP执行过程
    Cookie实现--用户上次访问时间
    python 关键知识点
    PIL 学习
    python 与 matlab 混编
    matplotlib 中文显示 的问题
    中文文本分类1
  • 原文地址:https://www.cnblogs.com/kedebug/p/2791760.html
Copyright © 2011-2022 走看看