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

Вниз

Созадать иконку (ico) на WinApi   Найти похожие ветки 

 
ORMADA ©   (2005-05-12 08:02) [0]

Добрый день !
Скажу сразу вынь апи знаю плохо.. очень плохо, фактически не знаю. Потому и возникают вопросы.
Написал я маленькую программу которая делает иконку в трее и не фига больше не делает. Захотел всунуть свою иконку в трей
делаю это так..

     
FIcon := CreateIcon;
try
 IconData.hIcon := FIcon.Handle;
 DecodeDateFully(Now, FYear, FMonth, FDay, FDOW);
 StrPCopy(IconData.szTip, IntToStr(FDay) + " " + AllMonths[FMonth] + #13 + DaysOfWeek[FDOW]);
 Shell_NotifyIcon(NIM_ADD, @IconData);
finally
 FreeAndNil(FIcon);
end;

для этого использую такую функцию

function CreateIcon: TIcon;
var
 IconSizeX: integer;
 IconSizeY: integer;
 AndMask: TBitmap;
 XOrMask: TBitmap;
 IconInfo: TIconInfo;

 Icon: TIcon;
 Day: string[2];
begin
 IconSizeX := 16;
 IconSizeY := 16;

 AndMask := TBitmap.Create;
 try
   AndMask.Monochrome := true;
   AndMask.Width := IconSizeX;
   AndMask.Height := IconSizeY;

   AndMask.Canvas.Brush.Color := clBlack;
   AndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));

   XOrMask := TBitmap.Create;
   try
     XOrMask.Width := IconSizeX;
     XOrMask.Height := IconSizeY;

     XOrMask.Handle := LoadBitmap(HInstance, PAnsiChar("DOFW" +          IntToStr(DayOfWeek(Now))));
     XOrMask.Canvas.Font.Name := "Arial";
     XOrMask.Canvas.Font.Color := clWhite;
     XOrMask.Canvas.Font.Style := [fsbold];
     XOrMask.Canvas.Font.Size := 8;

     XOrMask.Canvas.Brush.Style := bsClear;

     Day := IntToStr(DayOf(Now));
     if Length(Day) = 1 then Day := "0" + Day;

     XOrMask.Canvas.TextOut(2, -2, Day);

     Icon := TIcon.Create;
     try
       IconInfo.fIcon := True;
       IconInfo.xHotspot := 0;
       IconInfo.yHotspot := 0;

       IconInfo.hbmMask := AndMask.Handle;
       IconInfo.hbmColor := XOrMask.Handle;

       Icon.Handle := CreateIconIndirect(IconInfo);

       Result := TIcon.Create;
       Result.Assign(Icon);
     finally
       Icon.Free;
     end;
   finally
     XOrMask.Free;
   end;

 finally
   AndMask.Free;
 end;
end;

но чтоб её использовать приходиться добавлять в юсес Graphics, а не хотелось бы...
как можно сделать без использования Graphics ?
заранее благодарен..


 
MBo ©   (2005-05-12 08:14) [1]

Windows.CreateIcon(Indirect)


 
VMcL ©   (2005-05-12 08:18) [2]

Уберите в CreateIcon создание TIcon и возращайте просто результат функции CreateIconIndirect. В вызывающей подпрограмме: IconData.hIcon := CreateIcon;

P.S. Удалять иконку посредством DestroyIcon, но после того, как она перестанет использоваться.


 
ORMADA ©   (2005-05-12 09:43) [3]

а как исчо тады объявить  
AndMask и XOrMask ? чтобы можно было рисовать на канве или может как то по другому на ней рисовать ?


 
ORMADA ©   (2005-05-13 07:23) [4]

как объявить AndMask и XOrMask чтобы можно было рисовать на канве или может как то по другому на ней рисовать ?
мне надо самому нарисовать иконку, потом следовательно передам нарисованное CreateIconIndirect


 
MBo ©   (2005-05-13 08:45) [5]

В MSDN есть пример для CreateIcon


 
ORMADA ©   (2005-05-13 09:21) [6]

в мсдн

hIcon3 = CreateIcon(hinst,    // application instance  
            32,              // icon width
            32,              // icon height
            1,               // number of XOR planes
            1,               // number of bits per pixel
            ANDmaskIcon,     // AND bitmask  
            XORmaskIcon);    // XOR bitmask

это понятно... я делаю также, практически..
вопрос сейчас в том как обхявить And и XOR битовые маски чтоб на них можно было рисовать или как то по другому рисовать ?


 
ORMADA ©   (2005-05-13 09:24) [7]

т.е. сейчас необходимо как то подготовить битовые маски раньше делал так

var
AndMask: TBitmap;
XOrMask: TBitmap;
............
AndMask.Canvas.Brush.Color := clBlack;
AndMask.Canvas.FillRect(Rect(0, 0, IconSizeX, IconSizeY));

XOrMask := TBitmap.Create;
try
XOrMask.Width := IconSizeX;
XOrMask.Height := IconSizeY;

XOrMask.Handle := LoadBitmap(HInstance, PAnsiChar("DOFW" +          IntToStr(DayOfWeek(Now))));
XOrMask.Canvas.Font.Name := "Arial";
XOrMask.Canvas.Font.Color := clWhite;
XOrMask.Canvas.Font.Style := [fsbold];
XOrMask.Canvas.Font.Size := 8;
XOrMask.Canvas.Brush.Style := bsClear;

Day := IntToStr(DayOf(Now));
if Length(Day) = 1 then Day := "0" + Day;

XOrMask.Canvas.TextOut(2, -2, Day);

т.е. рисовал на канве если выкинуть graphics то у виндушного (модуль Windows) канвы нету :(


 
VMcL ©   (2005-05-13 11:22) [8]

>у виндушного (модуль Windows) канвы нету

Канвы нету, но есть DC - Device Context.


 
ORMADA ©   (2005-05-13 13:34) [9]


var
 CompatibleDC: HDC;
 hdcScreen: HDC;
...
 hdcScreen := CreateDC("DISPLAY", nil, nil, nil);
 CompatibleDC := CreateCompatibleDC(hdcScreen);

потом
 TextOut(CompatibleDC, 2, -2, "12", 2);
 AndMask := CreateCompatibleBitmap(CompatibleDC, 16, 16);
...
 IconInfo.hbmMask := AndMask;
 IconInfo.hbmColor := XOrMask;
CreateIconIndirect(IconInfo);

но когда создаю иконку "12" там нету, почему ?


 
MBo ©   (2005-05-13 14:11) [10]

>ORMADA ©   (13.05.05 13:34) [9]
Слушай, давай ты сначала книжки почитаешь - сначала Петцольда, потом, если будет потребность глубже разобраться, Фень Юаня, непременно соответствующие разделы MSDN изучишь (или хотя бы Саймона прочитаешь), узнаешь о принципах функционирования GDI (где в контексте выбирается битмап, а уже потом рисование идет), а потом посмотрим, какие вопросы останутся, а какие сами отпадут. ОК?


 
ORMADA ©   (2005-05-13 14:43) [11]

:( MSDN есть а вот книжек к сожалению нету...



Страницы: 1 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.03 c
14-1118157101
D-S@nt
2005-06-07 19:11
2005.07.11
как раскрыть скобки?


14-1118036827
КаПиБаРа
2005-06-06 09:47
2005.07.11
Уважение к чужому мнению


6-1112684994
lin
2005-04-05 11:09
2005.07.11
TService + TClientSocket + TServerSocket


3-1116981241
saf287
2005-05-25 04:34
2005.07.11
BDE Administrator


1-1118397912
Dysan
2005-06-10 14:05
2005.07.11
помогите понять в чем причина возникновения ошибки!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский