geograph
Гость
|
|
« : 27-08-2007 04:23 » |
|
Помогите пожалуйста! Есть гуи программа на VC++ (WinAPI) в ней используются кнопки, на которых натянуты картинки вместе с текстом. Для каждой кнопки приходится рисовать отдельную картинку, т.к. текст тоже нарисован. Можно ли как-то написать текст прямо на кнопке с картинкой? Я пробовал TextOut текст выводится, но картинка пропадает, что делать? Исходники примера приложены.
|
test.rar (11.46 Кб - загружено 898 раз.)
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #1 : 27-08-2007 04:39 » |
|
Выводить текст нужно каждый раз, когда кнопка получает сообщение WM_PAINT. Другим вариантом будет создать DC, поместить туда копию твоей картинки и нанести на нее текст. Так проделать для каждой такой кнопки.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
geograph
Гость
|
|
« Ответ #2 : 27-08-2007 04:50 » |
|
А можно с примером? А еще лучше бы мои исходники поправить
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #3 : 27-08-2007 06:08 » |
|
geograph, извиняй, но я не буду писать пример - может кто другой захочет. Я лишь дал наводку, куда двигаться. Загляни в MSDN в раздел GDI.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
geograph
Гость
|
|
« Ответ #4 : 27-08-2007 09:35 » |
|
Ну ладно, тогда ответь на другой вопрос. Какой API функцией можно вырезать маленькие картинки из больших. Например я не хочу в том примере хранить каждую картинку отдельно, а хочу все вместе.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
|
|
« Ответ #7 : 27-08-2007 10:48 » |
|
geograph, API и C++ - несравнимые вещи, т.к. одно - программный интерфейс, а другое - язык.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #8 : 27-08-2007 12:49 » |
|
Перед тем как печатать текст на картинку, нужно воспользоваться функцией > SetBkMode<. Нужно выставить значение TRANSPARENT.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
|
|
« Ответ #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);
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 30-08-2007 08:54 » |
|
попробуй UpdateWindow после InvalidateRect
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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);
Правда теперь мерцает сильно не знаю что с этим делать. Сначала вроде нормально, а потом разгоняется и начинает мерцать
|
|
|
Записан
|
|
|
|
|