mfc绘图控件,mfc绘图教程
首先感谢大家对第一帖的支持。应部分网友的强烈要求,这里对上一篇帖子做一些补充和说明(老鸟可以忽略)。
本帖是给不知道实战理论第一帖的人看的。先看第一篇帖子:
http://topic . . net/u/2011 07 10/19/5209 f358-31 c8-4057-b108-02155 a 417 FD 0 . html
1).添加一个高级重载函数PreSubclassWindow()。我的理解是允许用户在子类化之前做一些额外的处理。这个重载函数也非常重要,应该引起足够的重视。您可以更改大小、位置、窗口样式、字体等。这里的控制.你能想到的任何东西都可以在这里改变。
2).关于Edit的补充说明:我最初的自绘方法是利用WM_NCPAINT中处理的非客户区自行绘制边界,从而实现悬停和离开的不同边界。但是我后来发现非客户端区域的边界只有2个像素,因为太小了。如果鼠标快速移动,有时系统无法检测到鼠标的当前状态,所以程序中的编辑是在OnPaint中绘制的,但是有一个核心API——Default()。参见下面的代码。
void CEditEx:OnPaint()
{
默认();//键
如果(!m_bHover)
draw boder();//划清自己的界限
},这是程序中自绘编辑使用的方法。
3).对于控件的悬停和离开效果,简单来说,悬停是指鼠标现在悬浮在控件上,离开是指鼠标离开控件。那么如何才能达到这种效果呢?我直接给出源代码。
以编辑控件为列
添加到头文件。
afx _ msg void OnMouseMove(UINT nFlags,c point 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)
{
如果(!m_bHover)
{
TRACKMOUSEEVENT tme
tme . CB size=sizeof(tme);
tme.hwndTrack=m _ hWnd
tme . dw flags=TME _离开 TME _哈弗;
tme . dwhover time=1;
m _ BH over=_ track mouse event(tme);//m _ BH over:bool类型的成员变量
}
CEdit:OnMouseMove(nFlags,point);
}
LRESULT CEditEx:OnMouseLeave(WPARAM WPARAM,LPARAM lParam)
{
m _ bHover=false
//
做相应的操作。
//
返回0;
}
LRESULT CEditEx:OnMouseHover(WPARAM WPARAM,LPARAM lParam)
{
//
做相应的操作。
//
返回0;
}
大多数控件都可以使用这种方法,但是有些控件可能需要你在OnMouseMove中完全模拟悬停和离开,比如程序中的TabCtrl。
4).我把之前看过的帖子整理了一下,供大家参考(很多帖子由于时间太久已经忘记了):
自画进度条:http://www.codeproject.com/kb/miscctrl/cprogresstrlst.aspx(附项目源代码)
透明控件(多控件)实现:http://www.codeguru.com/CPP/controls/buttonctrl/advanced按钮/article . PHP/c 15603/general-solution-for-a-transparent-control . htm(附项目源代码)
透明窗体:3358msdn.microsoft.com/en-us/library/ms997507(菜单、窗体、Combobox都可以引用这个方法实现任何透明,我也引用这个方法)
不规则按钮的实现:http://www.codeguru.com/CPP/controls/buttonctrl/non-rectangular按钮/article . PHP/c 2085/universal-button-beauty-of-hrgn . htm
自画按钮2贴:
http://www.vckbase.com/document/viewdoc/?id=551
http://www.vckbase.com/document/viewdoc/?id=561
自定义绘制和业主绘制的区别(都是英文的,但是如果你看了,对你画出自己的想法很有帮助,有时间可以翻译给我们看):
http://blog..net/xiexievv/article/details/6279219
WM_DRAWITEM和DRAWITEM()的讨论对控制自绘很有帮助:
http://blog..net/xiexievv/article/details/6259194
仔细阅读下面的帖子会有意想不到的收获,不仅仅是自画控件,我们对MFC的整体理解也会提升一个层次。
MFC中OnDraw和OnPaint的区别:
http://blog..net/xiexievv/article/details/6271153
深层消息反射机制分析:
http://blog..net/xiexievv/article/details/6282205
预传输消息和翻译信息区别:
http://blog..net/xiexievv/article/details/6299027
窗口进程和执行内定的消息处理的区别:
http://blog..net/xiexievv/article/details/6299016
拥塞窗口中PreCreateWindow、PreSubclassWindow、SubclassWindow的区别:
http://blog..net/xiexievv/article/details/6233423
同时推荐几个很好的学习网站:
http://www.codeproject.com(英文)
http://www.codeguru.com(英文)
http://www.pudn.com
http://www.vckbase.com/document/index.asp
就写这么多吧,个人觉得最有用的资料还是微软官方当然还有强大CSDN,每个控件的自绘都不是固定有规律可循的,不要硬搬乱套,要活学活用。也许你现在才开始学,完全看不懂,没关系大家都是那么过来的啦。
来自:http://博客。。net/xiexiyvv/article/details/6598696
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。