频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

【编程】界面 - 皮肤界面(自画窗口标题)

来源: 作者: 出处:巧巧读书 2006-06-03 进入讨论组

    在皮肤界面中,最难的恐怕就是自画窗口标题了,网上虽然有各种各样的解决方法,但是都不是很完美,而商业皮肤界面程序包是需要花钱买的。

其中最主要的问题有:

1、在标题栏或边框移动鼠标时系统会画窗口标题

2、没有任务栏图标。当取消了 SYS_CAPTION Style 后系统不会画窗口标题了,但是同时该窗口也没有任务栏图标。

3、最大化后在标题栏按下鼠标时系统会画窗口标题

4、按下系统按钮再移动鼠标到按钮外后没有正确的重画按钮

    没办法,只有自己摸索了,研究了网络上的一些代码片段和几个比较成功的皮肤界面程序比如 RealPlay, Microsoft Money ,发现它们采用的手法都不尽相同,而网上关于这个问题也没有很完美的解决方案,总是有点小瑕疵。最后,去研究了一下 Windows 2000 的核心代码中关于窗口管理部分,终于算是比较满意的解决了上面的这些问题,但是,我采用的方法和RealPlay, Microsoft Money 都不太一样,RealPlay 好象没有了 NC_* 的消息,而Microsoft Money 则是采用遮盖的方法,而我是采用直接重画的方法,关键是找到重画的关键点。

【编程】界面 - 皮肤界面(自画窗口标题)(图一)

关键代码:

  1【编程】界面 - 皮肤界面(自画窗口标题)(图二)    BEGIN_MSG_MAP(TCaptionBaseT)
  2【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCHITTEST,            OnNCHitTest)
  3【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCPAINT,                OnNCPaint)
  4【编程】界面 - 皮肤界面(自画窗口标题)(图二)
  5【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCLBUTTONDOWN,        OnNCLButtonDown)
  6【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCLBUTTONUP,            OnNCLButtonUp)
  7【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCMOUSEMOVE,            OnNCMouseMove)
  8【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_LBUTTONUP,            OnLButtonUp)
  9【编程】界面 - 皮肤界面(自画窗口标题)(图二)
10【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_NCACTIVATE,            OnNCActivate)
11【编程】界面 - 皮肤界面(自画窗口标题)(图二)
12【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_SYSCOMMAND,            OnSysCommand)
13【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_INITMENU,            OnInitMenu)
14【编程】界面 - 皮肤界面(自画窗口标题)(图二)
15【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_SIZE,                OnSizeChanged)
16【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_STYLECHANGED ,        OnStyleChanged)
17【编程】界面 - 皮肤界面(自画窗口标题)(图二) MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingsChange) 18【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_SETTEXT,                OnSetText)
19【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_SETICON ,            OnSetIcon)
20【编程】界面 - 皮肤界面(自画窗口标题)(图二)
21【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_CREATE,                OnCreate)
22【编程】界面 - 皮肤界面(自画窗口标题)(图二)        MESSAGE_HANDLER(WM_INITDIALOG,            OnInitDialog)
23【编程】界面 - 皮肤界面(自画窗口标题)(图二)    END_MSG_MAP()
24【编程】界面 - 皮肤界面(自画窗口标题)(图二)
25【编程】界面 - 皮肤界面(自画窗口标题)(图二)    LRESULT OnNCLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
26【编程】界面 - 皮肤界面(自画窗口标题)(图三)【编程】界面 - 皮肤界面(自画窗口标题)(图四)    {
27【编程】界面 - 皮肤界面(自画窗口标题)(图五)        // wParam 由 OnNcHitTest 返回
28【编程】界面 - 皮肤界面(自画窗口标题)(图五)        T* pT = static_cast<T*>(this);
29【编程】界面 - 皮肤界面(自画窗口标题)(图五)       
30【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)        POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
31【编程】界面 - 皮肤界面(自画窗口标题)(图五)        mn_ButtonPress = HTNOWHERE;
32【编程】界面 - 皮肤界面(自画窗口标题)(图五)
33【编程】界面 - 皮肤界面(自画窗口标题)(图五)        switch( wParam )
34【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)        {
35【编程】界面 - 皮肤界面(自画窗口标题)(图五)        case HTMINBUTTON:
36【编程】界面 - 皮肤界面(自画窗口标题)(图五)        case HTMAXBUTTON:
37【编程】界面 - 皮肤界面(自画窗口标题)(图五)        case HTCLOSE:
38【编程】界面 - 皮肤界面(自画窗口标题)(图五)        case HTHELP:
39【编程】界面 - 皮肤界面(自画窗口标题)(图五)            mn_ButtonPress  = wParam;
40【编程】界面 - 皮肤界面(自画窗口标题)(图五)            mb_OnPressed    = TRUE;
41【编程】界面 - 皮肤界面(自画窗口标题)(图五)            bHandled        = TRUE;        // 表示已经处理过了,否则系统会重画按钮且 WM_NC_LBUTTONUP 不会被触发。
42【编程】界面 - 皮肤界面(自画窗口标题)(图五)            pT->doReDrawCaption();
43【编程】界面 - 皮肤界面(自画窗口标题)(图五)            break;
44【编程】界面 - 皮肤界面(自画窗口标题)(图五)        case HTCAPTION:
45【编程】界面 - 皮肤界面(自画窗口标题)(图五)            bHandled = FALSE;    // 继续让系统进行缺省处理
46【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)            {
47【编程】界面 - 皮肤界面(自画窗口标题)(图五)                DWORD nStyle = pT->GetStyle();
48【编程】界面 - 皮肤界面(自画窗口标题)(图五)                if(nStyle & WS_MINIMIZE)
49【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)                {
50【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    return 0; // BUG: Prevents move of iconic window, but fixes Windows freeze
51【编程】界面 - 皮肤界面(自画窗口标题)(图八)                }

52【编程】界面 - 皮肤界面(自画窗口标题)(图五)                else
53【编程】界面 - 皮肤界面(自画窗口标题)(图五)                if(nStyle & WS_MAXIMIZE)
54【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)                {
55【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    // 在系统最大化的时候需要在鼠标按下时重画标题栏
56【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    bHandled = TRUE; // 表示已经处理过了,否则系统会重画按钮。
57【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    // 让系统对 HTCAPTION 进行处理
58【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    pT->DefWindowProc(uMsg, wParam, lParam);
59【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    pT->doReDrawCaption();
60【编程】界面 - 皮肤界面(自画窗口标题)(图八)                }

61【编程】界面 - 皮肤界面(自画窗口标题)(图八)            }

62【编程】界面 - 皮肤界面(自画窗口标题)(图五)            break;
63【编程】界面 - 皮肤界面(自画窗口标题)(图五)        default:
64【编程】界面 - 皮肤界面(自画窗口标题)(图五)            bHandled = FALSE;    // 继续让系统进行缺省处理
65【编程】界面 - 皮肤界面(自画窗口标题)(图五)            break;
66【编程】界面 - 皮肤界面(自画窗口标题)(图八)        }

67【编程】界面 - 皮肤界面(自画窗口标题)(图五)        return 0;
68【编程】界面 - 皮肤界面(自画窗口标题)(图九)    }

69【编程】界面 - 皮肤界面(自画窗口标题)(图二)   
70【编程】界面 - 皮肤界面(自画窗口标题)(图三)【编程】界面 - 皮肤界面(自画窗口标题)(图四)    LRESULT OnNCLButtonUp(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
71【编程】界面 - 皮肤界面(自画窗口标题)(图三)【编程】界面 - 皮肤界面(自画窗口标题)(图四)    {
72【编程】界面 - 皮肤界面(自画窗口标题)(图五)        // wParam 由 OnNcHitTest 返回
73【编程】界面 - 皮肤界面(自画窗口标题)(图五)        T* pT = static_cast<T*>(this);
74【编程】界面 - 皮肤界面(自画窗口标题)(图五)
75【编程】界面 - 皮肤界面(自画窗口标题)(图五)        mb_OnPressed = FALSE;
76【编程】界面 - 皮肤界面(自画窗口标题)(图五)
77【编程】界面 - 皮肤界面(自画窗口标题)(图五)        if(wParam == mn_ButtonPress)
78【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)        {
79【编程】界面 - 皮肤界面(自画窗口标题)(图五)            // 鼠标按下和释放在相同的按钮上
80【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)            POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
81【编程】界面 - 皮肤界面(自画窗口标题)(图五)            switch( wParam )
82【编程】界面 - 皮肤界面(自画窗口标题)(图六)【编程】界面 - 皮肤界面(自画窗口标题)(图七)            {
83【编程】界面 - 皮肤界面(自画窗口标题)(图五)            case HTMINBUTTON:
84【编程】界面 - 皮肤界面(自画窗口标题)(图五)                pT->PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, MAKELPARAM(pt.x, pt.y));
85【编程】界面 - 皮肤界面(自画窗口标题)(图五)                bHandled = TRUE;    // 禁止系统做缺省处理
86【编程】界面 - 皮肤界面(自画窗口标题)(图五)                break;
87【编程】界面 - 皮肤界面(自画窗口标题)(图五)            case HTMAXBUTTON:
88【编程】界面 - 皮肤界面(自画窗口标题)(图五)                mn_ButtonMove = HTNOWHERE;        // 最大画后鼠标位置将改变
89【编程】界面 - 皮肤界面(自画窗口标题)(图五)                if(pT->GetStyle() & WS_MAXIMIZE)
90【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    pT->PostMessage(WM_SYSCOMMAND, SC_RESTORE,  MAKELPARAM(pt.x, pt.y));
91【编程】界面 - 皮肤界面(自画窗口标题)(图五)                else
92【编程】界面 - 皮肤界面(自画窗口标题)(图五)                    pT->PostMessage(WM_SYSCOMMAND, SC_MAXIMIZE, MAKELPARAM(pt.x, pt.y));
93【编程】界面 - 皮肤界面(自画窗口标题)(图五)                bHandled = TRUE;    // 禁止系统做缺省处理
94【编程】界面 - 皮肤界面(自画窗口标题)(图五)                break;
95【编程】界面 - 皮肤界面(自画窗口标题)(图五)            case HTCLOSE:
96【编程】界面 - 皮肤界面(自画窗口标题)(图五)                pT->PostMessage(WM_CLOSE);
97【编程】界面 - 皮肤界面(自画窗口标题)(图五)                bHandled = TRUE;    // 禁止系统做缺省处理
98【编程】界面 - 皮肤界面(自画窗口标题)(图五)                break;
99【编程】界面 - 皮肤界面(自画窗口标题)(图五)            case HTHELP:
100【编程】界面 - 皮肤界面(自画窗口标题)(图五)                pT->PostMessage(WM_HELP);
101【编程】界面 - 皮肤界面(自画窗口标题)(图五)                bHandled = TRUE;    // 禁止系统做缺省处理
102【编程】界面 - 皮肤界面(自画窗口标题)(图五)                break;
103【编程】界面 - 皮肤界面(自画窗口标题)(图五)            case HTSYSMENU:
104【编程】界面 - 皮肤界面(自画窗口标题)(图五)            default:
105【编程】界面 - 皮肤界面(自画窗口标题)(图五)                bHandled = FALSE;    // 让系统进行缺省处理
106【编程】界面 - 皮肤界面(自画窗口标题)(图八)            }

107【编程】界面 - 皮肤界面(自画窗口标题)(图八)        }

108【编程】界面 - 皮肤界面(自画窗口标题)(图五)        mn_ButtonPress = HTNOWHERE;
109【编程】界面 - 皮肤界面(自画窗口标题)(图五)        return 0;
110【编程】界面 - 皮肤界面(自画窗口标题)(图九)    }

111【编程】界面 - 皮肤界面(自画窗口标题)(图二)
112【编程】界面 - 皮肤界面(自画窗口标题)(图三)【编程】界面 - 皮肤界面(自画窗口标题)(图四)    LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
113【编程】界面 - 皮肤界面(自画窗口标题)(图三)【编程】界面 - 皮肤界面(自画窗口标题)(图四)    {
114【编程】界面 - 皮肤界面(自画窗口标题)(图五)        bHandled = FALSE;
115【编程】界面 - 皮肤界面(自画窗口标题)(图五)
116【编程】界面 - 皮肤界面(自画窗口标题)(图五)        mb_OnPressed    = FALSE;
117【编程】界面 - 皮肤界面(自画窗口标题)(图五)        mn_ButtonPress    = HTNOWHERE;
118【编程】界面 - 皮肤界面(自画窗口标题)(图五)
119【编程】界面 - 皮肤界面(自画窗口标题)(图五)        return 0;
120【编程】界面 - 皮肤界面(自画窗口标题)(图九)    }

请保留地址 http://www.qqread.com/data-structure/f939115102.html 更多文章 更多内容请看Java编程开发手册专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章