Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.05;
Скачать: CL | DM;

Вниз

Конвертирование 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
15-1219030948
Slider007
2008-08-18 07:42
2008.10.05
С днем рождения ! 17 августа 2008 воскресенье


2-1219978334
FIL-23
2008-08-29 06:52
2008.10.05
Сортировка записей


11-1194225257
nsvi
2007-11-05 04:14
2008.10.05
Куда пропал OnEndEditLVItem?


15-1218549829
{RASkov}
2008-08-12 18:03
2008.10.05
Платежные терминалы?


15-1218592874
Slider007
2008-08-13 06:01
2008.10.05
С днем рождения ! 13 августа 2008 среда