gpt4 book ai didi

c++ - 覆盖 VCL 类/组件保护方法 - 如何编码和使用?

转载 作者:行者123 更新时间:2023-11-28 05:50:59 24 4
gpt4 key购买 nike

我正在重写现有的旧代码,并对图标进行大修。我曾经将位图分配给 TMenuItem,但我正在更改它以支持 ImageIndex 和色深为 32 位的 TImageList,其中包含带有一个阿尔法 channel 。 ImageList 在设计时创建并填充有图标。 ImageIndex 在程序启动期间分配,并在适当的时候更改。

我注意到当 MenuItem 被禁用时 (enabled = false),生成的图像看起来不太好(根本),我读到这是 due to VCL .提到的链接还链接到可以将图标转换为其灰度值的 Delphi 代码。

我不精通 Delphi,也不更改 VCL 组件、对它们进行子类化、从它们继承等。我通常只是简单地使用可用的组件而不更改它。所以我从一些基本问题开始:

这是一个非常简单的尝试,继承自 TImage 并覆盖 DoDraw(),使其从一开始就永远不会禁用图标(将 Delphi 代码解码为灰度可以在第二步中完成)

class MyTImageList : public TImageList
{
public:

__fastcall MyTImageList(Classes::TComponent* AOwner)
: TImageList(AOwner) {} ;

virtual __fastcall DoDraw(int Index, TCanvas *Canvas, int X, int Y, unsigned int Style, bool Enabled = true)
{
return TImageList::DoDraw(Index, Canvas, X, Y, Style) ;
}
};

仅供引用:我使用 C++ Builder 2009它不编译,错误:[BCC32 Error] Main.h(1018): E2113 Virtual function '_fastcall TMainForm::MyTImageList::DoDraw(int,TCanvas *,int,int,unsigned int,bool)' 冲突使用基类“TCustomImageList”

因为我对从 VCL 组件类继承非常不安全,所以我不确定我是在处理拼写错误还是一些非常有建设性的错误?请赐教。

假设这个编译我实际上也不确定如何进一步进行。因为 ImageList 是在设计时创建的,并在整个代码中使用。要使此更改生效,我必须使用“MyTimageList”。

那么,我是在构建 Form 期间创建 MyTimageList 并在设计时创建 Assign() ImageList 的内容,还是有更有效的方法来避免复制超越一切?

其实后面的问题想多了,I could simply use the internal ImageList of the design time Imagelist instance .

最佳答案

这是 Delphi 代码的 C++ 翻译:

class MyTImageList : public TImageList
{
protected:
virtual void __fastcall DoDraw(int Index, Graphics::TCanvas *Canvas, int X, int Y, unsigned Style, bool Enabled = true);

public:
__fastcall MyTImageList(Classes::TComponent* AOwner, TImageList *DesignImageList);
};

__fastcall MyTImageList::MyTImageList(Classes::TComponent* AOwner, TImageList *DesignImageList)
: TImageList(AOwner)
{
ColorDepth = DesignImageList->ColorDepth;
Handle = DesignImageList->Handle; // Use the internally kept List of the design time ImageList
ShareImages = true;
}

unsigned __fastcall GetRGBColor(TColor Value)
{
unsigned Result = ColorToRGB(Value);
switch (Result)
{
case clNone: Result = CLR_NONE; break;
case clDefault: Result = CLR_DEFAULT; break;
}
return Result;
}

void __fastcall MyTImageList::DoDraw(int Index, TCanvas *Canvas, int X, int Y, unsigned Style, bool Enabled)
{
if ((Enabled) || (ColorDepth != cd32Bit))
{
TImageList::DoDraw(Index, Canvas, X, Y, Style, Enabled);
}
else if (HandleAllocated())
{
IMAGELISTDRAWPARAMS Options = {0};
Options.cbSize = sizeof(Options);
Options.himl = (HIMAGELIST) Handle;
Options.i = Index;
Options.hdcDst = Canvas->Handle;
Options.x = X;
Options.y = Y;
Options.cx = 0;
Options.cy = 0;
Options.xBitmap = 0;
Options.yBitmap = 0;
Options.rgbBk = GetRGBColor(BkColor);
Options.rgbFg = GetRGBColor(BlendColor);
Options.fStyle = Style;
Options.fState = ILS_SATURATE; // Grayscale for 32bit images

ImageList_DrawIndirect(&Options);
}
}

关于c++ - 覆盖 VCL 类/组件保护方法 - 如何编码和使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35262345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com