一无所知

世界如此之大,世界又如此之小!我什么都不知,只知我一无所知!

用户操作
[即时聊天] [发私信] [加为好友]
一无所知ID:Caviler
159359次访问,排名480好友0人,关注者1
Caviler的文章
原创 105 篇
翻译 1 篇
转载 6 篇
评论 125 篇
一无所知的公告
主要是技术类文章和新闻
内容按创作共用方式授权
如侵犯了您的权利请告之!
  访问统计 访问统计
我正在看的书和电影:
最近评论
sap99:www.sap99.com/,SAP99资料多多

SAP免费资料下载
http://www.sap99.com

有很多的学习资料,推荐一下,
dotku:VS 2005的风格化如何操作?
wenfh2020:【编程】界面 - 皮肤界面(自画窗口标题) 这个帖子仿佛很久以前的,不知道还有源码没有,可以的话发我一份,谢谢。

我的邮箱:jom@seegle.com
xffice:比Bugtracker更强劲的EIS@xffice

http://www.xffice.com

配置型通用信息管理系统(同一系统可配置出无数应用)
(Easy Infomation System)有以下功能:
1、同一系统中,可容纳多个配置好的EIS应用。
例如:客户管理、员工管理、名片管理、进度管理、公司文档管理……
tuggfox:楼主,代码能发给我一份学习一下吗?
tuggsoft@163.com
文章分类
收藏
相册
超级搞笑
历代地图
趣图欣赏
编程手册
RFC(中文)
RFC(中文)
常用工具
Furl
Messenger
RFC(中文)
万年日历
常用站点
developerWorks
Gmail
Google Groups
Orkut
Wallop
搜索引擎
百科全书
网站历史
技术站点
CodeProject
Eclipse
RIA
我的链接
52Blog
CNDEV Blog
Wallop Blog
个人主页
我的位置
友情链接
社会性软件(RSS)
最新消息
Code Project
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

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

新一篇: 【编程】Web 交互 - AJAX 不是什么新技术 | 旧一篇: 【编程】ICON - 从 DLL/EXE/ICL 中抽取图标(16 Bit ICL 文件的处理)

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

其中最主要的问题有:

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    }

发表于 @ 2005年04月27日 12:07:00|评论(loading...)|编辑

新一篇: 【编程】Web 交互 - AJAX 不是什么新技术 | 旧一篇: 【编程】ICON - 从 DLL/EXE/ICL 中抽取图标(16 Bit ICL 文件的处理)

评论

#从雨 发表于2005-04-28 16:35:00  IP: 202.103.247.*
你的代码旁边的树状结构是怎么得到的!??
#虾米 发表于2005-10-23 20:26:00  IP: 211.100.21.*
我也在做换肤软件的研究,就是不知道怎么画好窗口标题!
您能不能给我发个你的程序原代码?谢谢!!
QQ:308339290 E-mail:wenzhu191@tom.com
#虾米 发表于2005-10-23 20:27:00  IP: 211.100.21.*
我也在做换肤软件的研究,就是不知道怎么画好窗口标题!
您能不能给我发个你的程序原代码?谢谢!!
QQ:308339290 E-mail:wenzhu191@tom.com
#Perry 发表于2006-08-01 15:59:00  IP: 159.226.21.*
以前也写过自绘标题栏的程序,但右键单击时总是有问题,可能还有甚么未公开的消息被发送,后来干脆禁止了右键点击。
不知你这个怎么样
#古月轩 发表于2006-09-26 10:31:00  IP: 218.2.214.*
感觉上好像挺好,能不能发一下源代码。
我的邮箱chenlia2602@sina.com.cn
谢谢!!
#qiurigushi1 发表于2006-12-25 15:35:59  IP: 219.239.226.*
老兄很牛哦。想向你学习。能把你的源代码发给我一下吗?dybyl@sohu.com 。我正在自做一些控件的换肤,做了一部分,可以一起研究研究。
#tuggfox 发表于2007-09-28 17:19:52  IP: 210.51.244.*
楼主,代码能发给我一份学习一下吗?
tuggsoft@163.com
#wenfh2020 发表于2008-03-24 18:21:02  IP: 202.105.138.*
【编程】界面 - 皮肤界面(自画窗口标题) 这个帖子仿佛很久以前的,不知道还有源码没有,可以的话发我一份,谢谢。

我的邮箱:jom@seegle.com
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 一无所知