Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1108972230
DimonS
2005-02-21 10:50
2005.03.06
Вопрос по временным промежуткам


4-1106386502
Lucifer
2005-01-22 12:35
2005.03.06
RegisterHotKey


14-1108415012
palva
2005-02-15 00:03
2005.03.06
Заведите себе собственный вирусятник


6-1104082322
Ertong
2004-12-26 20:32
2005.03.06
Изображение в WebBrowser


9-1102309010
Colt1978
2004-12-06 07:56
2005.03.06
Масштабирование при смене разрешения (GLScene)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский