📄 使用rgb值填充窗口背景 .txt
字号:
使用RGB值填充窗口背景
作者:催月泪 于2007-11-16上传
--------------------------------------------------------------------------------
西安百丽涛博运动城 PUMA店 By 催月泪
WINDOWS给我们提供了一些常用的颜色值以及画刷值,我们可以用这些值来决定窗口的背景色,这些已经在《见招拆招WINDOWS程序设计(二)》中讲过了。本篇,将告诉你另外一种方法------使用RGB值来填充窗口背景。
步骤相当简单:
.386
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
Include gdi32.inc
Include winmm.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
IncludeLib winmm.lib
include \MASM32\macros\macros.asm
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA
szAppName db "HelloWin",0
.DATA?
hInstance dd ?
myBrush HBRUSH ?
.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 wndclass :WNDCLASSEX
LOCAL msg :MSG
LOCAL hWnd :HWND
LOCAL logbrush :LOGBRUSH
mov logbrush.lbStyle,BS_HATCHED
RGB 57,128,244
mov logbrush.lbColor,eax
mov logbrush.lbHatch,HS_CROSS
invoke CreateBrushIndirect,addr logbrush
mov myBrush,eax
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
push myBrush
pop wndclass.hbrBackground
mov wndclass.lpszMenuName,NULL
mov wndclass.lpszClassName,offset szAppName
mov wndclass.hIconSm,0
invoke RegisterClassEx, ADDR wndclass
.if (EAX==0)
invoke MessageBox,NULL,CTXT("This program requires Windows NT!"),addr szAppName,MB_ICONERROR
ret
.endif
invoke CreateWindowEx,\
NULL,\
ADDR szAppName,\
CTXT("http://www.aogosoft.com"),\
WS_OVERLAPPEDWINDOW,\
200,\
200,\
400,\
200,\
NULL,\
NULL,\
hInst,\
NULL
mov hWnd,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
LOCAL hdc :HDC
LOCAL ps :PAINTSTRUCT
local rect :RECT
.if uMsg==WM_CREATE
invoke PlaySound,CTXT("C:\WINDOWS\Media\Windows XP 启动.wav"),NULL, SND_FILENAME or SND_ASYNC
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,addr ps
mov hdc,eax
invoke GetClientRect,hWin,addr rect
invoke DrawText,hdc,CTXT("Hello,Windows XP!"),-1,addr rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint, hWin,addr ps
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
.endif
ret
WndProc endp
END START
程序分析:
.DATA?
hInstance dd ?
myBrush HBRUSH ?
我们要自定义一个画刷来填充窗口背景,所以要定义一个变量存储画刷句柄
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
LOCAL wndclass :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
LOCAL logbrush :LOGBRUSH
mov logbrush.lbStyle,BS_HATCHED
RGB 57,128,244
mov logbrush.lbColor,eax
mov logbrush.lbHatch,HS_DIAGCROSS
invoke CreateBrushIndirect,addr logbrush
然后使用CreateBrushIndirect函数创建画刷,这个函数需要LOGBRUSH结
构作为参数,LOGBRUSH结构定义如下:
LOGBRUSH STRUCT
lbStyle DWORD ?
lbColor DWORD ?
lbHatch DWORD ?
LOGBRUSH ENDS
它有三个成员:
lbStyle:指定画刷样式
lbColor:RGB颜色值
lbHatch:指定填充风格
具体请参考MSDN,这里lbStyle我们使用BS_HATCHED常量,指定有阴影线的画刷;lbColor的RGB值,你可以通过WINDOWS的画图工具来查看;
lbHatch我们使用HS_CROSS样式。
最后使用 mov myBrush,eax 保存画刷句柄。
作为练习,你可以试试让lbHatch使用HS_DIAGCROSS填充风格,看看窗口背景会有什么变化。
说点题外话吧,我这个菜鸟级别的人就是《汇编通讯》的忠实读者。很想杂志做点贡献可苦于自己水平有限,无奈只好在VC知识库在线杂志中疯狂搜索一通,终于找到了一片非常初级的文章把它以汇编的形式带给大家。网络上编程网站一抓一大堆,可真正属于汇编爱好者的又有几个呢?整个网站或论坛从不出现广告的又有几个呢?自己掏腰包建站点而丝毫不盈利的网站有几个呢?只有AOGO汇编站点这么单纯!希望水平高的汇编爱好者们都来支持我们这个来之不易的AOGO和这份期刊!
本文参考资料来源于: http://www.vckbase.com/vckbase/default.aspx 特此表示感谢!
本文作者Email:Jaclick@gmail.com
--------------------------------------------------------------------------------
欢迎访问AoGo汇编小站:http://www.aogosoft.com 下一篇>>>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -