【问题标题】:VCL TImage + TImageList, transparent feature doesn't work or what am I doing wrong?VCL TImage + TImageList,透明功能不起作用或我做错了什么?
【发布时间】:2016-03-15 15:22:08
【问题描述】:

使用 Borland C++ Builder 2009

我从 W7 Windows 对话框中截取了三个按钮并将它们放在 TImageList 中。在适当的时候,我会在 TImage 中加载 3 个变体。

Image->Picture->Bitmap = NULL ; // Clear previous state
ImageList->GetBitmap(2, Image->Picture->Bitmap) ;

PS:Image->Transparent = True

在 Windows 7 和 Windows 10 上,这似乎可以正常工作。 但我刚刚意识到,只是因为放置 TImage 的 TForm 具有完全相同的背景color。 (确认我将背景更改为石灰后不起作用)

在 Windows XP 上,该按钮看起来不太好。由于 XP 的背景颜色似乎略有不同。请注意,它也是clBtnFace

XP: . . . Windows 7:

我也尝试过设置TImageList控件的BlendColorDrawingStyle,结合Image->Transparent = truefalse

但我无法让它工作。

我在 W7 上捕获了 Image->Picture->Bitmap->Canvas->Pixels[0][0] 值并将其放入 ImageList->BlendColorImageList->DrawingStyle = dsFocusdsSelected)等等,但没有成功。

我也尝试过在ImageList->GetBitmap(2, Image->Picture->Bitmap) 之后再次显式设置Image->Transparent = True,甚至尝试过

Image->Picture->Bitmap->TransparentColor =
Image->Picture->Bitmap->Canvas->Pixels[0][0]

没有明显的效果。

你的想法?

【问题讨论】:

  • 您需要带有 Alpha 通道的原始字形。渲染后的屏幕截图为时已晚。
  • 您是否尝试过手动修改图像并在图像左上角插入clFuchsia 色的一个像素?
  • @Wodzu 这无济于事,因为这些图像依赖于部分 alpha 级别才能看起来不错
  • 您可以尝试使用DrawThemeBackground 方法通过TDLG_EXPANDOBUTTON 部分和有效状态之一(TDLGEBS_NORMALTDLGEBS_HOVERTDLGEBS_PRESSED等)
  • 我明白了...感谢 cmets !知道这个字形是否可以在 W7 系统上找到,在哪里? @RRUZ,似乎仅限于 Vista 及更高版本,而我遇到的问题是 XP

标签: delphi c++builder


【解决方案1】:

我在评论中所说的而不是从屏幕上捕获图像,您可以尝试使用 DrawThemeBackground 方法绘制展开按钮,该方法传递 TDLG_EXPANDOBUTTON 部分和有效状态之一(TDLGEBS_NORMALTDLGEBS_HOVERTDLGEBS_PRESSED 等)。对于 Windows XP,您可以使用 EBP_NORMALGROUPEXPAND 部分和这些状态之一(EBHC_NORMALEBHC_HOTEBHC_PRESSED

检查这个在 TImage 中绘制 expando 按钮 的示例。

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "Vsstyle.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Image1->Canvas->Brush->Color = clBtnFace;
  Image1->Canvas->FillRect(Image1->ClientRect);

  OSVERSIONINFO verwin;
  verwin.dwOSVersionInfoSize=sizeof(verwin);
  if (GetVersionEx(&verwin))
  {
    //Check  the Windows version
    if (verwin.dwMajorVersion >= 6) // is Vista at least?
    {
      HTHEME hTheme = OpenThemeData(Handle, VSCLASS_TASKDIALOG);
      if (hTheme)
      {
          SIZE s;
          //get the size of the  TDLG_EXPANDOBUTTON
          if (GetThemePartSize(hTheme, Image1->Canvas->Handle, TDLG_EXPANDOBUTTON, TDLGEBS_NORMAL, NULL, TS_TRUE, &s) == S_OK)
          {
              TRect pRect = Rect(0, 0, s.cx, s.cy);
              DrawThemeBackground(hTheme, Image1->Canvas->Handle, TDLG_EXPANDOBUTTON, TDLGEBS_NORMAL, &pRect, NULL);
           }
      }
    }
    else
    {
      HTHEME hTheme = OpenThemeData(Handle, VSCLASS_EXPLORERBAR);
      if (hTheme)
      {
          SIZE s;
          //get the size of the  EBP_NORMALGROUPEXPAND
          if (GetThemePartSize(hTheme, Image1->Canvas->Handle, EBP_NORMALGROUPEXPAND, EBHC_NORMAL, NULL, TS_TRUE, &s) == S_OK)
          {
              TRect pRect = Rect(0, 0, s.cx, s.cy);
              DrawThemeBackground(hTheme, Image1->Canvas->Handle, EBP_NORMALGROUPEXPAND, EBHC_NORMAL, &pRect, NULL);
           }
      }
    }
  }
}

【讨论】:

  • 谢谢!!我将在星期一尝试这个(现在不能,无法访问我的“东西”)。问题,Image1 应该有什么尺寸/尺寸?还是没关系?其他重要的设置?透明 ?拉紧 ? ...
  • 只需使用默认值删除一个 TImage。
  • 取得进展!谢谢 !!为了完整起见,您可以添加(至少对于我的 Borland C++ Builder 2009)版本,您还需要包括:#include &lt;UxTheme.hpp&gt; 并将UxTheme.lib 添加到项目中!此外,指向您从中获取图像值的链接会很好。我现在正在寻找字形的 UP 指向版本,我的代码!
  • 对于其他州,我发现了这个:msdn.microsoft.com/en-us/library/windows/desktop/… 我现在可以很好地工作了!感谢您的帮助@RRUZ!
  • 附言。我确实设置了Image1-&gt;Transparent = true 以获得所需的透明效果(只是为了完整性)
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多