Главная страница
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.5 MB
Время: 0.052 c
3-1117222276
Starcom
2005-05-27 23:31
2005.07.11
Как вычис Кол-во лет имея дату занесения и тек в Paradox...


3-1117309235
Nikitian
2005-05-28 23:40
2005.07.11
Сортировака при помощи table Неиндексному полю


14-1118409273
Mike Kouzmine
2005-06-10 17:14
2005.07.11
Будет война?


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


8-1110382350
Boyko
2005-03-09 18:32
2005.07.11
Длительность AVI