读书人

MFC自绘控件学习总结第二贴 100分奉下

发布时间: 2012-12-31 11:57:52 作者: rapoo

MFC自绘控件学习总结第二贴 100分奉上,欢迎拍砖。
为什么我不让一次给300分!!!!!!$^&*$&^*$

正题:首先感谢大家对第一帖的支持,应一些网友烈要求下面我在添加关于上一贴的一些补充和说明(老鸟可以无视)
这一贴是实战+理论不知道第一帖的先看第一帖:

1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意。可以在这里改变控件的大小,位置,窗口样式

,字体 ,等等.....你能想到的能改的,都可以在这里改.

2).关于Edit的补充说明:我最初的自绘方法是利用 WM_NCPAINT 里面处理的非客户区只是自己画了边界,以实现Hover和Leave不同的边界。不过我后来发现由于非客户区太小了边界也就2像素,如果

鼠标移动很快有时 系统不能检测到鼠标当前的状态,所以程序里面的Edit是在OnPaint里面做的绘制,不过有个核心API -Default() 下面看代码
void CEditEx::OnPaint()
{

Default(); // 关键

if(!m_bHover)
DrawBoder(); // 画自己的边界

},这才是程序里面的自绘Edit使用的方法.

3).对于控件的Hover和Leave效果,简单的说 Hover就是鼠标现在浮于控件上面,Leave就是鼠标离开了控件,那么这个效果要怎么实现呢?我直接给源码吧
以Edit控件为列
头文件中加入

afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
CPP中加入:
BEGIN_MESSAGE_MAP(CEditEx, CEdit)
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
注:ON_WM_MOUSEMOVE() 可以用类向导添加,不过OnMouseLeave,和OnMouseHover是需要手动添加的

然后再CPP中定义:
void CEditEx::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bHover)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bHover= _TrackMouseEvent(&tme);// m_bHover: BOOL型成员变量

}

CEdit::OnMouseMove(nFlags, point);
}
LRESULT CEditEx::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_bHover = false;
//
做相应的操作
//
return 0;
}
LRESULT CEditEx::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
//
做相应的操作
//
return 0;
}
绝大多数控件可以用这种方法,不过某些控件,可能需要你在OnMouseMove里面完全模拟出 Hover和Leave的情况,比如程序里面的TabCtrl...


4).我把以前我看过的帖子整理了下供大家学习参考(由于时间久了,很多帖子都忘记了):

进度条自绘:http://www.codeproject.com/KB/miscctrl/cprogressctrlst.aspx(有项目源码)

透明控件(多个控件)实现:http://www.codeguru.com/cpp/controls/buttonctrl/advancedbuttons/article.php/c15603/General-Solution-for-a-Transparent-Control.htm(有项目源码)

透明窗体:http://msdn.microsoft.com/en-us/library/ms997507(Menu、窗体、Combobox 都可以参考这种方式实现任意透明度,我也是参考这种方法)

不规则按钮实现:http://www.codeguru.com/cpp/controls/buttonctrl/non-rectangularbuttons/article.php/c2085/Universal-Button---beauty-of-HRGN.htm

自绘按钮2篇帖子:
http://www.vckbase.com/document/viewdoc/?id=551
http://www.vckbase.com/document/viewdoc/?id=561

Custom draw 和 Owner draw 的区别(是全英文,不过要是读懂了对你自绘的思想很有帮助,有时间帮大家翻译下):
http://blog.csdn.net/xiexievv/article/details/6279219

WM_DRAWITEM与DrawItem()的讨论,对控件自绘很有帮助:
http://blog.csdn.net/xiexievv/article/details/6259194

下面这几篇帖子仔细阅读定有意想不到的收获,不只是自绘控件,完全可以让我们对MFC的整体认识都会提升1个等级
MFC中OnDraw与OnPaint的区别:
http://blog.csdn.net/xiexievv/article/details/6271153

深度剖析消息反射机制:
http://blog.csdn.net/xiexievv/article/details/6282205

PreTranslateMessage和TranslateMessage区别:
http://blog.csdn.net/xiexievv/article/details/6299027

WindowProc和DefWindowProc的区别:
http://blog.csdn.net/xiexievv/article/details/6299016

CWnd中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别:
http://blog.csdn.net/xiexievv/article/details/6233423



同时推荐几个很好的学习网站:
http://www.codeproject.com(英文)
http://www.codeguru.com(英文)
http://www.pudn.com
http://www.vckbase.com/document/index.asp
http://www.hackchina.com

就写这么多吧,个人觉得最有用的资料还是MSDN当然还有强大CSDN,每个控件的自绘都不是固定有规律可循的,不要硬搬乱套,要活学活用。也许你现在才开始学,完全看不懂,没关系大家都是那么过来的啦。








[解决办法]
从来不自己写自绘控件的强烈的漂过。。。。。。
[解决办法]
因为我不会自己写,从来都是用抄的......MFC自绘控件学习总结第二贴 100分奉下,欢迎拍砖
[解决办法]
up~
[解决办法]
????????????????
[解决办法]
好贴!!!!! 好贴!!!!! 好贴!!!!! 好贴!!!!!
[解决办法]
给我一个理由,?
[解决办法]
学习。
[解决办法]
楼主 开源吧 觉得你写的UI不错
[解决办法]
学习,控件有时候自己写感觉自己控制一切。
[解决办法]
菜鸟路过。。。。。。
[解决办法]
学习了!!!!
[解决办法]
谢谢分享。
[解决办法]


[解决办法]
好好好
[解决办法]
强烈支持吧,哪里敢拍砖
[解决办法]
顶分享帖
[解决办法]
接分啦。
[解决办法]
呵中\!
[解决办法]
第二看
[解决办法]



MFC自绘控件学习总结第二贴 100分奉下,欢迎拍砖


[解决办法]
再接再厉
[解决办法]
谢谢分享,学习了!!!
[解决办法]
学习自绘,牛贴
[解决办法]
楼主给的只是执行程序。。。
[解决办法]
菜鸟路过。。。。。。
[解决办法]
对界面库的态度从来都不是重点,我认为对于未来的程序世界,前台界面库会跟WEB一样,
上升到美工范畴,也就是不是程序员控制的范畴,因为程序员很少兼具美术功底,楼主作为
学生做这个能有些心得已是不容易了,但工作后你就知道,对于多数软件公司来讲,界面往往只是
一件衣服,核心永远不可能在这里。你的这点界面心得找工作的话加分并不多,至少如果我是
你面试官的话,提这个的意义跟不提没区别。


[解决办法]
值得学习
------解决方案--------------------


学习了~MFC自绘控件学习总结第二贴 100分奉下,欢迎拍砖
[解决办法]
支持一下
[解决办法]
支持下
[解决办法]
楼主把你的代码当个什么宝,一个学习的代码还藏藏捏捏.
[解决办法]
力顶楼主,不过不要在界面上浪费太多 时间。用界面库好一些!
[解决办法]
支持!支持!
[解决办法]
支持你一下 有你更精彩
[解决办法]
继续顶!
[解决办法]

[解决办法]
好贴子啊
[解决办法]
一直自绘 从未被超越,,,,lugo 这帖还行 学MFC 必须看
[解决办法]
菜鸟表示,看都看不懂
[解决办法]
虽然MFC很挫 但是其核心的逻辑还是可以学习的

[解决办法]

引用:
对界面库的态度从来都不是重点,我认为对于未来的程序世界,前台界面库会跟WEB一样,
上升到美工范畴,也就是不是程序员控制的范畴,因为程序员很少兼具美术功底,楼主作为
学生做这个能有些心得已是不容易了,但工作后你就知道,对于多数软件公司来讲,界面往往只是
一件衣服,核心永远不可能在这里。你的这点界面心得找工作的话加分并不多,至少如果我是
你面试官的话,提这个的意义跟不提没区别。

如果我是面试官的话,提这个的意义很大,这绝对说明了楼主的学习能力、解决问题的能力和对API的理解能力。
[解决办法]
mark
[解决办法]
另外,考虑到目前业界对用户体验的变态追求。未来界面库必须由美工和程序员共同完成,就象airplay,据说界面占了他们30%的工作量(来源:http://www.iplaysoft.com/airplay-interview.html)。
[解决办法]
学习一下,强人啊!
[解决办法]
引用:
对界面库的态度从来都不是重点,我认为对于未来的程序世界,前台界面库会跟WEB一样,
上升到美工范畴,也就是不是程序员控制的范畴,因为程序员很少兼具美术功底,楼主作为
学生做这个能有些心得已是不容易了,但工作后你就知道,对于多数软件公司来讲,界面往往只是
一件衣服,核心永远不可能在这里。你的这点界面心得找工作的话加分并不多,至少如果我是
你面试官的话,提这个的意义跟不提没区别。

非也!非也!

同意你前半段的说法,界面工作虽然很重要,但对于多数软件公司来讲,并不是核心价值。

但如果是面试的话,楼主的这个帖子绝对是应该加很多分的,这其中所表现出的钻研精神、分析能力、实践能力、表达能力,都是面试官应该非常看重的因素。
[解决办法]
很好很好,值得学习
[解决办法]
楼主善哉善哉啊!
------解决方案--------------------


学习学习
[解决办法]
楼主牛逼
[解决办法]
楼主牛逼
[解决办法]
学习~路过
[解决办法]
支持一下,非常好的文章
[解决办法]
支持楼主。
现在不自绘控件,界面实在没法拿出去用了
[解决办法]

不错的东西。
[解决办法]
学习学习
[解决办法]
支持楼主
[解决办法]
楼主强悍!
[解决办法]
刚好需要学控件,实在太好了~~~
[解决办法]
学习了,ts
[解决办法]
学习了,楼主能不能帮我看看我这个帖子,编MFC记事本遇到的问题

http://topic.csdn.net/u/20110712/15/e46cd91e-1304-4bc3-b325-209f19c0a12f.html
[解决办法]
请问下浮动菜单是如何做的.
[解决办法]
UP!upup
[解决办法]
楼主,你牛逼啊,非常佩服,我现在也在弄MFC界面,能把你的源代码给我下不,急盼啊! hzau0302@qq.com 我可以帮你推荐下实习。
[解决办法]
学习了。
[解决办法]
谢谢分享,学习了!!!
[解决办法]
期待第三弹!
[解决办法]
我顶一个,尽管我会了。

当初没有接触Win32编程,直接上MFC,那时真TMD无奈啊。有心无力。。。还好现在通了
[解决办法]
强烈建议公开源码!供学习....
[解决办法]

引用:
引用:
期待第三弹!


呵呵,被你说中了,我这才给大家200分呢,我不是说过要给大家300分嘛。


学习了,另外多给我点分哦~~~~
[解决办法]
我现在正在学界面设计 楼主能否把源码给我 谢谢 邮箱wuqi0440410301@126.com
[解决办法]
学习了
[解决办法]
学习了
[解决办法]
来过,主要为了分分。
[解决办法]
昨天收藏了楼主第一帖,今天收藏第二贴,马克,学习。。。
[解决办法]
学习中~~!~……

读书人网 >VC/MFC

热点推荐