我已经实现了我的自定义按钮,继承自CButton并使用uxtheme.dll (带有BP_PUSHBUTTON的DrawThemeBackground)来绘制它。
一切正常,但我有两个状态(正常和按下),这是相同的热状态。这意味着当用户将光标放在按钮上时,无论按钮状态如何(按下或未按下),都会绘制类似的光标。
这对用户来说有点混乱,我想改变按钮在按下和热状态下的绘制方式。有人知道怎么做吗?
我也考虑过对整个绘图进行自定义,但按钮使用了渐变、边框、阴影等,因此要实现相同的外观和感觉自己绘制所有内容并不容易。有没有办法找到dll的源代码或者知道怎么做?
提前谢谢。
哈维尔
注意:我认为我可以通过使用CMFCButton和覆盖OnDraw方法来实现我想要做的事情。让控件在OnDrawBorder上绘制按钮,然后自己绘制内部按钮。但我需要知道按下时控件是如何绘制内部按钮的。这是一个梯度,我不能猜测它是如何做到的。有谁有线索吗?
发布于 2010-05-12 14:35:08
我终于找到了实现我想做的事情的方法。这确实很简单。
我使用两个对DrawThemeBackground的调用。第一个使用PBS_PRESSED,第二个使用状态PBS_HOT。然后,我创建了一个ExcludeClipRect,以避免在按钮的中心绘制。
如下所示:
DrawThemeBackground( hTheme,
pCustomDraw->hdc,
BP_PUSHBUTTON,
PBS_PRESSED,
&pCustomDraw->rc,
NULL);
CDC *pDC = CDC::FromHandle(pCustomDraw->hdc);
CRect rectClient;
GetClientRect(rectClient);
CRect rectInternal = rectClient;
rectInternal.DeflateRect(4,4);
pDC->SelectClipRgn(NULL);
pDC->ExcludeClipRect(&rectInternal);
DrawThemeBackground( hTheme,
pCustomDraw->hdc,
BP_PUSHBUTTON,
PBS_HOT,
&pCustomDraw->rc,
NULL);
pDC->SelectClipRgn(NULL);当然,这不是全部代码,但我认为这足以说明我的观点。
谢谢。
发布于 2010-05-04 21:52:41
在回答你的第二个问题时,如果你从CMFCButton派生而不是从CButton派生,你可以覆盖OnDraw()或OnDrawText()而不是通常的DrawItem()。这样就会绘制默认的按钮背景,然后执行绘制代码。
发布于 2010-05-11 23:19:12
据我所知,真正解决这个问题的唯一方法是使用“自定义绘制”,而不是“所有者绘制”。自定义绘图是随Windows2000一起引入的,但仅供MFC6.0(因此Windows XP更高版本)的按钮控件使用,没有非常清晰的文档记录,也不是comctrl32特意支持的东西。
无论如何,自定义绘图的好处是,它可以让你在绘图过程中的不同点上钩住,而不像所有者绘图,它让你处理整个事情。在MSDN中查看NM_CUSTOMDRAW通知消息。
对于问题的另一部分,检测“热”状态,最简单的方法是使用WM_MOUSEMOVE消息和TrackMouseEvent()函数来跟踪鼠标是否在按钮上。
不幸的是,这是一个有点模糊的答案:演示使用自定义绘制的按钮所需的代码量太多了,无法在这些答案框中键入!我确实有一个项目演示了这些技术,使用了一个自定义的绘图按钮(在旧的Windows版本中回退到owner draw ),该按钮添加了一个小箭头。你可以通过下面的命令来查看源代码
Windows_UI_source.zip
打开它,看看"DropArrowButton“类。重要的一点是OnCustomDraw()处理程序及其辅助函数DrawControl():在各个按钮绘制阶段都会调用这些函数,并使用UxTheme适当地绘制控件。
https://stackoverflow.com/questions/2764120
复制相似问题