首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用uxtheme.dll的自定义绘图按钮

使用uxtheme.dll的自定义绘图按钮
EN

Stack Overflow用户
提问于 2010-05-04 17:21:39
回答 3查看 2.6K关注 0票数 0

我已经实现了我的自定义按钮,继承自CButton并使用uxtheme.dll (带有BP_PUSHBUTTON的DrawThemeBackground)来绘制它。

一切正常,但我有两个状态(正常和按下),这是相同的热状态。这意味着当用户将光标放在按钮上时,无论按钮状态如何(按下或未按下),都会绘制类似的光标。

这对用户来说有点混乱,我想改变按钮在按下和热状态下的绘制方式。有人知道怎么做吗?

我也考虑过对整个绘图进行自定义,但按钮使用了渐变、边框、阴影等,因此要实现相同的外观和感觉自己绘制所有内容并不容易。有没有办法找到dll的源代码或者知道怎么做?

提前谢谢。

哈维尔

注意:我认为我可以通过使用CMFCButton和覆盖OnDraw方法来实现我想要做的事情。让控件在OnDrawBorder上绘制按钮,然后自己绘制内部按钮。但我需要知道按下时控件是如何绘制内部按钮的。这是一个梯度,我不能猜测它是如何做到的。有谁有线索吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-12 14:35:08

我终于找到了实现我想做的事情的方法。这确实很简单。

我使用两个对DrawThemeBackground的调用。第一个使用PBS_PRESSED,第二个使用状态PBS_HOT。然后,我创建了一个ExcludeClipRect,以避免在按钮的中心绘制。

如下所示:

代码语言:javascript
复制
        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);

当然,这不是全部代码,但我认为这足以说明我的观点。

谢谢。

票数 1
EN

Stack Overflow用户

发布于 2010-05-04 21:52:41

在回答你的第二个问题时,如果你从CMFCButton派生而不是从CButton派生,你可以覆盖OnDraw()OnDrawText()而不是通常的DrawItem()。这样就会绘制默认的按钮背景,然后执行绘制代码。

票数 1
EN

Stack Overflow用户

发布于 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适当地绘制控件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2764120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档