· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Как создавать иконки?

Посл.отвђт Сообщенiе


Дата: Окт 6, 2004 03:32:20

Увидел вот давеча программку,которая показывает количество свободной памяти в иконке в трее.И стало мне интересно,как можно создавать программно иконки вообще и как перевести число в графику чтоб показать его в иконке?


Дата: Окт 6, 2004 05:55:12 · Поправил: q_q

xmt
Иконка - это файл, который имеет формат.

как перевести число в графику
Создать дисплейный контекст, и рисовать на нем число поциферно, т.е. сделать 10 (0...9) подпрограмм, которые в нужной позиции контекста рисуют (точками или линиями) цифру или создать 10 битмапов (можно на'PrintScreen'ить чужие) и BitBlt'ить их в нужной позиции контекста. Можно перевести число в строку, а потом воспользоваться gdi'шной функций вывода строки на контекст.

Итого два этапа. Первый - создать изображение, второй - сделать из изображения файл иконки.

Возможно, существует способ обойтись без файла, а создавать ресурс в памяти.

Где-то в инете встречал код, который определяет место иконки в tray'е, и может быть вообще можно рисовать поверх tray'a.


Дата: Окт 6, 2004 13:12:15

„программку,которая показывает количество свободной памяти в иконке в трее.“

Я конечно в"едливый, но размер иконки не позволяет
показать больше 2-х цифр. Или это было что-то отличное
он иконки, либо ты спутал с "всплывающим сообщением"
у иконки в трее. На это есть специальное API вроде.


Дата: Окт 6, 2004 18:03:41

Узрейте Task Manager в трее и откажитесь от цифр.
А нарисовать иконку можно в контексте без файла как говорил q_q. У мастдая есть целая куча различных апишек для работы с подобной графикой, но это гиморно в данном случае.
Так что лучше, чтобы было с файлом -> нарисовать самому.


Дата: Окт 7, 2004 02:10:08

уже разобрался,спасибо за помощь.правда я сделал немного по другому: засунул в ресурсы пустую иконку,потом через GetIconInfo достал все что нужно из нее,и TextOut`oм написал циферки.вот так вот

Я конечно в"едливый, но размер иконки не позволяет
показать больше 2-х цифр.

цифры то совсем маленькие.три легко можно впихнуть,а мне больше и не надо :)


Дата: Окт 7, 2004 09:13:23

Можно так:
CreateICON PROC USES edi esi i_width:DWORD,i_height:DWORD,nNum:DWORD,bkgColor:DWORD,txtColor:DWORD
 
LOCAL hBmp_Main:DWORD
LOCAL hBmp_And:DWORD
LOCAL hBmp_Xor:DWORD
LOCAL hMemDC:DWORD
LOCAL hAndDC:DWORD
LOCAL hXorDC:DWORD
LOCAL szStr[4]:BYTE
LOCAL lFont:LOGFONT
LOCAL ii:ICONINFO
LOCAL tr:RECT

 xor    esi,esi
 mov    edi,      $invoke(CreateDC,ADDR szDisplay,esi,esi,esi)
 mov    hMemDC,   $invoke(CreateCompatibleDC,edi)
 mov    hBmp_Main,$invoke(CreateCompatibleBitmap,edi,i_width,i_height)
 mov    hAndDC,   $invoke(CreateCompatibleDC,edi)
 mov    hBmp_And, $invoke(CreateCompatibleBitmap,edi,i_width,i_height)
 mov    hXorDC,   $invoke(CreateCompatibleDC,edi)
 mov    hBmp_Xor, $invoke(CreateCompatibleBitmap,edi,i_width,i_height)
 invoke DeleteDC,edi
 invoke DeleteObject,$invoke(SelectObject,hMemDC,hBmp_Main)
 invoke DeleteObject,$invoke(SelectObject,hAndDC,hBmp_And)
 invoke DeleteObject,$invoke(SelectObject,hXorDC,hBmp_Xor)
 invoke CreateSolidBrush,bkgColor
 invoke SelectObject,hMemDC,eax
 invoke DeleteObject,eax
 invoke PatBlt,hMemDC,esi,esi,i_width,i_height,PATCOPY
 invoke SetTextCharacterExtra,hMemDC,-1
 invoke SetTextColor,hMemDC,txtColor
 invoke SetBkMode,hMemDC,TRANSPARENT
 invoke GetCurrentObject,hMemDC,OBJ_FONT
 mov    ebx,eax
 invoke GetObject,ebx,SIZEOF LOGFONT,ADDR lFont
 mov    lFont.lfWeight,FW_ULTRABOLD
 mov    edi,$invoke(CreateFontIndirect,ADDR lFont)
 invoke DeleteObject,$invoke(SelectObject,hMemDC,edi)
 invoke wsprintf,ADDR szStr,ADDR szI_Fmt,nNum
 mov    tr.left,0
 mov    tr.top,0
 m2m    tr.bottom,i_height
 m2m    tr.right,i_width
 invoke DrawText,hMemDC,ADDR szStr,-1,ADDR tr,DT_CENTER
 invoke DeleteObject,edi
 invoke BitBlt,hAndDC,esi,esi,i_width,i_height,hMemDC,esi,esi,SRCAND
 invoke BitBlt,hXorDC,esi,esi,i_width,i_height,hMemDC,esi,esi,SRCINVERT
 mov    ii.fIcon,TRUE
 mov    ii.xHotspot,0
 mov    ii.yHotspot,0
 m2m    ii.hbmMask,hBmp_And
 m2m    ii.hbmColor,hBmp_Xor
 mov    edi,$invoke(CreateIconIndirect,ADDR ii)
 invoke DeleteDC,hMemDC
 invoke DeleteDC,hAndDC
 invoke DeleteDC,hXorDC
 invoke DeleteObject,hBmp_Main
 invoke DeleteObject,hBmp_And
 invoke DeleteObject,hBmp_Xor
 mov    eax,edi
 ret
CreateICON ENDP

Параметры:

i_width:DWORD - ширина
i_height:DWORD - высота
nNum:DWORD - число которое будет на иконке
bkgColor:DWORD - цвет фона
txtColor:DWORD - цвет текста

szI_Fmt это db '%d',0 в принципе можно и dwtoa использовать.


Дата: Окт 7, 2004 09:17:54

Забыл добавить - на выходе HICON который можно использовать соответственно, но потом на него
DestroyIcon надо делать :)


Дата: Окт 7, 2004 14:55:47

„цифры то совсем маленькие.три легко можно впихнуть,а мне больше и не надо :)“
Вот-вот. Три я уже не разгляжу :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070