Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Анимированная иконка в трее


Автор: jonie 21.8.2005, 13:24
Несколько раз видел в программах (таких как winRAR при архивировании в фоне) что иконка в трее изменяется (появляется индикаторы и т.д.). При этом в самих файлах не было найдено 10 (или более) иконок (картинок), т.е. программа как-то изменяет уже существующую иконку, а потом подменяет ею предыдущую.
Вопрос:Как сделать подобное? (с засовыванием иконки в трей, ее заменой трабл нет).

Автор: chaos 22.8.2005, 07:21
1) можно засовывать в трэй анимированную иконку
2) можно брать HDC иконки в трэе и рисовать на ней

Автор: ManiaK 22.8.2005, 07:45
3) Самое просто и надёжное: ставить в таймере смену трей-иконок.

(не уверен, что анимированные иконки работают в трее)

Автор: Denn 22.8.2005, 08:52
jonie
а сколько там было иконок? если одна, то прога сама рисует.

Автор: jonie 22.8.2005, 11:40
Цитата
jonie
а сколько там было иконок? если одна, то прога сама рисует.
В том и смысл что вроде одна (в ресурсах только одна - точно).
Цитата
3) Самое просто и надёжное: ставить в таймере смену трей-иконок.
Хех, это ежу понятно...задача именно в том и состоит, чтобы не делать 10 (или более) иконок....
Цитата
1) можно засовывать в трэй анимированную иконку
Стоит попробывать, не уверен, что заработает
Цитата
2) можно брать HDC иконки в трэе и рисовать на ней
А поподробнее как получить HDC иконки в трее...пример приветствуется.

Автор: Guest 31.8.2005, 22:20
Вот это может поможет http://www.sources.ru/cpp/cpp_cmetericon.shtml

Автор: jonie 14.5.2006, 15:29
давно нашел ответ) но все забывал написать.
В кратце он примерно таков:
создаем memory DC
создаем битмап. рисуем на нем все что хотим (хоть цифры например).
переводим его в значек (MSDN : CreateIconIndirect)

выкапано откуда-то оттуда....
---------------------------
http://www.wasm.ru/forum/index.php?action=vthread&topic=14069&forum=4&page=-1
---------------------------
хз куда код свой дел уже)) но работало. 

Автор: jonie 19.5.2006, 09:55
Вот пример кода... думаю это может быть интересно (чтобы не думать))
Код

/*
  НЕ передавайте строку что больше 3-х символов
  (качество будет отврат + см. код)
  По аналогии рисуем _что_ хотите.
*/
HICON CreateIconFromText(LPCTSTR text,COLORREF color)
{

int cxIcon = GetSystemMetrics(SM_CXSMICON);
int cyIcon = GetSystemMetrics(SM_CYSMICON);

HDC hdcDisplay = GetDC(NULL);
if (!hdcDisplay){
    return NULL;
}

HDC hdcXOR = CreateCompatibleDC(hdcDisplay);
if (!hdcXOR){
    ReleaseDC(NULL, hdcDisplay);
    return NULL;
}

HDC hdcAND = CreateCompatibleDC(hdcXOR);
if (!hdcAND){
    DeleteDC(hdcXOR);
    ReleaseDC(NULL, hdcDisplay);
    return NULL;
}

ICONINFO iconinfo;
ZeroMemory(&iconinfo,sizeof(ICONINFO));
iconinfo.fIcon = TRUE;

iconinfo.hbmMask = CreateCompatibleBitmap(hdcDisplay,cxIcon, cyIcon);
if (!iconinfo.hbmMask){
    DeleteDC(hdcAND);
    DeleteDC(hdcXOR);
    ReleaseDC(NULL, hdcDisplay);
    return NULL;
}

iconinfo.hbmColor = CreateCompatibleBitmap(hdcDisplay, cxIcon, cyIcon);
if (!iconinfo.hbmColor){
    DeleteObject(iconinfo.hbmMask);
    DeleteDC(hdcAND);
    DeleteDC(hdcXOR);
    ReleaseDC(NULL, hdcDisplay);
    return NULL;
}

ReleaseDC(NULL, hdcDisplay);

HBITMAP hbmMaskOld  = (HBITMAP)SelectObject(hdcAND, iconinfo.hbmMask);
PatBlt(hdcAND, 0, 0, cxIcon, cyIcon, WHITENESS);

HBITMAP hbmColorOld = (HBITMAP)SelectObject(hdcXOR, iconinfo.hbmColor);
PatBlt(hdcXOR, 0, 0, cxIcon, cyIcon, BLACKNESS);

LOGFONT lf;
ZeroMemory(&lf,sizeof(LOGFONT));
lf.lfCharSet            = ANSI_CHARSET;
lf.lfOutPrecision       = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision      = CLIP_DEFAULT_PRECIS;
lf.lfQuality            = ANTIALIASED_QUALITY; //DEFAULT_QUALITY;
lf.lfPitchAndFamily     = DEFAULT_PITCH;
lf.lfHeight                = cyIcon;
lf.lfWidth                = cxIcon / 3; //делим на кол-во букв (3 макс для читабельного текста)
lf.lfWeight                = FW_NORMAL;
strcpy_s(lf.lfFaceName,_countof(lf.lfFaceName),TEXT("Arial"));

HFONT hfontXOROld  = NULL;
HFONT hfontANDOld  = NULL;
HFONT hfont = CreateFontIndirect(&lf);
if (hfont){
    hfontXOROld  = (HFONT)SelectObject(hdcAND, hfont);
    hfontANDOld  = (HFONT)SelectObject(hdcXOR, hfont);
}

COLORREF rgbOld        = SetTextColor(hdcXOR, color);
int nBkModeXOROld   = SetBkMode(hdcAND,  TRANSPARENT);
int nBkModeANDOld   = SetBkMode(hdcXOR, TRANSPARENT);

RECT rc; rc.left = 0; rc.top = 0; rc.right = cxIcon; rc.bottom = cyIcon;

DrawText(hdcAND,  text, -1, &rc,  DT_CENTER | DT_VCENTER | DT_SINGLELINE);
DrawText(hdcXOR, text, -1, &rc,  DT_CENTER | DT_VCENTER | DT_SINGLELINE);

SetBkMode(hdcAND,  nBkModeXOROld);
SetBkMode(hdcXOR, nBkModeANDOld);
SetTextColor(hdcXOR, rgbOld);

if (hfontXOROld)
    SelectObject(hdcAND, hfontXOROld);
if (hfontANDOld)
    SelectObject(hdcXOR, hfontANDOld);
if (hfont)
    DeleteObject(hfont);

if (hbmMaskOld)
    SelectObject(hdcAND, hbmMaskOld);
if (hbmColorOld)
    SelectObject(hdcXOR, hbmColorOld);

DeleteDC(hdcAND);
DeleteDC(hdcXOR);

HICON hIcon = CreateIconIndirect(&iconinfo);

DeleteObject(iconinfo.hbmColor);
DeleteObject(iconinfo.hbmMask);

return hIcon;
}

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)