📄 用masmplus学习汇编语言(8) .txt
字号:
用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 + -