Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.06;
Скачать: CL | DM;

Вниз

замена черного цвета прозрачным на карте бит   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.03.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.286 c
14-1108639991
Doxygen
2005-02-17 14:33
2005.03.06
Pas2DOC


3-1107253279
Vadim
2005-02-01 13:21
2005.03.06
Запрос с параметрами


8-1100614636
denis24
2004-11-16 17:17
2005.03.06
Tbitmap...Tjpeg


1-1109077764
Pafnuty
2005-02-22 16:09
2005.03.06
Запись в registry


1-1108629913
Slaga
2005-02-17 11:45
2005.03.06
Плагины для дельфи