Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование иконки в рантайме 
V
    Опции темы
Straight
Дата 2.6.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



Хочу динамически создать иконку с изменяемым изображением
В GDI+ вроде все просто:
Код

    Bitmap bitmap(16,16);
    Pen whitePen(Color(255, 255, 255));
    Graphics *graph = Graphics::FromImage(&bitmap);
    //что-нибудь рисуем, напрмер
    graph->DrawLine(&whitePen, 0, 15, 15, 15);
    graph->DrawLine(&whitePen, 0,  0, 15,  0);
    bitmap.GetHICON(&hIcon);


Но к сожалению в приложении GDI+ использовать нельзя. Как сделать то же самое используя чистый GDI?

Это сообщение отредактировал(а) Straight - 2.6.2009, 12:19
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



::DrawIconEx


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Straight
Дата 2.6.2009, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



Немного не то. В исходном коде создается битмап и из него создается иконка.
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



HICON CreateIconIndirect(
  PICONINFO piconinfo
);



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Straight
Дата 2.6.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



Да это понятно, в MSDN не забанен.
Непонятно чем проинициализировать ICONINFO::hbmMask (черно-белый битмап) и  ICONINFO::hbmColor (цветной).
Заметил что если hbmMask == 0, то иконка полностью черная.

PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Вот есть у меня пример создания иконки из текста.
Я думаю не трудно будет переработать под свои нужды
Код

//THE CODE WAS WRITTEN BY jonie
    /*
  НЕ передавайте строку что больше 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;
}


Это сообщение отредактировал(а) Andrey44 - 14.2.2010, 16:15


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
jonie
Дата 2.6.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Ы мой код.http://forum.vingrad.ru/forum/topic-62015/unread-1/hl/createiconfromtext/index.html
но там есть бага, у меня иногда после "выключения" из 3D игр например фон становится черным 8-(
я так и не решил ту проблему ... а потом забил.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Andrey44
Дата 3.6.2009, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



jonie, да, точно, я взял этот код на форуме, но уже забыл где и кто написал. smile 
Я подправил свой предыдущий пост. Спасибо за код.
Я правда его потом переделал под картинку и все нормально рботает.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Straight
Дата 3.6.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 28.4.2007

Репутация: нет
Всего: нет



Спасибо, хорошее решение.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.