| 上位机MFC扩展编程扩展库目录文件介绍 当前这套教程介绍的是俄罗斯BCGSoft公司的BCGControlBar商业界面库。
 据评估是全球最优秀的MFC界面类库,功能强大,显示丰富。
 教程涉及的源代码仅供参考学习。
 微软高版本的MFC购买此库进行修剪发布,所以熟悉MFC就能很好的使用此界面库。
 可以搜索BCGP下载库的学习版本。
 
 下载扩展库打开目录后,会有很多文件与文件夹,这里对这些文件作一些介绍。
 
 上位机MFC扩展编程扩展库目录文件介绍   1.文件夹:BCGCBPro。
 界面库的源代码,内含库工程的管理文件与头文件,源文件,语言资源文件等等。
 打开工程管理文件可编辑出链接库,动态库等供我们程序使用。
 
 2.文件夹:BCGPAppWizard,BCGPAppWizard7,BCGPAppWizard2005。
 为界面库工程向导文件。
 我们创建工程时可以选择基于MFC中,可以选择基于此界面库的。
 由于此界面库仅为MFC的扩展,所以MFC的知识可以在此界面库内使用。
 向导工程安排在后面章节介绍。
 
 3.文件夹:Bin,Bin64。
 为界面库编译生成的静态库,动态库,例程的32,64位版本的程序。
 
 4.文件夹:Designer。
 为界面,Ribon,工具栏等设计工具。
 
 5. 文件夹:Examples,Samples。
 为界面库自带的例程工程源代码,打开里面的工程管理文件可编译出例程。
 
 6. 文件夹:Graphics。
 为svg格式的图片。
 
 
 MFC扩展库的配制在我们自己工程中配制扩展库,主要就是包含库的头文件,静态库(LIB)文件,
 例如我信MFC扩展库路径为D:\Program Files (x86)\BCGSoft\BCGControlBarPro
 则头文件路径
 D:\Program Files (x86)\BCGSoft\BCGControlBarPro\BCGCBPro
 库文件路径
 D:\Program Files (x86)\BCGSoft\BCGControlBarPro\Bin
 动态库路径
 D:\Program Files (x86)\BCGSoft\BCGControlBarPro\Bin
 
 
 在运行编译好的自己的例程时,还得将用到的库的动态库放在同级目录。
 不然运行时会提示缺少动态库文件。
 如果嫌这样操作麻烦,也可以将库动态库目录设置在系统的路径内:
 
   具体如何添加,每个系统略有不同,可自行百度。
 
 
 MFC扩展库文档工程创建
 
 基于单文档或多文档的工程,工程中对应的类比较多,有视窗,框架,文档类等。
 我们在使用扩展库时也要将这些类更换为库的对应类。
 同样第一步也是包含界面库的头文件,库文件路径。
 2. 工程的stdafx.h文件中包含库头文件#include "BCGCBProInc.h"
 换CWinAppEx为CBCGPWinApp: #define CWinAppEx CBCGPWinApp
 换CFrameWndEx 为CBCGPFrameWnd : #define CFrameWndEx CBCGPFrameWnd
 3.因为不使用MFC自带的控件了,所以一些菜单栏,工具栏,状态栏都要进行替换
 如CStatusBar 的换成对应CBCGPStatusBar
 
 如果嫌麻烦,也可以直接使用库的类向导来创建工程。
 搜索BCGP,可以下载得到我翻译的中文版本的工程向导文件及使用方法。
 
 MFC扩展库界面定制
 建立了基于扩展库的程序后,其界面也可以根据需要进行更改。
 比如界面主题设置,
 工具条的添加定制等。
 
 1.可选择在APP类初始化函数InitInstance中添加代码设置界面主题
 SetVisualTheme(BCGP_VISUAL_THEME_OFFICE_2016_BLACK);
 
 2.添加下载代码打开定制工具栏,菜单栏等
 CBCGPToolbarOptions toolbarOptions;
 toolbarOptions.m_nViewToolbarsMenuEntryID = ID_VIEW_TOOLBAR;
 toolbarOptions.m_nCustomizeCommandID = ID_VIEW_CUSTOMIZE;
 toolbarOptions.m_strCustomizeCommandLabel = _T("Customize...");
 SetToolbarOptions(toolbarOptions);
 
 3.在框架窗口中,更换菜单,工具栏状态栏为界面库对应的类
 CBCGPToolBar          m_wndToolBar;
 CBCGPStatusBar        m_wndStatusBar;
 CBCGPMenuBar m_wndMenuBar;
 
 复制代码CBCGPPopupMenu::SetForceMenuFocus(FALSE);
if (!m_wndMenuBar.Create(this))
{
TRACE0("Failed to create menubar\n");
return -1;      // fail to create
}
m_wndMenuBar.SetBarStyle(m_wndMenuBar.GetBarStyle() | CBRS_SIZE_DYNAMIC);
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0(“failed to create toolbar");
return -1;}
if (!m_wndStatusBar.Create(this))
{
TRACE0(“failed to creat statusbar");
return -1;}
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
EnableDocking(CBRS_ALIGN_ANY);
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMenuBar);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
 
 MFC扩展库界面工程向导使用
 我们创建MFC程序时使用工程向导可以很方便可视化创建工程,定制程序框架功能。
 此扩展库也提供向导功能,这样就不用像前面课程一步步通过代码添加界面功能。
 
 工程向导与MFC的向导基本一致,但多了扩展库自己的一些属性,这些属性的含义可参考如下。
 1.工具栏/菜单界面。
 如果要创建具有“Classic”(基于工具栏/菜单的用户界面)的应用程序,请选择此选项。
 2.高颜色工具栏图像。
 如果选中此项,将使用高颜色(24bpp)位图创建所有工具栏。
 3.基于功能区的接口。
 如果要使用功能区栏创建Office2007/2010样式的应用程序,请选择此选项。
 4.后台视图。
 如果要创建带后台视图的功能区栏,请选中此项。
 5.使用Ribbon Designer。
 如果选中此项,则将使用功能区设计器资源创建项目。否则,功能区栏将在源代码中初始化。
 6.MDI选项卡。
 您的MDI应用程序将使用MDI选项卡创建。如果您的应用程序是SDI,则此选项将被禁用。
 7.MDI选项卡组。
 您的MDI应用程序将使用MDI选项卡组创建。如果您的应用程序是SDI,则此选项将被禁用。
 8.视觉风格。
 选择最初应用于应用程序的视觉主题(如Office2010或Visual Studio 2010)。
 9.添加“应用程序外观”菜单。
 如果您希望允许用户修改应用程序,请选中此选项查看运行时。
 如果应用程序基于工具栏/菜单,则“查看”菜单下将显示“应用程序外观”菜单项。在功能区栏中,“样式”菜单将放置在右侧
 10.可选自定义(“Alt+Drag”)。
 允许在不调用自定义对话框的情况下拖放工具栏/菜单项。
 11.用户定义的工具栏。
 添加在运行时创建自定义工具栏的功能。
 12.用户定义的图像。
 允许将工具栏按钮与用户定义的位图关联。
 13.键盘定制。
 添加到项目键盘快捷键自定义中。
 14.鼠标自定义。
 添加到鼠标事件的项目自定义中。
 15.上下文菜单定制。
 将上下文菜单自定义添加到项目中。
 16.个性化菜单。
 首先显示最近使用过的菜单项。如果不选择此选项,将显示所有菜单项。
 17.用户定义的工具。
 添加在运行时自定义用户定义(通常是外部)工具的功能。
 18.“窗口…”对话框。
 选中此选项是否要将标准的“Windows…”对话框替换为增强型(仅限MDI应用程序)。
 19.静态链接库。
 您的项目将静态链接到bcgcontrolbar库。此选项不能用于评估版本!
 
 高级属性:
 1.快捷方式(“outlook”-样式)栏。如果要添加快捷方式栏,请选中此选项。
 2.嵌入式控制。将使用嵌入控件创建快捷方式栏。
 3.标题栏。如果要添加标题栏,请选中此选项。
 4.停靠工作区栏。添加带有可分离选项卡的工作区栏示例。
 5.对接输出杆。添加输出栏的示例。
 6.对接属性网格。添加Visual Studio样式的属性网格。
 7.启用自动隐藏。为所有停靠窗格启用“自动隐藏窗口”功能。
 8.对接类型。选择控制栏停靠样式。
 您可以选择:
 Visual Studio.net样式Visual Studio 2005/2008/2010/2012/2013/2015样式。
 
 
 
 
 MFC扩展库语言的设置
 MFC扩展库面向全球用户,语言是一个很重要部分。
 界面库里的资源默认是英文。如果要使用其他语言,比如中文,就要额外编译语言资源。
 一样资源也分为静态与动态版。
 这们来看下如何设置
 
 首先是使用库的对应的语言工程编译出动态库。
 我们程序有动态调用扩展库,有静态调用扩展库。
 动态调用时
 1.在app类中添加HINSTANCE m_hinstBCGCBRes;
 
 2.加载语言库与设置
 m_hinstBCGCBRes = LoadLibrary(_T("BCGCBProRes***.dll")); // *** - language
 BCGCBProSetResourceHandle(m_hinstBCGCBRes);
 
 3.退出程序释放资源FreeLibrary(m_hinstBCGCBRes);
 如果我们程序是静态调用扩展库时
 在资源管理器窗口,包含语言资源就好
 #include “L.***\bcgcontrolbar.rc”  ,
 ***为非特定语言,比如中文:#include "L.chs\bcgcontrolbar.rc"
 
 
 4.库工程文件编译时默认使用的是英文的资源管理文件BCGCBPro.rc。
 最简单直接有效的的方法就是使用对应文件文件夹(如中文L.chs)内的资源管理文件替换,
 改名为BCGCBPro.rc,重新编译,这样库内使用的资源就为指定语言了。
 当然,如果程序涉及多语言切换,可使用上面动态切换语言的方法。
 
 MFC扩展库RibbonDesigner简单使用
 当使用Ribon功能时,其外观可以通过工具BCGRibbonDesigner进行设置,
 这里我们来简单看下如何使用这个工具,工具具体操作就不介绍了,下载了库文件后有对应视屏版本。
 BCGRibbonDesigner工具可以编辑现成工程的资源,生成xml文件。
 之后只要在项目工程里简单使用就好。
 比如定义变量
 CBCGPRibbonBar m_wndRibbonBar;
 然后初始化
 if (!m_wndRibbonBar.Create(this))
 {
 return -1;
 }
 if (!m_wndRibbonBar.LoadFromXML(_T("IDR_BCGP_RIBBON_XML")))
 {
 return -1;
 }
 注意字符串IDR_BCGP_RIBBON_XML是库自带的常量。
 
 
 MFC扩展库ToolbarEditor简单使用
 BCGToolbarEditor可以用来编辑工具条资源。
 使用此扩展库创建的文档工程,默认工具条会对应两个图片,
 这样就可以通过这个工具快速编辑
 
 工具条资源的编辑比较简单,在使用这个工具编辑工具条后,我们只要注意控件ID就可以了。
 我们是通过控件ID来添加控件响应函数的。
 
 
 MFC扩展库VisualDesigner简单使用
 BCGVisualDesigner可以快速创建和修改用于MFC应用程序的数字仪表盘和图表。
 它生成描述仪表板和图表元素的布局和属性的XML文件。
 只要需要,XML就可以在运行时加载和处理,以向最终用户呈现交互式数字仪表板和/或图表。
 生成XML文件后,我们可以在工程中定义CBCGPVisualContainerCtrl m_wndContainer;
 将文件导入到工程,文件类型必须定义为BCGP_VISUAL_XML
 然后加入文件ID就好:
 m_wndContainer.GetVisualContainer()->LoadFromXML(IDR_DASHBOARD1);
 
 如上我们准备好了界面后,界面控件还未实现消息响应,我们要注册控件的相关消息处理函数。
 如:
 ON_REGISTERED_MESSAGE(BCGM_ON_GAUGE_FINISH_TRACK, OnTrackKnob)
 可以注册计量表滑动停止消息处理函数OnTrackKnob
 
 上面介绍的为文字版本MFC扩展库使用方法,对应视频教程,复制代码afx_msg LRESULT OnTrackKnob(WPARAM wp, LPARAM lp);
LRESULT CMy4Dlg::OnTrackKnob(WPARAM wp, LPARAM lp)
{
static double dblCount = 0.0;
int nID = (int)wp;
CBCGPVisualContainer* pContainer = m_wndContainer.GetVisualContainer();
ASSERT_VALID(pContainer);
if (nID == 101)// Knob with ID == 101
{
CBCGPGaugeTrackingData* pData = (CBCGPGaugeTrackingData*)lp;
double dblVal = pData->m_Value;
CBCGPCircularGaugeImpl* pGauge1 = DYNAMIC_DOWNCAST(CBCGPCircularGaugeImpl, pContainer->GetByID(1));
ASSERT_VALID(pGauge1);
CBCGPNumericIndicatorImpl* pSubGauge = DYNAMIC_DOWNCAST(CBCGPNumericIndicatorImpl, pGauge1->GetSubGaugeByID(1));
ASSERT_VALID(pSubGauge);
pGauge1->SetValue(dblVal);
pSubGauge->SetValue(dblVal);
CBCGPCircularGaugeImpl* pGauge2 = DYNAMIC_DOWNCAST(CBCGPCircularGaugeImpl, pContainer->GetByID(2));
ASSERT_VALID(pGauge2);
pGauge2->SetValue(100 - dblVal);
CBCGPNumericIndicatorImpl* pGauge3 = DYNAMIC_DOWNCAST(CBCGPNumericIndicatorImpl, pContainer->GetByID(3));
ASSERT_VALID(pGauge3);
dblCount += 0.2;
pGauge3->SetValue(dblCount);
pGauge3->Redraw();
CBCGPColorIndicatorImpl* pLedRed = DYNAMIC_DOWNCAST(CBCGPColorIndicatorImpl, pContainer->GetByID(6));
ASSERT_VALID(pLedRed);
pLedRed->SetOpacity(dblVal < 30.0 ? 1.0 : 0.4);
CBCGPColorIndicatorImpl* pLedYellow = DYNAMIC_DOWNCAST(CBCGPColorIndicatorImpl, pContainer->GetByID(7));
ASSERT_VALID(pLedYellow);
pLedYellow->SetOpacity(dblVal >= 30.0 && dblVal < 60.0 ? 1.0 : 0.4);
if (dblVal >= 30.0 && dblVal < 60.0)
pLedYellow->StartFlashing();
else
pLedYellow->StopFlashing();
CBCGPColorIndicatorImpl* pLedGreen = DYNAMIC_DOWNCAST(CBCGPColorIndicatorImpl, pContainer->GetByID(8));
ASSERT_VALID(pLedGreen);
pLedGreen->SetOpacity(dblVal >= 60.0 ? 1.0 : 0.4);
}
return 0;
}
可以搜索BCGP,找到帖子,会有扩展库,中文工程向导,视频教程供使用。
 
 
 
 
 |