如何在应用程序中添加BCGControlBar的Ribbon控件

如何在应用程序中添加BCGControlBar的Ribbon控件,第1张

本文分步介绍了如何在应用程序中添加BCGControlBar的Ribbon控件,并且附源码。

1、打开MainFrme.h,移除CBCGPMenuBar、 m_wndMenuBar、CBCGPToolBar、 m_wndToolBar。

2、对Ribbon Bar和主要的 Ribbon Button添加自定义。

1

2

CBCGPRibbonBar m_wndRibbonBar

CBCGPRibbonMainButton m_MainButton

3、添加定义面板图像列表。

1

CBCGPToolBarImages m_PanelIcons

4、打开MainFrm.cpp,移除m_wndMenuBar 和m_wndToolBar有关的东西。

5、对源添加一个Ribbon Main Button(IDB_MAIN)26X26像素的位图,小图标(16像素高度)的位图列表以及大图标(32像素高度)位图列表,并将他们命名为IDB_SMALL_ICONS和IDB_LARGE_ICONS respectively。

6、在CMainFrame::OnCreate中创建Ribbon Bar:

1

m_wndRibbonBar.Create (this)

7、初始化和设置主要的Ribbon Button:

1

2

3

4

m_MainButton.SetMenu (IDR_FILE_MENU)

m_MainButton.SetImage (IDB_MAIN)

m_MainButton.SetToolTipText (_T("File"))

m_wndRibbonBar.SetMainButton (&m_MainButton, CSize (45, 45))

8、初始化和加载面板图标的图像列表。

1

2

m_PanelIcons.SetImageSize (CSize (16, 16))

m_PanelIcons.Load (IDB_PANEL_ICONS)

9、添加第一类:

1

2

3

4

CBCGPRibbonCategory* pCategory = m_wndRibbonBar.AddCategory

(_T("&Write"), // Category name

IDB_WRITE, // Category small images (16 x 16)

IDB_WRITE_LARGE) // Category large images (32 x 32)

10、添加第一个面板到这个类别:

1

2

3

CBCGPRibbonPanel* pPanel = pCategory->AddPanel (

_T("Clipboard"), // Panel name

m_PanelIcons.ExtractIcon (0)) // Panel icon

11、添加ribbon元素到面板:

1

2

3

4

5

6

7

8

9

10

11

12

// Create the first button to Panel ("Paste"):

CBCGPRibbonButton* pPasteButton = new CBCGPRibbonButton (ID_EDIT_PASTE, _T("Paste"), -1, 0)

// The third parameter (-1) tells that this button does not have a small icon.

// Therefore the "Paste" button will be always displayed with large icon.

// Associate a popup menu with the "Paste" button:

pPasteButton->SetMenu (IDR_CONTEXT_MENU)

// Add other buttons to the panel. These buttons have small icons only:

pPanel->Add (new CBCGPRibbonButton (ID_EDIT_CUT, _T("Cut"), 1))

pPanel->Add (new CBCGPRibbonButton (ID_EDIT_COPY, _T("Copy"), 2))

pPanel->Add (new CBCGPRibbonButton (ID_EDIT_PAINT, _T("Paint"), 9))

把 xmlns:ribbon="clr-namespace:DNBSoft.WPF.RibbonControl" 改为

xmlns:r="clr-namespace:DNBSoft.WPF.RibbonControl" 就一致了

Ribbon是客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用

负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个 *** 作单元上进行运行,从而协同完成工作任务。 负载均衡构建在原有网络结构之上,它提供了一种透明且廉价有效的方法扩展服务器和网络设备的带宽、加强网络数据处理能力、增加吞吐量、提高网络的可用性和灵活性

本文主要测试,在Springcloud + nacos + gateway基础上,如何实现负载平衡

前面我们已经整合了Springcloud + nacos + gateway,实现了,当启动3个provider时候,通过gateway,可以对该3个provider进行轮询

1 nocas负载均衡。

   a nocas本身已集成了ribbon,默认使用轮询的方式

   b 在nocas设置weight,实现权重的方式

   c 自定rule(IRule实现类)

   d 顺提,在权重的方式下,可使用先设置权重为0,再关闭单一服务的方式,优雅地下线服务

2 使用ribbon直连ip

   a 使用ribbon提供的自动策略,轮询,随机等

   b 健康检查

   v 自定义rule

关掉其中一个provider,立即通过gateway进行轮询,发现gateway仍然会call已经down掉的provider,导致查询失败。但在大约5秒后,轮询恢复正常,不再call已经prodiver.

gateway call provider首先经nacos注册中心,nacos心跳机制默认每5秒钟检查一次provider是否正常,因此就会出现上面现象。

1 在启动类,将配置类 将IRule 的实现类注册到spring容器中即可

2 分别测试轮询和随机,可正常按规则负载

1 增加gatewayriboonip模块

2 pom添加依赖spring-cloud-starter-gateway和spring-cloud-starter-netflix-ribbon

3 修改application.yml,设置负载均衡

4 启动,测试可正常进行轮询

5 修改application.yml 如下,可测试到从轮询方式变成了随机的方式

   NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

这个时候down掉一个provider,然后轮询,到这个provider时候,会一直查询失败。我们需要增加一个健康检查处理,在服务down掉的时候,可感知到并将该服务从服务列表去除,在服务上线后,可检查到服务已上线

1 增加健康检查

   provider模块增加rest接口HealthController

   增加config类,产生RestTemplate

   增加健康检查类HealthExamination implements IPing。继承IPing接口,判断服务是否可用。我们在微服务中增加heath接口,在gateway中调用该接口,如果返回正常则认为微服务可用。

    修改application.yml 增加Ping如下

          NFLoadBalancerPingClassName: com.roy.springnacos.gatewayribbonip.loadBalance.HealthExamination

2 重启provider和gateway,进行测试

   a 轮询成功

   b down掉其中一个provider,轮询到该provider时候,查询失败

    这里测试未能成功,使用RoundRobinRule还是一直出现查询失败,未能自动skip掉down掉的provider

   但是自定义LoadBalancerRule的话,是能够成功skip掉down掉的provide的

1 增加MyRule extends AbstractLoadBalancerRule

2 重启后,测试成功按规则查询


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/7978040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存