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

📄 使用rgb值填充窗口背景 .txt

📁 会变语言实现的一些程序
💻 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 + -