Проблемы с полноцветными иконками в SystemTray,
Иконку загружаю так:
trayIcon.hIcon=(HICON) LoadImage(AfgGetAppInstance(),(LPCSTR) IDI_ICON1, IMAGE_ICON,16,16, LT_DEFAULTCOLOR);
(писал на память, может где наврал)
Где то на форумах нашел, что LoadImage лучше подгружает, чем LoadIcon. Поэтому и гружу через нее. Хотя результаты друг от друга не отличаются ...=(во всяком случае под Win2k)
Мучался на Win2k полночи, ну никак не захотела показываться в полноцвете - уродско конвертируется в 16 цветов, похоже. УТром попробовал на машине с WinXP - все отлично, красочная икона. Попал совсем в растерянность. Под Win98,Me,Nt попробовать нет возможности, т.к. нет уже таких машин у моих знакомых...=)
Буду очень признателен за любой совет.
Кстати, если пытаюсь доставить 16-ти цветную иконку, но с нестандартной палитрой происходит тоже деформация цветов.
Приведу ка я фрагменты кода:
{
NOTIFYICONDATA trayIcon;
trayIcon.hWnd = m_hWnd;
trayIcon.hIcon = (HICON) LoadImage(AfxGetInstanceHandle(), (LPCTSTR) IDR_MAINFRAME,IMAGE_ICON,GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON),LR_DEFAULTCOLOR);
trayIcon.uID = 5100;
trayIcon.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
trayIcon.uCallbackMessage = WM_SYSCOMMAND;
sprintf(trayIcon.szTip,"Royal User Agent");
trayIcon.cbSize = sizeof(NOTIFYICONDATA);
Shell_NotifyIcon(NIM_ADD,&trayIcon);
}
stdafx.h
// or project specific include files that are used frequently,
// but are changed infrequently
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
#endif
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0500 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x5000 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0500 // Change this to the appropriate value to target IE 5.0 or later.
#endif
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
// turns off MFC's hiding of some common and often safely ignored warning messages
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxdisp.h> // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxsock.h> // MFC socket extensions
#include <afxdisp.h>
Мучался на Win2k полночи, ну никак не захотела показываться в полноцвете - уродско конвертируется в 16 цветов, похоже. УТром попробовал на машине с WinXP - все отлично, красочная икона. Попал совсем в растерянность. Под Win98,Me,Nt попробовать нет возможности, т.к. нет уже таких машин у моих знакомых...=)
Ответ печален - в виндах 95/98/2k/ME везде 16-цветная иконка, как это ни печально. С эти ничего не поделать, разве что иконку перерисовать... или в XP работать %)
1. У меня дома/на работе - W2k, слушаю винамп, люблю когда он в трее и иконка у него 256 цветов и выводится НОРМАЛЬНО! (по ресурсам ехешника смотрел - икона 256 цветов!)
А у меня 16 цветная иконка с палитрой отображается с искажениями!
О! А может стоит палитру подгрузить??? Только как, уже все забыл...=(
Не верю!
1. У меня дома/на работе - W2k, слушаю винамп, люблю когда он в трее и иконка у него 256 цветов и выводится НОРМАЛЬНО! (по ресурсам ехешника смотрел - икона 256 цветов!)
Не может быть! У меня винамповская иконка (которая не первая) отображается с искажением, да и некоторые другие тоже. В том, что 16 цветов допустимы, у меня сомнений нет. Вопрос с палитрой - не знаю, может и можно подгрузить - не пробовал.
У тебя какой Win2k?
2 rap:
Пришли-ка скриншот с иконкой WinAmp'а. Может быть, там 16-цветная иконка С ПАЛИТРОЙ?
У меня есть встречный вопрос:
Есть иконка, в ней два формата: 32х32 и 16х16 пикселей.
Как указать программе, что она должна загрузить в трей именно иконку 16х16, а не 32х32 сжатую (и изуродованную) до размеров 16х16 ?
То, что до WinXP в трее могли быть только 16-цветные иконки - установленный факт.
2 rap:
Пришли-ка скриншот с иконкой WinAmp'а. Может быть, там 16-цветная иконка С ПАЛИТРОЙ?
У меня есть встречный вопрос:
Есть иконка, в ней два формата: 32х32 и 16х16 пикселей.
Как указать программе, что она должна загрузить в трей именно иконку 16х16, а не 32х32 сжатую (и изуродованную) до размеров 16х16 ?
А что тогда значит это:
hIcon
Handle to the icon to be added, modified, or deleted. To avoid icon distortion, be aware that notification area icons have different levels of support under different versions of Microsoft® Windows®. Windows 95, Windows 98, and Microsoft Windows NT® 4.0 support icons of up to 4 bits per pixel (BPP). Windows Millennium Edition (Windows Me) and Windows 2000 support icons of a color depth up to the current display mode. Windows XP supports icons of up to 32 BPP.
Ладно, пусть палитра, но как её подгрузить???
Я уж добавил 16-цветную икону, но как подгрузить палитру???
А твой вопрос - незнаю к чему, у меня такой проблемы нет, как уродование самой иконки, только цвета меня волнуют. Но я бы просто сделал отдельный ресурс для трея, или путем эксперементов от LoadImage добился бы того, чего стоит.
По поводу скрина - посмотрел, да 16-ти цветная. Но палитру то как подгрузить???
То, что до WinXP в трее могли быть только 16-цветные иконки - установленный факт.
2 rap:
Пришли-ка скриншот с иконкой WinAmp'а. Может быть, там 16-цветная иконка С ПАЛИТРОЙ?
У меня есть встречный вопрос:
Есть иконка, в ней два формата: 32х32 и 16х16 пикселей.
Как указать программе, что она должна загрузить в трей именно иконку 16х16, а не 32х32 сжатую (и изуродованную) до размеров 16х16 ?
используй LoadImage указуя нужный размер
используй LoadImage указуя нужный размер
Не спасло!
Делаю так:
А результат опять...=(((
Не спасло!
Делаю так:
А результат опять...=(((
тогда так:
BYTE *pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int iSize=GetSystemMetrics(SM_CXSMICON);
int id=LookupIconIdFromDirectoryEx(pIcon, true, iSize, iSize, LR_DEFAULTCOLOR);
hIconRes=FindResource(hInstance, (LPSTR)id, RT_ICON);
pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int len=SizeofResource(hInstance, hIconRes);
HICON hIcon=CreateIconFromResourceEx(pIcon, len, true, 0x00030000, iSize, iSize, LR_DEFAULTCOLOR);
почему-то не получается исползовать LockResource вместо LoadResource.
Если известен идентификатор иконки (именно иконки а не группы) - тогда проще:
hIconRes=FindResource(hInstance, (LPSTR)ICON_ID, RT_ICON);
pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int len=SizeofResource(hInstance, hIconRes);
HICON hIcon=CreateIconFromResourceEx(pIcon, len, true, 0x00030000, iSize, iSize, LR_DEFAULTCOLOR);
Идентификатор иконки можно посмотреть в каком-нибудь редакторе ресурсов, например в reshacker. Встроенные в IDE редакторы показывают только идентификатор группы
да, кстати, SM_CXSMICON не всегда равно 16, но всегда равно размеру иконки в трее :)
тогда так:
BYTE *pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int iSize=GetSystemMetrics(SM_CXSMICON);
int id=LookupIconIdFromDirectoryEx(pIcon, true, iSize, iSize, LR_DEFAULTCOLOR);
hIconRes=FindResource(hInstance, (LPSTR)id, RT_ICON);
pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int len=SizeofResource(hInstance, hIconRes);
HICON hIcon=CreateIconFromResourceEx(pIcon, len, true, 0x00030000, iSize, iSize, LR_DEFAULTCOLOR);
почему-то не получается исползовать LockResource вместо LoadResource.
Если известен идентификатор иконки (именно иконки а не группы) - тогда проще:
hIconRes=FindResource(hInstance, (LPSTR)ICON_ID, RT_ICON);
pIcon=(LPBYTE)LoadResource(hInstance, hIconRes);
int len=SizeofResource(hInstance, hIconRes);
HICON hIcon=CreateIconFromResourceEx(pIcon, len, true, 0x00030000, iSize, iSize, LR_DEFAULTCOLOR);
Идентификатор иконки можно посмотреть в каком-нибудь редакторе ресурсов, например в reshacker. Встроенные в IDE редакторы показывают только идентификатор группы
да, кстати, SM_CXSMICON не всегда равно 16, но всегда равно размеру иконки в трее :)
Весело, но результата никакого, только код увеличился...=)))
Может проблема все таки кроется в дерикивах stdafx ???
Кстати, может подскажешь прогу, которая конвертит bmp->ico. А то конверчу чем попало...=)))
Весело, но результата никакого, только код увеличился...=)))
Может проблема все таки кроется в дерикивах stdafx ???
Кстати, может подскажешь прогу, которая конвертит bmp->ico. А то конверчу чем попало...=)))
Странно, у меня win2000 - все работает... Ты уверен, что правильно сделал иконку/файл ресурсов?
может, действительно, stdafx как-то поганит файл ресурсов...
Странно, у меня win2000 - все работает... Ты уверен, что правильно сделал иконку/файл ресурсов?
может, действительно, stdafx как-то поганит файл ресурсов...
Да в ресурсах все верно, кинь плиз ссылку на программу в который ты делаешь иконки, только...
По стдафк, кажется все таки он, т.к. пока эксперементировал пока не поправил не работалы _WIN32_IE баллонные подсказки...
Кстати, паганится иконки могут по разному:
1. Первый вариант - вообще убожество, непонятно что собственно загрузили
2. Отличается основной цыет заливки - вместо оранжевого - желтый... И там еще иконка менятся умеет, есть еще с красным крестом, так тоже крест красный, все ок, а заливка лого - желтая...=( Тод ХП все ок...=( Сейчас использую LoadImage. Паганится окончательно, если использовать LoadIcon.
...кинь плиз ссылку на программу в который ты делаешь иконки, только...
иконки делаю в стандартном редакторе в IDE от Microsoft Visual C v6