| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 850 人关注过本帖
标题:绘标题栏简例
取消只看楼主 加入收藏
sll0807
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:69
专家分:123
注 册:2009-3-2
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:1 
绘标题栏简例
就是段小例子 其实处理绘制标题栏 涉及到很多消息
代码我也是很偷懒了 不过 大家知道怎么搞 剩下的就简单了
绘制完背景还需要重绘 图标 和标题 或者 干脆直接上图片算了呵呵

有时间 把例子写完整 嘿嘿
程序代码:
.386
.Model Flat,Stdcall
Option Casemap :None

Include        Windows.inc
Include        Kernel32.inc
Include        User32.inc
Include        Gdi32.inc
    
Include        /MASMPlus/Macros/Strings.Mac
    
IncludeLib    Kernel32.lib
IncludeLib    User32.lib
IncludeLib    Gdi32.lib

.Data?
hInstance        dd ?
lpOldDlgProc    dd ?

.Code

DrawTitleBar    Proc    _hWnd:DWORD,_hDC:DWORD
    Local    @hBrush,@hPen
    Local    @stRect:RECT

    invoke    GetWindowRect,_hWnd,addr @stRect
    
    mov        eax,@stRect.left                            ; Window size 
    mov        @stRect.left,0
    sub        @stRect.right,eax
    mov        eax,@stRect.top
    mov        @stRect.top,0
    sub        @stRect.bottom,eax
    
    invoke    GetSystemMetrics,SM_CXFRAME            ; titlebar size
    mov        @stRect.bottom,eax
    invoke    GetSystemMetrics,SM_CYSIZE
    add        @stRect.bottom,eax
    
    invoke    CreateSolidBrush,00db8943h 
    mov        @hBrush,eax
    invoke    FrameRect,_hDC,addr @stRect,@hBrush
    invoke    DeleteObject,@hBrush
    
    invoke    CreateSolidBrush,00ffebdch
    mov        @hBrush,eax
    inc        @stRect.left
    inc        @stRect.top
    dec        @stRect.right
    invoke    FrameRect,_hDC,addr @stRect,@hBrush
    inc        @stRect.left
    inc        @stRect.top
    dec        @stRect.right
    dec        @stRect.bottom
    invoke    FrameRect,_hDC,addr @stRect,@hBrush
    invoke    DeleteObject,@hBrush
    
;    invoke    CreateSolidBrush,00FFBEA0h                            ; 可以使用图片填充
;    mov        @hBrush,eax
;    invoke    CreatePen,PS_SOLID,0,00f4c593h
;    mov        @hPen,eax
;    invoke    SelectObject,_hDC,@hBrush
;    invoke    SelectObject,_hDC,@hPen
;    inc        @stRect.left
;    inc        @stRect.top
;    dec        @stRect.right
;    dec        @stRect.bottom
;    invoke    Rectangle,_hDC,@stRect.left,@stRect.top,@stRect.right,@stRect.bottom
;    invoke    DeleteObject,@hBrush
;    invoke    DeleteObject,@hPen
    
    ret

DrawTitleBar    EndP

NewWndProc    Proc    Uses esi edi ebx _hWnd:DWORD,_uMsg:DWORD,_wParam:DWORD,_lParam:DWORD
    Local    @stRect:RECT
    Local    @hDC:DWORD

    .if    _uMsg == WM_NCPAINT
    
        invoke    CallWindowProc,lpOldDlgProc,_hWnd,_uMsg,_wParam,_lParam
        
        invoke    GetWindowDC,_hWnd                                        ; Draw titlebar
        mov        @hDC,eax
        invoke    DrawTitleBar,_hWnd,@hDC
        invoke    ReleaseDC,_hWnd,@hDC
        
        ret
        
    .elseif _uMsg == WM_ACTIVATE
        
        invoke    GetWindowDC,_hWnd                                        ; Draw titlebar
        mov        @hDC,eax
        invoke    DrawTitleBar,_hWnd,@hDC
        invoke    ReleaseDC,_hWnd,@hDC
        
        invoke    CallWindowProc,lpOldDlgProc,_hWnd,_uMsg,_wParam,_lParam
        ret
    .elseif _uMsg == WM_NCACTIVATE
        
        invoke    GetWindowDC,_hWnd                                        ; Draw titlebar
        mov        @hDC,eax
        invoke    DrawTitleBar,_hWnd,@hDC
        invoke    ReleaseDC,_hWnd,@hDC
        
        invoke    CallWindowProc,lpOldDlgProc,_hWnd,_uMsg,_wParam,_lParam
        ret
    
    .else
    
        invoke    CallWindowProc,lpOldDlgProc,_hWnd,_uMsg,_wParam,_lParam
        ret
    
    .endif
    
    xor    eax,eax
    ret
NewWndProc    EndP

WndProc    Proc    Uses ebx edi esi _hWnd:DWORD,_uMsg:DWORD,_wParam:DWORD,_lParam:DWORD

    .if _uMsg == WM_CLOSE                                                        ; Dialog terminate
    
        invoke    EndDialog,_hWnd,NULL
    
    .elseif _uMsg == WM_INITDIALOG                                            ; Dialog initialization
    
        invoke    SetWindowLong,_hWnd,GWL_WNDPROC,offset NewWndProc    ; SubClass
        mov        lpOldDlgProc,eax
    
    .else
    
        mov eax,FALSE
        ret
    
    .endif
    
    mov eax,TRUE
    ret
    
WndProc    EndP

Start Proc

    invoke    GetModuleHandle,NULL                                                ; Get the module handle
    mov        hInstance,eax
    
    invoke    DialogBoxParam,hInstance,1000,NULL,WndProc,NULL            ; Dialog
    
    ret
    
Start    EndP

End Start 

Rc

程序代码:
#include        <resource.h>

1000 DIALOG 0, 0, 227, 170
STYLE DS_CENTER | DS_MODALFRAME | WS_POPUP | WS_CAPTION 
CAPTION "Titlebar Example Works 2009"
FONT 9, "宋体"
{

}
图片附件: 游客没有浏览图片的权限,请 登录注册


图片附件: 游客没有浏览图片的权限,请 登录注册




[ 本帖最后由 sll0807 于 2009-10-30 20:34 编辑 ]
搜索更多相关主题的帖子: 标题栏 图片 
2009-10-30 20:30
sll0807
Rank: 3Rank: 3
等 级:论坛游侠
威 望:5
帖 子:69
专家分:123
注 册:2009-3-2
收藏
得分:0 
基本遵循了老罗提出的代码风格
除了代码写的好看点 程序写的挺烂的

我觉得有的东西多查查MSDN会记得更牢嘿嘿

[ 本帖最后由 sll0807 于 2009-11-2 00:10 编辑 ]
2009-11-02 00:07
快速回复:绘标题栏简例
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.049709 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved