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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Надпись на кнопке с картинкой  (Прочитано 16957 раз)
0 Пользователей и 1 Гость смотрят эту тему.
geograph
Гость
« : 27-08-2007 04:23 » 

Помогите пожалуйста!
Есть гуи программа на VC++ (WinAPI) в ней используются кнопки, на которых натянуты картинки вместе с текстом. Для каждой кнопки приходится рисовать отдельную картинку, т.к. текст тоже нарисован. Можно ли как-то написать текст прямо на кнопке с картинкой? Я пробовал TextOut текст выводится, но картинка пропадает, что делать?
Исходники примера приложены.

* test.rar (11.46 Кб - загружено 862 раз.)
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 27-08-2007 04:39 » 

Выводить текст нужно каждый раз, когда кнопка получает сообщение WM_PAINT.
Другим вариантом будет создать DC, поместить туда копию твоей картинки и нанести на нее текст. Так проделать для каждой такой кнопки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
geograph
Гость
« Ответ #2 : 27-08-2007 04:50 » 

А можно с примером? А еще лучше бы мои исходники поправить Улыбаюсь
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #3 : 27-08-2007 06:08 » 

geograph, извиняй, но я не буду писать пример - может кто другой захочет. Я лишь дал наводку, куда двигаться. Загляни в MSDN в раздел GDI.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
geograph
Гость
« Ответ #4 : 27-08-2007 09:35 » 

Ну ладно, тогда ответь на другой вопрос. Какой API функцией можно вырезать маленькие картинки из больших. Например я не хочу в том примере хранить каждую картинку отдельно, а хочу все вместе.
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #5 : 27-08-2007 09:42 » 

В Win32 API это гиморрный процесс.
1. Создать DC (CreateDC) с необх.параметрами и подключить к нему исходную картинку (SelectObject) (уже загруженную).
2. Создать, совместимый с первым, DC (CreateCompatibleDC), создать новую картинку желаемых размеров и подключить ко второму DC.
3. Использовать bitblt() для копирования из контекста в контекст.
4. Сохранить полученную картинку.

Пишу по памяти, т.к. оч.давно не занимался этим. Может кто подскажет более простой выход.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
geograph
Гость
« Ответ #6 : 27-08-2007 10:27 » 

Да что-то больше никто не знает наверно, все молчат.
А средствами С++ проще можно сделать?
Записан
RXL
Технический
Администратор

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

WWW
« Ответ #7 : 27-08-2007 10:48 » 

geograph, API и C++ - несравнимые вещи, т.к. одно - программный интерфейс, а другое - язык.
Записан

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

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


« Ответ #8 : 27-08-2007 12:49 » 

Перед тем как печатать текст на картинку, нужно воспользоваться функцией >SetBkMode<. Нужно выставить значение TRANSPARENT.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

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

WWW
« Ответ #9 : 27-08-2007 15:09 » 

geograph, если тебе нужно что-то более гуманное для работы с графикой, то нужно поискать подходящую библиотеку. Например, implib или gd.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
geograph
Гость
« Ответ #10 : 30-08-2007 04:47 » 

Всем спасибо нарисовал текст на кнопке. Еще сделал прозрачный фон на надписях (static), но при изменении значения текст накладывается один на другой. Пытаюсь исправить функцией InvalidateRect, но вручную RECT получать не хочется, т.к. много надписей а следующий код находит RECT не там где нужно а правее и ниже, подскажите как исправить?
Код:
RECT rt;
HWND hwndRect;
hwndRect = GetDlgItem(hwndMain,IDC_OBJECTS);
GetWindowRect(hwndRect,&rt);
InvalidateRect(hwndMain,&rt,true);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 30-08-2007 08:54 » 

попробуй UpdateWindow после InvalidateRect
Записан

Джон
просто
Администратор

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

« Ответ #12 : 30-08-2007 09:16 » 

Уже несколько раз поднималась темка. Прозрачные контроллы - труднейшая задача современной магии, те программирования. Просто - не делается.

geograph,  поищи на форуме - я честно не помню где и когда это было, а искать времени нет. НО это точно было неоднократно.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
geograph
Гость
« Ответ #13 : 31-08-2007 04:56 » 

в общем все перепробовал и остановился возможно не на самом лучшем варианте
Код:
ShowWindow(hwnd,SW_HIDE);
ShowWindow(hwnd,SW_SHOW);
Правда теперь мерцает сильно не знаю что с этим делать. Сначала вроде нормально, а потом разгоняется Улыбаюсь и начинает мерцать
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines