Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемы с полноцветными иконками в SystemTray,

4.4K
27 ноября 2003 года
rap
18 / / 27.11.2003
Собственно пишу на MS VC++.NET.
Иконку загружаю так:
trayIcon.hIcon=(HICON) LoadImage(AfgGetAppInstance(),(LPCSTR) IDI_ICON1, IMAGE_ICON,16,16, LT_DEFAULTCOLOR);

(писал на память, может где наврал)

Где то на форумах нашел, что LoadImage лучше подгружает, чем LoadIcon. Поэтому и гружу через нее. Хотя результаты друг от друга не отличаются ...=(во всяком случае под Win2k)

Мучался на Win2k полночи, ну никак не захотела показываться в полноцвете - уродско конвертируется в 16 цветов, похоже. УТром попробовал на машине с WinXP - все отлично, красочная икона. Попал совсем в растерянность. Под Win98,Me,Nt попробовать нет возможности, т.к. нет уже таких машин у моих знакомых...=)

Буду очень признателен за любой совет.

Кстати, если пытаюсь доставить 16-ти цветную иконку, но с нестандартной палитрой происходит тоже деформация цветов.
4.4K
30 ноября 2003 года
rap
18 / / 27.11.2003
ЛЮДИ!!! Ну хоть какой-нибудь совет!!!

Приведу ка я фрагменты кода:

Код:
void Cuser_statDlg::CreateTrayIcon(void)
{
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
Код:
// stdafx.h : include file for standard system include files,
// 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>
239
30 ноября 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by rap
Мучался на Win2k полночи, ну никак не захотела показываться в полноцвете - уродско конвертируется в 16 цветов, похоже. УТром попробовал на машине с WinXP - все отлично, красочная икона. Попал совсем в растерянность. Под Win98,Me,Nt попробовать нет возможности, т.к. нет уже таких машин у моих знакомых...=)



Ответ печален - в виндах 95/98/2k/ME везде 16-цветная иконка, как это ни печально. С эти ничего не поделать, разве что иконку перерисовать... или в XP работать %)

4.4K
01 декабря 2003 года
rap
18 / / 27.11.2003
Не верю!

1. У меня дома/на работе - W2k, слушаю винамп, люблю когда он в трее и иконка у него 256 цветов и выводится НОРМАЛЬНО! (по ресурсам ехешника смотрел - икона 256 цветов!)

А у меня 16 цветная иконка с палитрой отображается с искажениями!

О! А может стоит палитру подгрузить??? Только как, уже все забыл...=(
239
01 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Цитата:
Originally posted by rap
Не верю!

1. У меня дома/на работе - W2k, слушаю винамп, люблю когда он в трее и иконка у него 256 цветов и выводится НОРМАЛЬНО! (по ресурсам ехешника смотрел - икона 256 цветов!)



Не может быть! У меня винамповская иконка (которая не первая) отображается с искажением, да и некоторые другие тоже. В том, что 16 цветов допустимы, у меня сомнений нет. Вопрос с палитрой - не знаю, может и можно подгрузить - не пробовал.

У тебя какой Win2k?

415
01 декабря 2003 года
SLA
274 / / 08.08.2003
То, что до WinXP в трее могли быть только 16-цветные иконки - установленный факт.
2 rap:
Пришли-ка скриншот с иконкой WinAmp'а. Может быть, там 16-цветная иконка С ПАЛИТРОЙ?

У меня есть встречный вопрос:
Есть иконка, в ней два формата: 32х32 и 16х16 пикселей.
Как указать программе, что она должна загрузить в трей именно иконку 16х16, а не 32х32 сжатую (и изуродованную) до размеров 16х16 ?
4.4K
02 декабря 2003 года
rap
18 / / 27.11.2003
Цитата:
Originally posted by SLA
То, что до 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-ти цветная. Но палитру то как подгрузить???

401
03 декабря 2003 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by SLA
То, что до WinXP в трее могли быть только 16-цветные иконки - установленный факт.
2 rap:
Пришли-ка скриншот с иконкой WinAmp'а. Может быть, там 16-цветная иконка С ПАЛИТРОЙ?

У меня есть встречный вопрос:
Есть иконка, в ней два формата: 32х32 и 16х16 пикселей.
Как указать программе, что она должна загрузить в трей именно иконку 16х16, а не 32х32 сжатую (и изуродованную) до размеров 16х16 ?



используй LoadImage указуя нужный размер

4.4K
04 декабря 2003 года
rap
18 / / 27.11.2003
Цитата:
Originally posted by Br@in RIPper


используй LoadImage указуя нужный размер



Не спасло!
Делаю так:

 
Код:
trayIcon.hIcon = (HICON) LoadImage(AfxGetInstanceHandle(), icon,IMAGE_ICON,16,16,LR_DEFAULTCOLOR);


А результат опять...=(((
401
04 декабря 2003 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by rap


Не спасло!
Делаю так:
 
Код:
trayIcon.hIcon = (HICON) LoadImage(AfxGetInstanceHandle(), icon,IMAGE_ICON,16,16,LR_DEFAULTCOLOR);


А результат опять...=(((



тогда так:

 
Код:
HRSRC hIconRes=FindResource(hInstance, (LPSTR)ICON_ID, RT_GROUP_ICON);
    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.
Если известен идентификатор иконки (именно иконки а не группы) - тогда проще:
 
Код:
int iSize=GetSystemMetrics(SM_CXSMICON);
    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, но всегда равно размеру иконки в трее :)
4.4K
04 декабря 2003 года
rap
18 / / 27.11.2003
Цитата:
Originally posted by Br@in RIPper


тогда так:
 
Код:
HRSRC hIconRes=FindResource(hInstance, (LPSTR)ICON_ID, RT_GROUP_ICON);
    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.
Если известен идентификатор иконки (именно иконки а не группы) - тогда проще:
 
Код:
int iSize=GetSystemMetrics(SM_CXSMICON);
    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. А то конверчу чем попало...=)))

239
04 декабря 2003 года
Dolonet
1.7K / / 20.05.2000
Лови программку!
401
05 декабря 2003 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by rap


Весело, но результата никакого, только код увеличился...=)))

Может проблема все таки кроется в дерикивах stdafx ???

Кстати, может подскажешь прогу, которая конвертит bmp->ico. А то конверчу чем попало...=)))



Странно, у меня win2000 - все работает... Ты уверен, что правильно сделал иконку/файл ресурсов?
может, действительно, stdafx как-то поганит файл ресурсов...

4.4K
05 декабря 2003 года
rap
18 / / 27.11.2003
Цитата:
Originally posted by Br@in RIPper


Странно, у меня win2000 - все работает... Ты уверен, что правильно сделал иконку/файл ресурсов?
может, действительно, stdafx как-то поганит файл ресурсов...



Да в ресурсах все верно, кинь плиз ссылку на программу в который ты делаешь иконки, только...

По стдафк, кажется все таки он, т.к. пока эксперементировал пока не поправил не работалы _WIN32_IE баллонные подсказки...

Кстати, паганится иконки могут по разному:
1. Первый вариант - вообще убожество, непонятно что собственно загрузили
2. Отличается основной цыет заливки - вместо оранжевого - желтый... И там еще иконка менятся умеет, есть еще с красным крестом, так тоже крест красный, все ок, а заливка лого - желтая...=( Тод ХП все ок...=( Сейчас использую LoadImage. Паганится окончательно, если использовать LoadIcon.

401
05 декабря 2003 года
Br@in RIPper
289 / / 15.02.2003
Цитата:
Originally posted by rap

...кинь плиз ссылку на программу в который ты делаешь иконки, только...



иконки делаю в стандартном редакторе в IDE от Microsoft Visual C v6

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог