![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конвертирование 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. Там всё есть.