Как создавать иконки?

Тема в разделе "WASM.WIN32", создана пользователем xmt, 6 окт 2004.

  1. xmt

    xmt New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2003
    Сообщения:
    4
    Адрес:
    Ukraine
    Увидел вот давеча программку,которая показывает количество свободной памяти в иконке в трее.И стало мне интересно,как можно создавать программно иконки вообще и как перевести число в графику чтоб показать его в иконке?
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xmt

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



    как перевести число в графику

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



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



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



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

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105




    Я конечно в"едливый, но размер иконки не позволяет

    показать больше 2-х цифр. Или это было что-то отличное

    он иконки, либо ты спутал с "всплывающим сообщением"

    у иконки в трее. На это есть специальное API вроде.
     
  4. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    Узрейте Task Manager в трее и откажитесь от цифр.

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

    Так что лучше, чтобы было с файлом -> нарисовать самому.
     
  5. xmt

    xmt New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2003
    Сообщения:
    4
    Адрес:
    Ukraine
    уже разобрался,спасибо за помощь.правда я сделал немного по другому: засунул в ресурсы пустую иконку,потом через GetIconInfo достал все что нужно из нее,и TextOut`oм написал циферки.вот так вот



    Я конечно в"едливый, но размер иконки не позволяет

    показать больше 2-х цифр.


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

    s0rg New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    6
    Адрес:
    Russia
    Можно так:


    Код (Text):
    1.  
    2. CreateICON PROC USES edi esi i_width:DWORD,i_height:DWORD,nNum:DWORD,bkgColor:DWORD,txtColor:DWORD
    3.  
    4. LOCAL hBmp_Main:DWORD
    5. LOCAL hBmp_And:DWORD
    6. LOCAL hBmp_Xor:DWORD
    7. LOCAL hMemDC:DWORD
    8. LOCAL hAndDC:DWORD
    9. LOCAL hXorDC:DWORD
    10. LOCAL szStr[4]:BYTE
    11. LOCAL lFont:LOGFONT
    12. LOCAL ii:ICONINFO
    13. LOCAL tr:RECT
    14.  
    15.  xor    esi,esi
    16.  mov    edi,      $invoke(CreateDC,ADDR szDisplay,esi,esi,esi)
    17.  mov    hMemDC,   $invoke(CreateCompatibleDC,edi)
    18.  mov    hBmp_Main,$invoke(CreateCompatibleBitmap,edi,i_width,i_height)
    19.  mov    hAndDC,   $invoke(CreateCompatibleDC,edi)
    20.  mov    hBmp_And, $invoke(CreateCompatibleBitmap,edi,i_width,i_height)
    21.  mov    hXorDC,   $invoke(CreateCompatibleDC,edi)
    22.  mov    hBmp_Xor, $invoke(CreateCompatibleBitmap,edi,i_width,i_height)
    23.  invoke DeleteDC,edi
    24.  invoke DeleteObject,$invoke(SelectObject,hMemDC,hBmp_Main)
    25.  invoke DeleteObject,$invoke(SelectObject,hAndDC,hBmp_And)
    26.  invoke DeleteObject,$invoke(SelectObject,hXorDC,hBmp_Xor)
    27.  invoke CreateSolidBrush,bkgColor
    28.  invoke SelectObject,hMemDC,eax
    29.  invoke DeleteObject,eax
    30.  invoke PatBlt,hMemDC,esi,esi,i_width,i_height,PATCOPY
    31.  invoke SetTextCharacterExtra,hMemDC,-1
    32.  invoke SetTextColor,hMemDC,txtColor
    33.  invoke SetBkMode,hMemDC,TRANSPARENT
    34.  invoke GetCurrentObject,hMemDC,OBJ_FONT
    35.  mov    ebx,eax
    36.  invoke GetObject,ebx,SIZEOF LOGFONT,ADDR lFont
    37.  mov    lFont.lfWeight,FW_ULTRABOLD
    38.  mov    edi,$invoke(CreateFontIndirect,ADDR lFont)
    39.  invoke DeleteObject,$invoke(SelectObject,hMemDC,edi)
    40.  invoke wsprintf,ADDR szStr,ADDR szI_Fmt,nNum
    41.  mov    tr.left,0
    42.  mov    tr.top,0
    43.  m2m    tr.bottom,i_height
    44.  m2m    tr.right,i_width
    45.  invoke DrawText,hMemDC,ADDR szStr,-1,ADDR tr,DT_CENTER
    46.  invoke DeleteObject,edi
    47.  invoke BitBlt,hAndDC,esi,esi,i_width,i_height,hMemDC,esi,esi,SRCAND
    48.  invoke BitBlt,hXorDC,esi,esi,i_width,i_height,hMemDC,esi,esi,SRCINVERT
    49.  mov    ii.fIcon,TRUE
    50.  mov    ii.xHotspot,0
    51.  mov    ii.yHotspot,0
    52.  m2m    ii.hbmMask,hBmp_And
    53.  m2m    ii.hbmColor,hBmp_Xor
    54.  mov    edi,$invoke(CreateIconIndirect,ADDR ii)
    55.  invoke DeleteDC,hMemDC
    56.  invoke DeleteDC,hAndDC
    57.  invoke DeleteDC,hXorDC
    58.  invoke DeleteObject,hBmp_Main
    59.  invoke DeleteObject,hBmp_And
    60.  invoke DeleteObject,hBmp_Xor
    61.  mov    eax,edi
    62.  ret
    63. CreateICON ENDP
    64.  


    Параметры:



    i_width:lol: WORD - ширина

    i_height:lol: WORD - высота

    nNum:lol: WORD - число которое будет на иконке

    bkgColor:lol: WORD - цвет фона

    txtColor:lol: WORD - цвет текста



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

    s0rg New Member

    Публикаций:
    0
    Регистрация:
    7 апр 2004
    Сообщения:
    6
    Адрес:
    Russia
    Забыл добавить - на выходе HICON который можно использовать соответственно, но потом на него

    DestroyIcon надо делать :)
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105


    Вот-вот. Три я уже не разгляжу :)