Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];
ВнизКонвертирование bmp в ico Найти похожие ветки
← →
demon © (2008-08-18 04:44) [0]Вот примерчик 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?
← →
AlexanderMS © (2008-08-18 07:29) [1]
> Как это сказать на API?
Для начала посмотреть исходный код метода CopyRect. Там всё есть.
← →
demon © (2008-08-18 13:23) [2]Изучил. Там нужны HDC, а у меня есть HBITMAP, вобщем тупик...
← →
Renegat © (2008-08-19 00:29) [3]> вобщем тупик...
Блин! Мне бы ваш тупик!!!
Создаёте DC (CreateCompatibleDC фпомощь), и линкуете к нему ваш HBITMAP через SelectObject. Выводите. И не забудьте потом DC удалить.
ЗЫ: Телепатируя последующий вопрос "А что дальше?", отвечаю: дальше нужно курить Windows SDK (пункт главного меню Делфей в разделе Help) по ключевой фразе "Device Context Functions".
← →
Германн © (2008-08-19 01:23) [4]
> Renegat © (19.08.08 00:29) [3]
>
> > вобщем тупик...
>
> Блин! Мне бы ваш тупик!!!
>
А в чём основная проблема?
:)
← →
demon © (2008-08-24 03:05) [5]Сделал вот так
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???
← →
DVM © (2008-08-24 14:55) [6]
> demon © (24.08.08 03:05) [5]
>
> Сделал вот так
>
противоречит
> А зачем нужны манипуляции с OldInDC и OldOutDC???
Или это не ты сделал?
← →
demon © (2008-08-24 18:49) [7]Ну, я смотрел другие примеры, и отталкиваясь от них делал. Во всем разобрался, только не понял зачем перед удаленим DC нужны эти манипуляции.
← →
DVM © (2008-08-24 21:48) [8]
> только не понял зачем перед удаленим DC нужны эти манипуляции.
SelectObject при выборе какого либо объекта GDI (кисть, перо, битмап и т.д.) в контекст окна, возвращает хэндл старого объекта. Принято по окончании манипуляций с DC окна возвращать все обратно. Тебя сбили с толку, наверное, неудачные имена переменных.
OldInDC := SelectObject( inDC, Long_BMP );
OldOutDC := SelectObject( OutDC, OutBmp );
OldInDC вероятно стоило бы называть hOldInBitmap, а OldOutDC - hOldOutBitmap или как то в этом духе
← →
demon © (2008-08-25 13:37) [9]Нет, мне просто непонятно зачем вообще старый хэнд, он ведь нигде не используеться...
← →
DVM © (2008-08-25 14:48) [10]
> Нет, мне просто непонятно зачем вообще старый хэнд, он ведь
> нигде не используеться...
Затем, чтобы выбрать его обратно в контекст. Ибо объект не мы создавали, не нам и уничтожать.
← →
demon © (2008-08-25 18:25) [11]Почему не мы? а это
inDC := CreateCompatibleDC( 0 );
OutDC := CreateCompatibleDC( 0 );
← →
Правильный$Вася (2008-08-25 18:39) [12]
> Почему не мы? а это
old создавал не ты, ты его заменил на свои, но после нужно вернуть на место
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.10.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c