Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Вниззамена черного цвета прозрачным на карте бит Найти похожие ветки
← →
tradakad © (2005-01-24 11:10) [0]имеется битмап вытащенный из иконки, который затем устанавливаю на итем меню с помощью SetMenuItemBitmaps(hPopup_invis,invis_pos,MF_BYPOSITION,hbmp,hbmp);
function GetBitmap(Wnd:HWND):HBITMAP;
begin
Icon_Handle:=HSGetWindowIcon(Wnd);
if Icon_Handle>0 then
begin
GetIconInfo(Icon_Handle, IconInfo);
Result:=IconInfo.hbmColor;
end
else
Result:=LoadBitmap(hInst,"NA");
end;
hbmp:=GetBitmap(hwnd);
но имеется две проблемы, там где у иконки прозрачный цвет или фон, не знаю как правильнее сказать, во вновь созданном битмапе цвет становиться черным. как изменить тот цвет битмапа что находиться в его левом нижнем углу на прозрачный используя WinApi?
я знаю только такой способ
aplane := TBitMap.Create;
sky.LoadFromFile("sky.bmp");
aplane.LoadFromFile("aplane.bmp") ;
Form1.Canvas.Draw(0,0,sky);
Form1.Canvas.Draw(20,20,aplane);
aplane.Transparent:=True;
как сделать то же самое но на WinApi ?
и второй вопрос, если получившийся битмап большого размера - естественно он весь не отбражается на элементе меню, а только его верхняя левая часть, как сделать что то типа stretch?
← →
Kerk © (2005-01-24 11:27) [1]расчитай маску битмапа и через нее с пом. BitBlt рисуй.
← →
tradakad © (2005-01-24 12:05) [2]а поподробнее немного можно? как я буду на элементе меню рисовать? ведь я использую SetMenuItemBitmaps
← →
DVM © (2005-01-24 12:34) [3]procedure DrawBitmapTransparent(dc: HDC;
hBitmap: HBITMAP;
xStart, yStart: integer;
colorTransparent: COLORREF); stdcall;
var
bm: BITMAP;
hdcMem: HDC;
ptSize, ptOrg: TPoint;
begin
if dc <> 0 then
begin
hdcMem := CreateCompatibleDC(dc);
if (hdcMem <> 0) and (hBitmap <> 0) then
begin
SelectObject(hdcMem, hBitmap);
SetMapMode(hdcMem, GetMapMode(dc));
GetObject(hBitmap, sizeof(BITMAP), @bm);
ptSize.x := bm.bmWidth;
ptSize.y := bm.bmHeight;
DPtoLP(dc, ptSize, 1);
ptOrg.x := 0;
ptOrg.y := 0;
DPtoLP(hdcMem, ptOrg, 1);
TransparentBlt(dc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, ptOrg.x, ptOrg.y, colorTransparent);
DeleteDC(hdcMem);
end;
end;
end;
function TransparentBlt(hdcDest: HDC; xDest, yDest, cx, cy: integer; hdcSrc: HDC; xSrc, ySrc: integer; clrTrans: COLORREF): boolean; stdcall;
var
hdcMask: HDC;
hbmMask: HBITMAP;
hdcMem: HDC;
hbmMem: HBITMAP;
clrBack: COLORREF;
clrText: COLORREF;
begin
hdcMask := CreateCompatibleDC( hdcDest );
hbmMask := CreateBitmap( cx, cy, 1, 1, nil );
hbmMask := SelectObject( hdcMask, hbmMask );
hdcMem := CreateCompatibleDC( hdcDest );
hbmMem := CreateCompatibleBitmap( hdcDest, cx, cy );
hbmMem := SelectObject( hdcMem, hbmMem );
clrBack := SetBkColor( hdcSrc, clrTrans );
BitBlt( hdcMask, 0, 0, cx, cy, hdcSrc, xSrc, ySrc, SRCCOPY );
SetBkColor( hdcSrc, clrBack );
clrBack := SetBkColor( hdcDest, $FFFFFF );
clrText := SetTextColor( hdcDest, $000000 );
BitBlt( hdcMem, 0, 0, cx, cy, hdcDest, xDest, yDest, SRCCOPY );
BitBlt( hdcMem, 0, 0, cx, cy, hdcSrc, xSrc, ySrc, SRCINVERT );
BitBlt( hdcMem, 0, 0, cx, cy, hdcMask, 0, 0, SRCAND );
BitBlt( hdcMem, 0, 0, cx, cy, hdcSrc, xSrc, ySrc, SRCINVERT );
BitBlt( hdcDest, xDest, yDest, cx, cy, hdcMem, 0, 0, SRCCOPY );
SetBkColor( hdcDest, clrBack );
SetTextColor( hdcDest, clrText );
hbmMask := SelectObject( hdcMask, hbmMask );
DeleteObject( hbmMask );
DeleteDC( hdcMask );
hbmMem := SelectObject( hdcMem, hbmMem );
DeleteObject( hbmMem );
DeleteDC( hdcMem );
result := true;
end;
> как я буду на элементе меню рисовать?
WM_DRAWITEM
P.S. Прежде чем начинать программировать на АПИ неплохо бы книжки почитать Петзольда например. Куча вопросов которые я видел за последний месяц просто бы не возникла.
← →
tradakad © (2005-01-24 12:41) [4]для DVM - спасибо большое. буду пробовать. касательно книжек-сейчас читаю румянцева, который тоже все время на этого петзольда ссылается... но не знаю у кого как но лично у меня бывает следующее - вот видишь книгу, вот вроде все читаешь - но результат не получается, а потом через некоторое время опять читаешь эту же книгу - и результат прямо появляется словно озарение... т.е. хочу сказать - блажен тот кто не только видит, но и понимает.. к сожаленью ввиду моего очень небольшого объема знаний в данном вопросе "видение" не всегда сразу же сопровождаеться "пониманием".. Еще раз спасибо!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c