?? 使用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 + -