- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试根据我的需要自定义 CToolbar
类(MFC 库)(启用对 32 位图标的抗锯齿支持)。
为此,我使用 CToolbar 提供的自定义绘制方法,我在其中绘制自己的图标。
图标呈现良好并且一切正常,直到用户打开自定义对话框 - 他可以在其中选择所需的图标并按他喜欢的方式排列它们(这是 MFC 工具栏的标准自定义对话框)。
问题:在自定义对话框中,为所有按钮绘制相同的图像。
以下是我项目中的代码片段:
void CCustomToolBar::OnCustomDraw (NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTBCUSTOMDRAW lpNMCustomDraw = (LPNMTBCUSTOMDRAW)pNMHDR;
switch (lpNMCustomDraw->nmcd.dwDrawStage)
{
// the Painting loop starts
case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW; // register for items drawing events
//if (m_bAdjusting)SetWindowLong (lpNMCustomDraw->nmcd.hdr.hwndFrom, DWL_MSGRESULT, CDRF_NOTIFYITEMDRAW);
}
break;
// Item (button) is going to be painted, do own drawing
case CDDS_ITEMPREPAINT:
{
CDC DrawDC;
DrawDC.Attach(lpNMCustomDraw->nmcd.hdc);
CToolBarCtrl& ControlBar = GetToolBarCtrl();
CRect btnRect = lpNMCustomDraw->nmcd.rc;
int State = lpNMCustomDraw->nmcd.uItemState; // CDIS_GRAYED | CDIS_CHECKED | CDIS_DEFAULT | CDIS_DISABLED | CDIS_FOCUS | CDIS_GRAYED | CDIS_HOT | CDIS_SELECTED
hugeSizedImages_.SetTransparentColor(afxGlobalData.clrBtnFace);
DrawDC.DrawFrameControl(&btnRect, DFC_BUTTON , DFCS_BUTTONPUSH );
DWORD dwItem = (DWORD)lpNMCustomDraw->nmcd.dwItemSpec;
int btnIndex = 0;
GUARD_IF(m_BitmapIndex.find(dwItem) != m_BitmapIndex.end())
{
btnIndex = m_BitmapIndex[dwItem];
}
CAfxDrawState ds;
hugeSizedImages_.PrepareDrawImage(ds, CSize(48,48));
hugeSizedImages_.Draw(&DrawDC, btnRect.left, btnRect.top, btnIndex);
hugeSizedImages_.EndDrawImage(ds);
DrawDC.Detach();
*pResult = CDRF_SKIPDEFAULT; // No further drawing
//if (m_bAdjusting) SetWindowLong (lpNMCustomDraw->nmcd.hdr.hwndFrom, DWL_MSGRESULT, CDRF_SKIPDEFAULT);
}
break;
default:
*pResult = 0;
}
消息映射:
BEGIN_MESSAGE_MAP ( CCustomToolBar, CToolBarWithHideableButtons )
//{{AFX_MSG_MAP ( CCustomToolBar )
ON_WM_CONTEXTMENU ()
ON_COMMAND ( CM_TOOLBAR_CUSTOMIZE, OnPopupCustomize )
ON_NOTIFY_REFLECT ( TBN_QUERYDELETE, OnQueryDelete )
ON_NOTIFY_REFLECT ( TBN_QUERYINSERT, OnQueryInsert )
ON_NOTIFY_REFLECT ( TBN_GETBUTTONINFO, OnGetButtonInfo )
ON_NOTIFY_REFLECT ( TBN_BEGINADJUST, OnBeginAdjust )
ON_NOTIFY_REFLECT ( TBN_ENDADJUST, OnEndAdjust )
ON_NOTIFY_REFLECT ( TBN_RESET, OnReset )
ON_NOTIFY_REFLECT ( TBN_TOOLBARCHANGE, OnToolBarChange )
ON_NOTIFY_REFLECT ( TBN_INITCUSTOMIZE, OnInitCustomize ) //only with IE 5.0 and
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDraw)
ON_WM_CREATE ()
//}}AFX_MSG_MAP
END_MESSAGE_MAP ()
我已经进行了很多调试,并设法在自定义窗口出现时得到它 - 发送到 CustomDraw 的与要绘制的项目(按钮)相关的信息被遗漏,总是发送零索引。
如果我注释掉 *pResult = CDRF_SKIPDEFAULT;当系统能够根据索引在自定义对话框中绘制图标时(但只有 4 位深度)——因此我认为我在自定义绘制中省略了一些重要的东西。
我已经阅读了 MSDN 和其他与自定义绘制相关的所有可能的文章,但没有提到自定义窗口中图标的问题。
所以如果有人遇到过类似的问题,你能给我一个提示吗?提前致谢!
最佳答案
使用新的 CMFCToolBar...它更简单并且提供了一个简单的可重写的 DrawItem 方法。
关于c++ - CToolbar 自定义对话框中图标的自定义绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22038342/
请告诉我如何在同一个 CToolBar 上添加不同类型的按钮(我需要有按钮和单选按钮)。 最佳答案 您需要使用 CMFCToolbar::ReplaceButton。 您将常规按钮替换为默认的 CMF
我正在尝试根据我的需要自定义 CToolbar 类(MFC 库)(启用对 32 位图标的抗锯齿支持)。 为此,我使用 CToolbar 提供的自定义绘制方法,我在其中绘制自己的图标。 图标呈现良好并且
我正在使用 MFC C++。我使用 CToolBar 我尝试更改默认的 Gripper 样式: if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CH
我已经按照这个问题的步骤进行操作: Higher color depth for MFC toolbar icons? 代码有效。但我还有另一个问题 - 任何禁用的按钮都只是灰色框。一旦它们被启用 -
我的目标是拥有一个 CToolBar 衍生产品,它具有单一控件(CMFCShellTreeCtrl)。 类似于: class CFileTreeBar : public CToolBar 每当它被要求
问题: 将 32 位图标添加到 CToolbar 实例似乎无法正常工作 (图像质量发生变化)。 我在WEB上遇到2类题目,与我的问题相关: 1-st 讲述了如何将 32 位图像添加到 CToolBar
我一直在尝试将工具栏添加到对话框,但当我调用 m_ToolBar.LoadToolBar 时它失败了。 我创建了一个新的工具栏资源并将其命名为 IDR_TOOLBAR1,然后将其添加到代码中 if(!
我找不到所有东西的简单 CToolBar 示例.. 我在资源编辑器中创建了一个工具栏,并像这样在我的代码中加载了该工具栏: toolbar = new CToolBar; toolbar->Creat
我正在尝试将 CImageList 插入到名为 m_wndUtilBar 的 CToolBar 对象中。我使用下面的代码添加所有图像: CImageList imageList; CBitmap bi
我们有一个触摸屏,工具栏太小,无法用我多肉的手指敲击。有没有一种简单的方法可以让我选择使工具栏按钮更大更容易点击? 到目前为止,我已经尝试了一些事情: m_toolbar.SetSizes( CSiz
我有一个用 c++98 编写的应用程序,它在 32 位中运行良好。但在 64 位中它随机开始崩溃。也许在 10 次它不会突然崩溃它连续崩溃 3 次。 此崩溃发生在菜单栏的创建过程中。这个菜单栏是一个继
我正在使用 VS2005 和 MFC。我按照一些在线代码将静态文本添加到工具栏。然而,当样式设置为 TBSTYLE_FLAT 或 (TBSTYLE_FLAT | TBSTYLE_TRANSPARENT
是否可以在 MFC 的 CToolBar 控件上显示带有 alpha channel 的 32 位图像?目前,我的工具栏使用由 Visual Studio 2010 中的“文件名”属性分配给它的 4
我正在开发一个旧的 C++ MFC 应用程序,它使用 CToolbar 作为其工具栏,使用 Visual Studio 2017 进行编译。 当应用程序在运行时按预期在 list 设置(项目/属性/配
我是一名优秀的程序员,十分优秀!