Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Конвертирование bmp в ico


demon ©   (2008-08-18 04:44:00) 

Вот примерчик http://njg.890m.com/ico_bmp.zip
Но он написан с использованием модуля Graphics, подскажите как сделать на API?
От Tbitmap смог избавиться, а вот как скопировать часть bmp-шки с помощью API не разобрался.
Так что загвоздка в этой строчке:
XOrMask.Canvas.CopyRect(rect(0,0,16,16),tempBitmap.Canvas,rect(numberIcon*16,0,n umberIcon*16+16,16));
Как это сказать на API?


Правильный$Вася   (2008-08-25 18:39:00) [1]


> Почему не мы? а это

oldсоздавал не ты, ты его заменил на свои, но после нужно вернуть на место


demon   (2008-08-25 18:25:00) [2]

Почему не мы? а это

inDC     :=  CreateCompatibleDC( 0 );
OutDC    :=  CreateCompatibleDC( 0 );


DVM   (2008-08-25 14:48:00) [3]


> Нет, мне просто непонятно зачем вообще старый хэнд, он ведь
> нигде не используеться...

Затем, чтобы выбрать его обратно в контекст. Ибо объект не мы создавали, не нам и уничтожать.


demon   (2008-08-25 13:37:00) [4]

Нет, мне просто непонятно зачем вообще старый хэнд, он ведь нигде не используеться...


DVM   (2008-08-24 21:48:00) [5]


> только не понял зачем перед удаленим DC нужны эти манипуляции.

SelectObject при выборе какого либо объекта GDI (кисть, перо, битмап и т.д.) в контекст окна, возвращает хэндл старого объекта. Принято по окончании манипуляций с DC окна возвращать все обратно. Тебя сбили с толку, наверное, неудачные имена переменных.

OldInDC  :=  SelectObject( inDC, Long_BMP );
OldOutDC :=  SelectObject( OutDC, OutBmp );

OldInDC  вероятно стоило бы называть hOldInBitmap, а OldOutDC - hOldOutBitmap или как то в этом духе


demon   (2008-08-24 18:49:00) [6]

Ну, я смотрел другие примеры, и отталкиваясь от них делал. Во всем разобрался, только не понял зачем перед удаленим DC нужны эти манипуляции.


DVM   (2008-08-24 14:55:00) [7]


> demon ©   (24.08.08 03:05) [5]
>
> Сделал вот так
>

противоречит


> А зачем нужны манипуляции с OldInDC и OldOutDC???


Или это не ты сделал?


demon   (2008-08-24 03:05:00) [8]

Сделал вот так

procedure TForm1.Button1Click(Sender: TObject);
var
 IconInfo: TIconInfo;

 inDC,
 OutDC:hdc;

 Long_BMP,
 Mask_BMP,
 OutBmp : HBITMAP;

 OldInDC,
 OldOutDC: THandle;

begin

 Long_BMP := LoadBitmap(hInstance, 'LONG_BMP');
 Mask_BMP := LoadBitmap(hInstance, 'MASK');

 OutBmp   :=  CreateBitmap(16, 16, 2, 16, Nil);

 inDC     :=  CreateCompatibleDC( 0 );
 OutDC    :=  CreateCompatibleDC( 0 );

 OldInDC  :=  SelectObject( inDC, Long_BMP );
 OldOutDC :=  SelectObject( OutDC, OutBmp );

 StretchBlt( OutDC,
            0,
            0,
            16,
            16,
            inDC,
            0,
            0,
            16,
            16,
            SRCCOPY );

 IconInfo.fIcon := true;
 IconInfo.xHotspot := 0;
 IconInfo.yHotspot := 0;
 IconInfo.hbmMask  := Mask_BMP;
 IconInfo.hbmColor := OutBmp;
 Icon.Handle := CreateIconIndirect(IconInfo);

 // Зачем нужно это?
 SelectObject( OutDC, OldOutDC );
 SelectObject( inDC, OldInDC );

 DeleteObject(Long_BMP);
 DeleteObject(Mask_BMP);
 DeleteObject(OutBmp);

 DeleteDC( inDC );
 DeleteDC( OutDC );

 // проверяем
 Application.Icon := Icon;
 InvalidateRect(Application.Handle, nil, true);

end;


Это правильно?

А зачем нужны манипуляции с OldInDC и OldOutDC???


Германн   (2008-08-19 01:23:00) [9]


> Renegat ©   (19.08.08 00:29) [3]
>
> > вобщем тупик...
>
> Блин! Мне бы ваш тупик!!!
>

А в чём основная проблема?
:)


Renegat   (2008-08-19 00:29:00) [10]

> вобщем тупик...

Блин! Мне бы ваш тупик!!!
Создаёте DC (CreateCompatibleDC фпомощь), и линкуете к нему ваш HBITMAP через SelectObject. Выводите. И не забудьте потом DC удалить.
ЗЫ: Телепатируя последующий вопрос "А что дальше?", отвечаю: дальше нужно курить Windows SDK (пункт главного меню Делфей в разделе Help) по ключевой фразе "Device Context Functions".


demon   (2008-08-18 13:23:00) [11]

Изучил. Там нужны HDC, а у меня есть HBITMAP, вобщем тупик...


AlexanderMS   (2008-08-18 07:29:00) [12]


> Как это сказать на API?

Для начала посмотреть исходный код метода CopyRect. Там всё есть.


Наверх

Титульная страница Поиск, карта сайта Написать письмо