⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 用masmplus学习汇编语言(8) .txt

📁 会变语言实现的一些程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
用MasmPlus学习汇编语言(8)  
相关的例子:下载>>>  作者:Zoologist 于2008-4-14上传   

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

一.单选按钮
    Radio button 中文名称 “单选按钮”。从名称看就能知道是一种特殊的按钮。与之相对,

还有一种可以多选的,叫做 Check Box。今天我们的就编写一个选择更换桌面墙纸的程序。

更换墙纸,我们使用SystemParametersInfo API,这个函数我们在前面多次使用过。与前面

不同,这次我们使用的是 SPI_SETDESKWALLPAPER 这个参数。有一点需要注意的是,2003/XP/2000

操作系统下这个参数后面给出的桌面墙纸不能是 jpg 格式。说明如下:

SPI_SETDESKWALLPAPER Sets the desktop wallpaper. The value of the pvParam parameter determines the new wallpaper. To specify a wallpaper bitmap, set pvParam to point to a NULL-terminated string containing the full path to the bitmap file. Setting pvParam to "" removes the wallpaper. Setting pvParam to SETWALLPAPER_DEFAULT or NULL reverts to the default wallpaper. 
The pvParam parameter can specify a .jpg file.

Windows Server 2003 and Windows XP/2000:  The pvParam parameter cannot specify a .jpg file.
 

程序如下:

;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm

    
    RadioID01        equ     2001
    RadioID02        equ     2002
    RadioID03        equ     2003    
    ButtonID             equ     2004
    
    WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
    WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
    
.DATA
    szClassName db "MASMPlus_Class",0
    num             dd 0abH
    szBuffer        db     100 dup (0)    
    
    szWallPaper01 db    "Wall1",0
    szWallPaper02 db     "Wall2",0
    szWallPaper03 db    "Wall3",0

    WallPaper    dd    0
    
.DATA?
    hInstance    dd ?
    hRadio01        dd     ?
    hRadio02        dd     ?
    hRadio03        dd     ?
    hButton        dd ?
.CODE
START:

    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
    invoke ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
    LOCAL wc :WNDCLASSEX
    LOCAL msg :MSG
    local hWnd :HWND
    
    mov wc.cbSize,sizeof WNDCLASSEX
    mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
    mov wc.lpfnWndProc,offset WndProc
    mov wc.cbClsExtra,NULL
    mov wc.cbWndExtra,NULL
    push hInst
    pop wc.hInstance
    mov wc.hbrBackground,COLOR_BTNFACE+1
    mov wc.lpszMenuName,NULL
    mov wc.lpszClassName,offset szClassName
    invoke LoadIcon,hInst,100
    mov wc.hIcon,eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov wc.hCursor,eax
    mov wc.hIconSm,0
    invoke RegisterClassEx, ADDR wc
    invoke CreateWindowEx,NULL,ADDR szClassName,CTXT("http://www.aogosoft.com"),WS_OVERLAPPEDWINDOW,200,200,300,200,NULL,NULL,hInst,NULL
    mov hWnd,eax
    
;---------- [Create Radio] ----------
INVOKE CreateWindowEx, NULL, CTXT("button"), addr szWallPaper01,\
WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_AUTORADIOBUTTON,\
16, 16, 100, 39, hWnd, RadioID01, hInst, NULL
mov hRadio01, eax

;---------- [Create Radio] ----------
INVOKE CreateWindowEx, NULL, CTXT("button"), addr szWallPaper02,\
WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_AUTORADIOBUTTON,\
16, 64, 100, 47, hWnd, RadioID02, hInst, NULL
mov hRadio02, eax

;---------- [Create Radio] ----------
INVOKE CreateWindowEx, NULL, CTXT("button"), addr szWallPaper03,\
WS_CHILD or WS_VISIBLE or WS_TABSTOP or BS_AUTORADIOBUTTON,\
16, 112, 100, 55, hWnd, RadioID03, hInst, NULL
mov hRadio03, eax    

;---------- [Create the Control Window] ----------
INVOKE CreateWindowEx, NULL, CTXT("button"), CTXT("Change"),\
WS_CHILD or WS_VISIBLE or WS_TABSTOP,\
129, 25, 115, 120, hWnd, ButtonID, hInst, NULL
mov hButton, eax

    invoke ShowWindow,hWnd,SW_SHOWNORMAL
    invoke UpdateWindow,hWnd
    
    StartLoop:
        invoke GetMessage,ADDR msg,NULL,0,0
            cmp eax, 0
            je ExitLoop
                invoke TranslateMessage, ADDR msg
                invoke DispatchMessage, ADDR msg
            jmp StartLoop
    ExitLoop:
    
mov eax,msg.wParam
ret
WinMain endp

WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
    .if uMsg==WM_CREATE

.elseif uMsg == WM_COMMAND
mov eax,wParam
        
        .IF ax==RadioID01 ;我们在这里响应按键的动作
        shr eax,16
        .IF ax==BN_CLICKED
            mov     WallPaper,1
        .ENDIF
        .ENDIF 
        
        .IF ax==RadioID02
        shr eax,16
        .IF ax==BN_CLICKED
            mov     WallPaper,2
        .ENDIF
        .ENDIF 

        .IF ax==RadioID03
        shr eax,16
        .IF ax==BN_CLICKED
            mov     WallPaper,3
        .ENDIF
        .ENDIF 

        .IF ax==ButtonID
        shr eax,16
        .IF ax==BN_CLICKED
            .if         WallPaper==1
                invoke     SystemParametersInfo,SPI_SETDESKWALLPAPER,NULL,CTXT("F:\汇编通讯\MasmPlus\1.bmp"),1
            .elseif      WallPaper==2
                invoke     SystemParametersInfo,SPI_SETDESKWALLPAPER,NULL,CTXT("F:\汇编通讯\MasmPlus\2.bmp"),1
            .elseif     WallPaper==3    
                invoke     SystemParametersInfo,SPI_SETDESKWALLPAPER,NULL,CTXT("F:\汇编通讯\MasmPlus\3.bmp"),1                 
            .endif     
        .ENDIF
        .ENDIF 
        
    .elseif uMsg == WM_DESTROY
        invoke PostQuitMessage,NULL
    .else
        invoke DefWindowProc,hWin,uMsg,wParam,lParam
    .endif
    ret
WndProc endp

END START  

   运行结果:



    选择你想要的,然后点Change按钮,即可更换。

二.光渗视幻觉

    最近在读《数学趣闻集锦(上)》,上面提到了“光渗视幻觉”。

   “视幻觉是由于人们的注意力和眼睛的构造两者造成的.当我们观察一个具有明暗对象的区域时,

不固定的东西在我们眼睛中是不完全清楚的,光线进入位于我们眼 后的视网膜时扩散了.结果明亮的

光线或亮的区域便溢出,并渗入到视网膜上影像的暗区.这样一来,亮的区域就显得比同等大小的暗的

区域要大一些,就像下图所 示的那样.这也解释了为什么穿暗色的衣服,特别是黑的,比起你穿亮丽的

衣服或同等式样的白色衣服,会使你显得更为瘦长.这种幻觉称为光渗,它是由19世纪德国的物理学家和

生理学家赫尔姆霍兹(Herman L.F.von Helmholtz,1821—1894)发现的.” 【参考1】

    下面这个图片中心的方块,哪个看起来大一点呢?

  

    下面我们就设计一个程序来验证这个问题,结合我们前面所学的绘图和获取键盘消息的知识,

 ;MASMPlus 代码模板 - 普通的 Windows 程序代码

.386
.Model Flat, StdCall
Option Casemap :None

Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc

includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
    
    WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
    WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD


.DATA
    szAppName db "Herman's",0
grRight        db    0h
grLeft        db    0h 
rectwhole    RECT <0> 

.DATA?
    hInstance    dd ?
    cxClient        dd ?
    cyClient        dd     ?
rectright    RECT    <>
rectleft        RECT    <> 

.CODE
START: ;从这里开始执行

    invoke GetModuleHandle,NULL
    mov         hInstance,eax
    invoke WinMain,hInstance,NULL,NULL,SW_SHOWDEFAULT
    invoke ExitProcess,0

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,iCmdShow:DWORD
    LOCAL wndclass :WNDCLASSEX
    LOCAL msg         :MSG
    local hWnd         :HWND
    mov wndclass.cbSize,sizeof WNDCLASSEX    
    mov wndclass.style,CS_HREDRAW or CS_VREDRAW    
    mov wndclass.lpfnWndProc,offset WndProc

    mov wndclass.cbClsExtra,0
    mov wndclass.cbWndExtra,0
    
    push hInst
    pop wndclass.hInstance
    
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov wndclass.hIcon,eax    
    
    invoke LoadCursor,NULL,IDC_ARROW
    mov wndclass.hCursor,eax    
    
    invoke GetStockObject,WHITE_BRUSH
    mov wndclass.hbrBackground,EAX
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -