Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: как узнать размеры иконки?  (Прочитано 16065 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 03-08-2005 11:45 » 

Люди, полный тормоз в голове:

у меня есть форма, на ней - статик - элемент, координаты которого мне известны, также есть иконка.
Надо - динамически загрузить эту иконку при выполнении определенных условий и поместить слева от статик - элемента.
Мои соображения по этому поводу - в тот самый момент "Х" создать статик - элемент и загрузить в него иконку приблизительно так:

Код:
CStatic myStatic;
myStatic.Create(...);
myStatic.SetIcon( ::LoadIcon(NULL, IDI_ICON1) );

Проблема: при вызове функции Create() необходимо знать размеры иконки. А как?
Я сделала обьект типа CBitmap и вызвала GetBitmapDimension(), но там вылетает ошибка...  Ха-ха-ха

И общий вопрос: можно ли эту задачу решить без создания дополнительного статик - элемента?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 03-08-2005 16:08 » 

Icons:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/resources/icons.asp

С помощью DrawIconEx() можно растянуть под требуемый размер.

Вообще-то, поместив иконку в екзешник ты уже должна знать его размер. Кроме того, иконка может содержать несколько изображений с разными параметрами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 04-08-2005 09:24 » 

RXL,

мда, похоже прямых путей не найти Ага

Тогда еще один вопросик: если рисовать ее, родимую, с помощью DrawIconEx(), как определить, что по ней щелкнули мышкой?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #3 : 04-08-2005 11:12 » 

Т.е. самый простой путь - при прорисовке иконки запоминать ее координаты, а потом в функции OnLButtonDown() для диалога проверять, находится ли точка щелчка в этом прямоугольнике.
А вот каков красивый путь?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 04-08-2005 12:01 » 

А разве получить событие от static нельзя?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 04-08-2005 12:12 » 

Malaja, косвенный путь узнать размер есть. Через функцию GetIconInfo.
Эта функция заполняет переменную типа ICONINFO.
В ней есть два поля
Цитата
xHotspot

Specifies the x-coordinate of a cursor's hot spot. If this structure defines an icon, the hot spot is always in the center of the icon, and this member is ignored.

yHotspot

Specifies the y-coordinate of the cursor's hot spot. If this structure defines an icon, the hot spot is always in the center of the icon, and this member is ignored.
Когда я проверял, функция заполнила эти поля ровно по половине размера.
И еше, вот что написано в МСДН  о размере иконок
Цитата
Windows uses four icon sizes: system small, system large, shell small, and shell large.

The system small icon is displayed in the window caption. To change the size of the system small icon, start the Display control panel applet, click the Appearance tab, select Caption Buttons from the Item list, then set the Size field. To retrieve the size of the system small icon, call the GetSystemMetrics function with SM_CXSMICON and SM_CYSMICON.
The system large icon is mainly used by applications, but it is also displayed in the Alt+Tab dialog. The CreateIconFromResource, DrawIcon, ExtractIcon, and LoadIcon functions all use system large icons. The size of the system large icon is defined by the video driver, therefore it cannot be changed. You can retrieve the size of the system large icon by calling GetSystemMetrics with SM_CXICON and SM_CYICON.

The CreateIcon, CreateIconFromResourceEx, and CreateIconIndirect functions can be used to work with icons in sizes other than system large.
The shell small icon is used in the Windows Explorer and the common dialogs. Currently, this defaults to the system small size. To retrieve the size of the shell small icon, use the SHGetFileInfo function with SHGFI_SHELLICONSIZE | SHGFI_SMALLICON to retrieve the handle of the system image list, then the ImageList_GetIconSize function to get the icon size.

The shell large icon is used on the desktop. To change the size of the large icon, start the Display control panel applet, click the Appearance tab, select Icon from the Item list, then set the Size field (this size is stored in the registry, under HKEY_CURRENT_USER\Control Panel, Desktop\WindowMetrics\Shell Icon Size). You must also click the Plus! tab and select the Use large icons check box. To retrieve the size of the shell large icon, use the SHGetFileInfo function with SHGFI_SHELLICONSIZE to retrieve the handle of the system image list, then the ImageList_GetIconSize function to get the icon size.

The Start menu uses either shell small icons or shell large icons, depending on whether the Use large icons check box is selected.
Your application should supply icon resources in the following sizes:

·   48x48, 256 color
·   32x32, 16 color
·   16x16 pixels, 16 color

 

When filling in the WNDCLASSEX structure to be used in registering your window class, set the hIcon member to the 32x32 icon and the hIconSm member to the 16x16 icon. For more information about class icons, see Class Icons.
« Последнее редактирование: 20-12-2007 20:33 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 04-08-2005 12:16 » 

RXL,

как?Не понял
Я создаю элементы в процессе выполнения программы, т.е. у меня есть базовый #define   IDC_STATIC_BASE 100, а все элементы получают индекс IDC_STATIC_BASE + i (и их может быть много Ага ). Т.е. как получить их события в этом случае?
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 04-08-2005 12:20 » 

Создай его до, но не устанавливай иконки - в процессе ее и задашь.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 04-08-2005 12:33 » 

Статик сам по себе не может помоему обрабатывать сообшения. Его функция только изображать статическую информацию. Попробуй применить более активные элементы. Например кнопки.
Цитата
STATIC   Designates a simple text field, box, or rectangle used to label, box, or separate other controls. Static controls take no input and provide no output.
« Последнее редактирование: 04-08-2005 12:35 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #9 : 04-08-2005 14:04 » new

Finch,

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

RXL,

при загрузке иконок я буду просто сохранять их координаты в массиве, а при обработке сообщения нажатия кнопки мыши для диалога просто проверять, на какой из иконок был сделан щелчок.
Иначе будет еще сложнее Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines