Я пытаюсь (безуспешно) скопировать / воспроизвести фоновый градиент строки меню Windows на растровое изображение.
В приведенной ниже функции IconToBitmap FillRect (по желанию) использует GetSysColorBrush (COLOR_MENU), пытаясь нарисовать фон меню так, как в Windows (неудивительно, что кисть не является градиентом, но это того стоило попробовать.)
BitBlt под ним - попытка «обмануть». Возьмите часть уже нарисованной строки меню и используйте ее. Это тоже не сработало, и я подозреваю, что причина может быть в том, что функция IconToBitmap вызывается во время WM_CREATE главного окна (я не уверен, что строка меню существует в начале создания окна). Мне нужен фон, прежде чем окно сначала становится видимым, поэтому функция вызывается при обработке WM_CREATE (но любой другой способ, который работает до того, как окно станет видимым, идеален).
На данный момент у меня нет идей.
Если кто-то знает, как захватить этот фон меню или воспроизвести его на растровом изображении, это было бы замечательно.
Спасибо.
PS: жестко закодированные значения в функции будут удалены в окончательной рабочей версии (надеюсь, она будет). Кроме того, для Delphi тип данных ptrint должен быть изменен на NativeInt.
function IconToBitmap(Wnd : HWND; Icon : HICON) : HBITMAP;
var
Bitmap : HBITMAP;
BitmapDc : HDC;
BitmapRect : TRECT;
OldBitmap : HBITMAP;
dc : HDC;
MenuHeight : ptrint;
MenuY : ptrint;
WindowDc : HDC;
begin
Bitmap := 0;
BitmapDc := 0;
OldBitmap := 0;
dc := 0;
MenuY := 0;
MenuHeight := 0;
WindowDc := 0;
MenuY := GetSystemMetrics(SM_CYSIZEFRAME) +
GetSystemMetrics(SM_CYCAPTION);
MenuHeight := GetSystemMetrics(SM_CYMENUSIZE);
WindowDc := GetWindowDC(Wnd);
dc := GetDC(0);
BitmapDc := CreateCompatibleDC(dc);
Bitmap := CreateCompatibleBitmap(dc, 16, 16);
OldBitmap := SelectObject(BitmapDc, Bitmap);
with BitmapRect do
begin
Left := 0;
Top := 0;
Right := 16;
Bottom := 16;
end;
FillRect(BitmapDc, BitmapRect, GetSysColorBrush(COLOR_MENU));
BitBlt(BitmapDc, 0, 0, 16, 16, WindowDc, 20, MenuY, SRCCOPY);
DrawIconEx(BitmapDc,
0,
0,
Icon,
16,
16,
0,
0,
DI_NORMAL);
SelectObject(BitmapDc, OldBitmap);
DeleteDC(BitmapDc);
ReleaseDC(0, dc);
IconToBitmap := Bitmap;
end;