Главная страница
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.029 c
1-1118647710
silvestr
2005-06-13 11:28
2005.07.11
Замена вункции Uppercase


3-1117614522
_Max
2005-06-01 12:28
2005.07.11
выборка с учётом регистра


1-1119534181
DimMih
2005-06-23 17:43
2005.07.11
Подскажите пожалуйста как реализовать кратность?


3-1117645602
Shuric
2005-06-01 21:06
2005.07.11
Oracle через ODBC


14-1118524157
u-12
2005-06-12 01:09
2005.07.11
Помогите разобраться с датакабелем Самсунга