没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|使用教程|编辑:鲍佳佳|2020-11-26 11:43:16.470|阅读 372 次
概述:MFC 支 持 自 绘 制(owner-draw) 概 念, 自 绘 制 的 控 制 类, 通 过 调 用DrawItem() 函 数 实 现 控 件 的 绘 制, 由 于 控 件 绘 制, 消 息 检 测 和 消 息 比 较 代 码 是 在 控 件 中 实 现 而 不 足 在 拥 有 控 件 的 窗 口 中 实 现, 因 而 叫 自 绘 制。 因 而 通 过 重 载DrawItem(LPDRAWITEMSTRUCT 函 数 来 控 制 控 件 的 外 观 和 行 为, 实 现 控 制 所 需 要 的 参 数, 都 包 含 在LPDRAWITEMSTRUCT 结 构 中。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
Visual c++ 提 供 了 功 能 强 大 的 类 库, 基 本 上 应 用 开 发 的 要 求, 但 对 于 某 些 特 殊 要 求 的 界 面, 如 图 像 兼 文 字 的 按 纽, 列 表 框 中 插 入 图 像, 中 国 式 报 表 等 等, 仍 显 得 力 不 从 心, 因 而 很 有 必 要 创 建 扩 展MFC 类 库, 以 满 足 实 际 开 发 的 需 求。Xtreme Toolkit Pro是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
---- MFC 支 持 自 绘 制(owner-draw) 概 念, 自 绘 制 的 控 制 类, 通 过 调 用DrawItem() 函 数 实 现 控 件 的 绘 制, 由 于 控 件 绘 制, 消 息 检 测 和 消 息 比 较 代 码 是 在 控 件 中 实 现 而 不 足 在 拥 有 控 件 的 窗 口 中 实 现, 因 而 叫 自 绘 制。 因 而 通 过 重 载DrawItem(LPDRAWITEMSTRUCT 函 数 来 控 制 控 件 的 外 观 和 行 为, 实 现 控 制 所 需 要 的 参 数, 都 包 含 在LPDRAWITEMSTRUCT 结 构 中。
---- LPDRAWITEMSTRUCT 结 构:
---- 最 重 要 的 参 数 是itemAction,itemState,hDC,rcItem, 它 们 是 实 现 控 件 外 观 绘 制, 消 息 响 应 所 必 须 的。
---- itemAction: 绘 制 动 作, 有 以 下 几 种 取 值:ODA_DRAWENTIRE,ODA_FOCUS, ODA_SELECT.
---- itemState: 状 态, 有 以 下 几 种 取 值:ODS_CHECKED,ODS_DISABLED,ODS_FOCUS, ODS_GRAYED,ODS_SELECTED,ODS_DEFAULT.
---- hDC: 设 备 环 境 的 句 柄。
---- rcItem: 控 件 外 观 大 小 的 矩 形。
---- 下 面 给 出 一 个 基 于CButton 类 的 图 象Button 类:CMybtn
---- 利 用MFC Wizard 创 建 一 个 新 类CMybtn, 基 类 是CButton
mybtn.h:
class CMybtn : public CButton
{
// Construction
...
public:
virtual void DrawItem
(LPDRAWITEMSTRUCT lpDrawItemStruct);
...
...
public:
void setbitmapid(UINT id);
...
protected:
UINT m_bitmapid;
//图象的按纽id值
...
DECLARE_MESSAGE_MAP()
};
mybtn.cpp
CMybtn::CMybtn()
{
m_bitmapid=0;
//在构造函数中初始化m_bitmaoid
}
void CMybtn::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
HBITMAP hbitmap=NULL;
ASSERT(lpdis!=NULL);
CDC *pdc=CDC::FromHandle(lpdis- >hDC);
//lpdis- >hdc是设备环境的句柄,
fromhandle函数将handle- >指针
CRect r1;
r1.CopyRect(&lpdis- >rcItem);
//得到控件的矩形范围
UINT state=lpdis- >itemState;
//得到控件的状态
if((state & ODS_SELECTED))
pdc- >Draw3dRect(r1,GetSysColor
(COLOR_3DDKSHADOW),
GetSysColor(COLOR_3DHILIGHT));
//selected时,用COLOR_3DDKSHADOW画左上部,
COLOR_HILIGHT画右下部,表现为凹陷
else
pdc- >Draw3dRect(r1,GetSysColor(COLOR_3DHILIGHT),
GetSysColor(COLOR_3DDKSHADOW));
//正常时,用COLOR_3DHILIGHT画左上部,
COLOR_3DDKSHADOW画右下部,表现为突起
// TODO: Add your code to draw the specified item
if(m_bitmapid)
hbitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),
MAKEINTRESOURCE(m_bitmapid),IMAGE_BITMAP,0,0,
LR_DEFAULTCOLOR);
//如有图象,则装载图象,
CString s1;
GetWindowText(s1);
//得到BUTTON的CAPTION
if(!s1.IsEmpty())
{
int mode1=pdc->SetBkMode(TRANSPARENT);
if(!hbitmap)
pdc- >DrawText(s1,r1,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
//如没有图象,则在整个BUTTON范围输出文字
else
{
CRect r2=r1;
r2.DeflateRect(2,2);
CDC memdc;
CBitmap bmp;
CBitmap *oldbitmap;
bmp.Attach(hbitmap);
BITMAP bitmap;
bmp.GetBitmap(&bitmap);
//由BITMAP结构可以得出图象的高,宽
memdc.CreateCompatibleDC(pdc);
oldbitmap=memdc.SelectObject(&bmp);
pdc- >StretchBlt(r2.left,r2.top,r2.Width()/2,
r2.Height(),&memdc,0,0,bitmap.bmWidth,
bitmap.bmHeight,SRCCOPY);
//把图象从内存压缩拷贝到BUTTON范围
memdc.SelectObject(oldbitmap);
bmp.Detach();
CRect r3=r2;
r3.left=r2.left+r2.Width()/2;
pdc- >DrawText(s1,r3,
DT_CENTER|DT_VCENTER|DT_SINGLELINE);
}
}
}
void CMybtn::setbitmapid(UINT id)
{
m_bitmapid=id;
}
---- 利用CMybtn类代码可以在应用系统中实现图象文字按纽,在dialog中加入按纽 (IDC_BUTTON1),(IDC_BUTTON2)设置它们的属性为 owner-draw.
利用resource editor 加入两个图象文件,id值为:IDB_BITMAP1,IDB_BITMAP2。
class CWs3Dlg : public CDialog
{
...
public:
// Dialog Data
//{{AFX_DATA(CWs3Dlg)
enum { IDD = IDD_WS3_DIALOG };
CMybtnm_btn1;
CMybtnm_btn2;
//定义图象按纽
//}}AFX_DATA
...
protected:
virtual void DoDataExchange(CDataExchange* pDX);
// DDX/DDV support
//}}AFX_VIRTUAL
....
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
void CWs3Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CWs3Dlg)
DDX_Control(pDX, IDC_BUTTON2, m_btn2);
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
//}}AFX_DATA_MAP
}
在初始化代码加入:
BOOL CWs3Dlg::OnInitDialog()
{
...
// TODO: Add extra initialization here
m_btn1.setbitmapid(IDB_BITMAP1);
m_btn2.setbitmapid(IDB_BITMAP2);
return TRUE; // return TRUE unless
you set the focus to a control
}
---- 本 文 给 出 了 自 绘 制 类 的 实 现 代 码, 读 者 可 以 利 用 此 思 路 开 发 出 其 他 扩 展 类 库, 丰 富 开 发 资 源。
MFC扩展类库
在平时练习的时候我们可以自己手动进行,但是一旦接受一些项目,应用程序开发等,对界面的要求就会高出许多。这时候就有必要借助这些“半成品”实现界面美化提升效率。这里简单介绍一下,具体可点进去查看每个的详情以及教程,案例!
BCGControlBar
BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库,使您可以创建具有完全自定义选项(功能区、可自定义工具栏、菜单等)以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件,例如图表、日历、网格、编辑器、甘特图和许多其他控件。
BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。可以轻松地集成到你的应用程序中,并为你节省数百个开发和调试时间。(点这下载)
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@ke049m.cn




大型SaaS系统的自动化测试常常受制于界面变化快、结构复杂、加载机制多变等因素。从元素识别到脚本管理,SmartBear TestComplete帮助Salesforce建了可靠的自动化测试体系。
BarTender 标签管理系统,正是帮助企业轻松实现 GS1 标准化标签设计、编码生成与信息联动的强大工具。
Parasoft C/C++test 是一款功能强大的 C/C++ 软件测试工具,集成了静态代码分析、单元测试、集成测试和覆盖率分析等功能,单元测试作为其关键功能之一,为了适配多样化的目标部署环境,C/C++test 设计了灵活的测试结果收集机制。通过Socket通讯方式来收集单元测试结果,从而扩展其测试覆盖范围与应用场景。
Parasoft C/C++test作为一款功能全面的自动化代码质量保障工具,为C/C++开发者提供了静态分析、单元测试和运行时错误检测等核心功能。通过将其与轻量级且广受欢迎的VScode编辑器集成,开发团队可以在熟悉的编码环境中实时获得代码质量反馈,有效提升开发效率与代码可靠性。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@ke049m.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
半岛外围网上直营