Как насчет этой невероятно злой реализации?
array.h
#define IMPORT_ARRAY(TYPE) \
\
struct TYPE##Array { \
TYPE* contents; \
size_t size; \
}; \
\
struct TYPE##Array new_##TYPE##Array() { \
struct TYPE##Array a; \
a.contents = NULL; \
a.size = 0; \
return a; \
} \
\
void array_add(struct TYPE##Array* o, TYPE value) { \
TYPE* a = malloc((o->size + 1) * sizeof(TYPE)); \
TYPE i; \
for(i = 0; i < o->size; ++i) { \
a[i] = o->contents[i]; \
} \
++(o->size); \
a[o->size - 1] = value; \
free(o->contents); \
o->contents = a; \
} \
void array_destroy(struct TYPE##Array* o) { \
free(o->contents); \
} \
TYPE* array_begin(struct TYPE##Array* o) { \
return o->contents; \
} \
TYPE* array_end(struct TYPE##Array* o) { \
return o->contents + o->size; \
}
main.c
#include <stdlib.h>
#include "array.h"
IMPORT_ARRAY(int);
struct intArray return_an_array() {
struct intArray a;
a = new_intArray();
array_add(&a, 1);
array_add(&a, 2);
array_add(&a, 3);
return a;
}
int main() {
struct intArray a;
int* it;
int* begin;
int* end;
a = return_an_array();
begin = array_begin(&a);
end = array_end(&a);
for(it = begin; it != end; ++it) {
printf("%d ", *it);
}
array_destroy(&a);
getchar();
return 0;
}
Ваш код не работает, потому что вы потеряли всю информацию о прозрачности при использовании GetBitmap()
. Вместо этого вам придется рисовать растровое изображение вручную, например:
uses
..., Winapi.CommCtrl;
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
var
i: integer;
begin
// make sure your ImageList is set to ColorDepth=cd32bit and DrawingStyle=dsTransparant beforehand...
Bitmap.SetSize(ImageList.Width, ImageList.Height);
Bitmap.PixelFormat := pf32bit;
if (ImageList.ColorDepth = cd32Bit) then
begin
Bitmap.Transparent := False;
Bitmap.AlphaFormat := afDefined;
end
else
Bitmap.Transparent := True;
for i := 0 to Bitmap.Height-1 do
FillChar(Bitmap.ScanLine[i]^, Bitmap.Width*SizeOf(DWORD), [110]);
ImageList_Draw(ImageList.Handle, Index, Bitmap.Canvas.Handle, 0, 0, ILD_TRANSPARENT);
end;
В качестве альтернативы:
procedure GetTransparentBitmapFromImageList(ImageList: TCustomImageList; Index: Integer; Bitmap: TBitmap);
begin
Bitmap.PixelFormat := pf32bit;
Bitmap.Canvas.Brush.Color := clFuschia;
Bitmap.SetSize(ImageList.Width, ImageList.Height);
ImageList.Draw(Bitmap.Canvas, 0, 0, AIndex, dsTransparent, itImage);
Bitmap.Transparent := True;
Bitmap.TransParentColor := clFuchsia;
Bitmap.TransparentMode := tmAuto;
end;
Тогда вы можете сделать это:
var
NewItem: TMenuItem;
begin
NewItem := TMenuItem.Create(pmSendToCustomTool);
NewItem.Caption := ThisCaption;
GetTransparentBitmapFromImageList(MySystemImageList1, AIndex, NewItem.Bitmap);
CodeSite.Send('NewItem.Bitmap', NewItem.Bitmap);
end;