Увидел вот давеча программку,которая показывает количество свободной памяти в иконке в трее.И стало мне интересно,как можно создавать программно иконки вообще и как перевести число в графику чтоб показать его в иконке?
xmt Иконка - это файл, который имеет формат. как перевести число в графику Создать дисплейный контекст, и рисовать на нем число поциферно, т.е. сделать 10 (0...9) подпрограмм, которые в нужной позиции контекста рисуют (точками или линиями) цифру или создать 10 битмапов (можно на'PrintScreen'ить чужие) и BitBlt'ить их в нужной позиции контекста. Можно перевести число в строку, а потом воспользоваться gdi'шной функций вывода строки на контекст. Итого два этапа. Первый - создать изображение, второй - сделать из изображения файл иконки. Возможно, существует способ обойтись без файла, а создавать ресурс в памяти. Где-то в инете встречал код, который определяет место иконки в tray'е, и может быть вообще можно рисовать поверх tray'a.
Я конечно в"едливый, но размер иконки не позволяет показать больше 2-х цифр. Или это было что-то отличное он иконки, либо ты спутал с "всплывающим сообщением" у иконки в трее. На это есть специальное API вроде.
Узрейте Task Manager в трее и откажитесь от цифр. А нарисовать иконку можно в контексте без файла как говорил q_q. У мастдая есть целая куча различных апишек для работы с подобной графикой, но это гиморно в данном случае. Так что лучше, чтобы было с файлом -> нарисовать самому.
уже разобрался,спасибо за помощь.правда я сделал немного по другому: засунул в ресурсы пустую иконку,потом через GetIconInfo достал все что нужно из нее,и TextOut`oм написал циферки.вот так вот Я конечно в"едливый, но размер иконки не позволяет показать больше 2-х цифр. цифры то совсем маленькие.три легко можно впихнуть,а мне больше и не надо
Можно так: Код (Text): 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_widthWORD - ширина i_heightWORD - высота nNumWORD - число которое будет на иконке bkgColorWORD - цвет фона txtColorWORD - цвет текста szI_Fmt это db '%d',0 в принципе можно и dwtoa использовать.
Забыл добавить - на выходе HICON который можно использовать соответственно, но потом на него DestroyIcon надо делать