返回首页

{A}
CodeProject上的文章系列是基于一系列我首先对我的公布的职位。
在这篇文章中,我们将回顾色带框架的图像术语,看看如何在您的WinForms应用程序设置的静态和动态图像。
MSDN上的更多细节,可以发现在。大图像与小图片
许多ribbon控件允许您指定的图像。例如:按钮,组合框和微调。
这些控件有两个属性,一个大的图像和小。功能区的框架将这些大小选择之一,根据屏幕的可用空间和组缩放您的定义。
大图通常是32x32像素的小图片大小通常大小为16x16像素。
我说通常,因为这可以改变。实际图像大小应取决于你所选择的分辨率和DPI设置。微软推荐的图像尺寸如下:新闻部小图片大图96 DPI16x16像素32x32像素120 DPI20X20像素40X40像素 144 DPI24x24像素48x48像素192 DPI 32x32像素64x64像素
色带控制的图像通过LargeImage和SmallImage属性暴露。高对比度模式
高对比度是有视力障碍的人设计的Windows辅助功能。可以打开/关闭按下左ALT左SHIFT PRINT SCREEN。
模式的主要作用是改变系统颜色,使附近的颜色有高对比度。
现在,以支持在您的应用程序的高对比度模式,色带框架暴露了两个额外的属性:LargeHighContrastImage和SmallHighContrastImage允许您设置这种模式下的图像。下面是一个如何应用程序通常是在高对比度模式的例子:
图像静态
所以我们已经提到,我们有4图像属性:LargeImage,SmallImage,LargeHighContrastImage和SmallHighContrastImage。图像的大小取决于当前的系统设置。因此,我们需要一种方法来提供这些方案的应用程序不同的图像。那就是:

<Command Name="cmdCut" Id="1008" LabelTitle="Cut">

  <Command.LargeImages>

    <Image Source="res/CutLargeImage32.bmp" MinDPI="96" />

    <Image Source="res/CutLargeImage40.bmp" MinDPI="120" />

    <Image Source="res/CutLargeImage48.bmp" MinDPI="144" />

    <Image Source="res/CutLargeImage64.bmp" MinDPI="192" />

  </Command.LargeImages>

  <Command.SmallImages>

    <Image Source="res/CutSmallImage16.bmp" MinDPI="96" />

    <Image Source="res/CutSmallImage20.bmp" MinDPI="120" />

    <Image Source="res/CutSmallImage24.bmp" MinDPI="144" />

    <Image Source="res/CutSmallImage32.bmp" MinDPI="192" />

  </Command.SmallImages>

  <Command.LargeHighContrastImages>

    <Image Source="res/CutLargeImage32HC.bmp" MinDPI="96" />

    <Image Source="res/CutLargeImage40HC.bmp" MinDPI="120" />

    <Image Source="res/CutLargeImage48HC.bmp" MinDPI="144" />

    <Image Source="res/CutLargeImage64HC.bmp" MinDPI="192" />

  </Command.LargeHighContrastImages>

  <Command.SmallHighContrastImages>

    <Image Source="res/CutSmallImage16HC.bmp" MinDPI="96" />

    <Image Source="res/CutSmallImage20HC.bmp" MinDPI="120" />

    <Image Source="res/CutSmallImage24HC.bmp" MinDPI="144" />

    <Image Source="res/CutSmallImage32HC.bmp" MinDPI="192" />

  </Command.SmallHighContrastImages>

</Command>

如果不指定所有这些图像,色带框架将使用可用的图像,并根据自己的需要调整它们的大小。当然,提供的图像,自己的方式来获得最好的结果。动态设置图片
在本节中,我们将看到如何动态设置一个按钮的图像。最终的结果会是这样的:
{A5}
这不利于图像的时间,你需要运行它自己在工作中看到的代码。
"交换一次吗??按钮演示编程设置LargeImage财产,最简单的方法。
"交换图像??按钮演示如何设置的图像,根据建议的大小。
我添加了一个RibbonLib.Ribbon类的新功能,名为ConvertToUIImage。这里是你如何使用它:{C}
如果你想设置的图像具有正确的大小,根据当前的DPI设置,以避免从调整你的形象色带框架,你应该检查SystemInformation.IconSize.Width价值。
大型图片大小应(SystemInformation.IconSize.Width x SystemInformation.IconSize.Width)和小的图像尺寸应(SystemInformation.IconSize.Width / 2)×(SystemInformation.IconSize.Width / 2)。
在这里设置的图像,根据Windows设置的一个例子:
void _buttonDropB_OnExecute(PropertyKeyRef key, 

	PropVariantRef currentValue, IUISimplePropertySet commandExecutionProperties)

 {

     List<int> supportedImageSizes = new List<int>() { 32, 48, 64 };



     Bitmap bitmap;

     StringBuilder bitmapFileName = new StringBuilder();



     int selectedImageSize;

     if (supportedImageSizes.Contains(SystemInformation.IconSize.Width))

     { 

         selectedImageSize = SystemInformation.IconSize.Width;

     }

     else

     {

         selectedImageSize = 32;

     }



     exitOn = !exitOn;

     string exitStatus = exitOn ? "on" : "off";



     bitmapFileName.AppendFormat(@"..\..\Res\Exit{0}{1}.bmp", 

				exitStatus, selectedImageSize);



     bitmap = new System.Drawing.Bitmap(bitmapFileName.ToString());

     bitmap.MakeTransparent();



     _buttonDropB.LargeImage = _ribbon.ConvertToUIImage(bitmap);

 }
幕后
ConvertToUIImage方法实际上是创建一个名为UIRibbonImageFromBitmapFactory,实现IUIImageFromBitmap色带框架的COM对象的实例。这个接口提供了一个包装作为一个IUIImage接口给定的HBITMAP(位图处理)的功能。
带状图像属性工作IUIImage这些实例。请注意,实际创造的UIRibbonImageFromBitmapFactory RibbonLib.Ribbon InitFramework方法。 奖金
我的助手类的实施{A6} ribbon控件类似,我添加了标签,集团和Button控件的辅助类。这些佣工让你轻易改变属性选项卡,组和按钮。 Button类也暴露了一个OnExecute事件,这有利于您回应按钮点击的方式。
一如往常,这个职位的结果是使用WinForms应用程序中的带状功能的又一例证。查找{A7}。
这是现在,
阿里克Poznanski。

回答

评论会员:尤金Podsypalnikov 时间:2012/01/25
对不起{S2}

BEGIN_MESSAGE_MAP(CYourWnd, CBaseOfYouWnd)

  //{{AFX_MSG_MAP(CYourWnd)

...

  ON_WM_GETMINMAXINFO()

  //}}AFX_MSG_MAP

END_MESSAGE_MAP()

    

void CYourWnd::OnGetMinMaxInfo(MINMAXINFO* lpMMI)

{

  lpMMI->ptMaxTrackSize.x = 400;

  lpMMI->ptMaxTrackSize.y = 200;

}
评论会员:AVI伯杰 时间:2012/01/25
覆盖的CWnd::OnGetMinMaxInfo。 {A8}一个关于它的整个讨论]
评论会员:。AJ83 时间:2012/01/25
完成!非常感谢。

但我有变化的限制。


lpMMI->ptMinTrackSize.x = 1000; 

lpMMI->ptMinTrackSize.y = 700;

的地方

lpMMI->ptMaxTrackSize.x = 1000; 

lpMMI->ptMaxTrackSize.y = 700;


我做了这个改变,因为我想调整大小,以阻止用户从最大到最小。从最小到最大
评论会员:。尤金Podsypalnikov 时间:2012/01/25
是否有一些内部功能OnGetMinMaxInfo断点停止? {S2}
评论会员:游客 时间:2012/01/25
AJ83|感谢您的答复,但这种想法是不工作
AJ83
评论会员:游客 时间:2012/01/25
您好尤金,我试着用你的代码,但它是给我"调试断言失败"。某处,我很缺少的东西。会有什么m_cMaxRect
?AJ83
评论会员:游客 时间:2012/01/25
。尤金,问题不解决用户能够调整窗口。窗口不限制一定的限制
。aswathstorm
评论会员:游客 时间:2012/01/25
在VisualStudio中,当你选择一个表格,在属性,你可以看到一个称为最大的窗口大小。你可以给出一个像素的最大尺寸。使用户斜面增加该值
。AJ83
评论会员:游客 时间:2012/01/25
风暴,我在VS2003中使用MFC应用程序。你说在此不提供的财产。所以我不能够设置的属性,你都在谈论
。AJ83
评论会员:游客 时间:2012/01/25
尤金,我还实施了这个逻辑。但我并没有在这成功的。可能是我做错了什么。实现您提到的功能后,如何使用这个吗?你能告诉我