С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/54: Рейтинг темы: голосов - 54, средняя оценка - 4.54
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213

Помогите создать окно с кнопками, графика win32 API

22.05.2011, 19:07. Показов 10153. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Используются только функции Win32 API.

Мне надо создать окно у которого background содержит картинку, окно не прямоугольное. (это я сделал).
Окно должно открываться из программы Console Application по требованию (т.е. через создание нового потока).
На форме окна должны находиться несколько кнопок (так же содержащих картинки, кроме того, они так же не прямоугольные). Как раз тут и проблемка.
Окно должно разворачиваться из трея и сворачиваться туда же (это уже есть).

Что я пробовал:
1. После создания окна при событии WM_CREATE, пытался создать кнопки динамически, но не получилось, либо есть проблема с прорисовкой, либо я не получаю от кнопок событий WM_COMMAND. Если идти этим путем, то как создать эти кнопки, чтобы так же принимать от них сообщения?

2. Пытался создать форму через ресурсы, добавил кнопки, установил им свойства Owner Draw. Окно приходится создавать через CreateDialog, что не очень подходит. Кнопки работают (без картинок), но если я добавляю в WM_COMMAND вызов MessageBox то сообщение появляется, но его нельзя закрыть, активировать или нажать на кнопку (сообщение в позиции inactive window).
Если же без CreateDialog то как добавить эту форму в окно? Как на ней рисовать? Как прорисовывать кнопки?

Помогите мне, я с графикой пока плохо знаком.
Если можно, маленький пример (можно без создания отдельного потока).
Окно с катинкой + кнопка на нем с картинкой.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2011, 19:07
Ответы с готовыми решениями:

Как перерисовывать окно в Win32 API?
Здравствуйте, при нажатие срелочки вверх должен выводиться текст, но возникает ошибка(использована неинициализированная локальная...

Не создается дочернее окно WIN32 Api
Не создается дочернее окно. Выдается ошибка: error LNK2019: ссылка на неразрешенный внешний символ "long __stdcall ChildWndProc(struct...

Программа на win32 api с тулбаром и меню, окно не появляется
Всем привет. Такой вопрос Взял программу из книги Литвиненко мини-блокнот с тулбаром ошибок компилятор не показывает но не...

10
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
23.05.2011, 01:15
В первом случае,Вы скорее всего кнопкам не указали их ID.
ID можно установить через SetWindowLong(hBut,GWL_ID,999);

А,какой из 2 вариантов нужен?
Можно сделать и первым и вторым случаем.Судя, как у Вас
фокусируеться диалог из ресурсов,предлагаю первый вариант.
Как с фокусом то?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
23.05.2011, 02:01  [ТС]
Может я не так выразился или не точно описал проблему, но..

В первом случае я пытался создать окно с помощью CreateWindow и стилем WS_POPUP. При этом у меня в окне нет Title, Border и т.д. Есть только чистое поле на котором я и рисую (приклеиваю картинку).
Соответственно нет никаких кнопок с ID. Вот мне и надо создать их динамически, да еще чтобы улавливать от них события и чтобы они были графическими.

Во втором случае я пользуюсь CreateDialog и загружаю ранее созданную в ресурсах форму, с кнопками и ID для каждой из них. Но в этом случае я не совсем понимаю как мне прорисовывать их.

Кстати я упоминал, что окно имеет не прямоугольную форму, а для этого я использую функцию SetWindowRgn.
Так вот с готовым диалогом у меня возникает проблема при формировании этого региона (точнее, он получается не той формы что надо, а меньше).

Поэтому мне и хотелось бы получить маленький примерчик или объяснение как создать окно с графикой и кнопками.
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
23.05.2011, 02:55
А какой у Вас e-mail?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
23.05.2011, 13:25  [ТС]
Мне удалось создать кнопку с помощью CreateWindow и SetWindowLong (спасибо Kovalsky2).

Однако есть вопрос:

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

На данный момент картинка прорисовывается при событии WM_PAINT главного окна. Как сделать, чтобы при нажатии на кнопку задействовалась функция прорисовки только кнопки, а не всего окна?

Т.е. при установленном свойстве кнопки OnwerDraw=true как задействовать этот самый OwnerDraw?
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
24.05.2011, 00:39
Теперь обрабатываем WM_DRAWITEM главного окна
C++
1
2
3
4
5
6
7
8
9
10
case WM_DRAWITEM:
{
    switch (wParam)
    {
        case IDC_BUTTON1://id установленное SetWindowLong 
        {
            DRAWITEMSTRUCT *dr=(DRAWITEMSTRUCT *)lParam;
        }
    }
}
структура DRAWITEMSTRUCT,содержит в себе всё что нам надо:
hDC - HDC батона куда выводить картинку
rcItem - размер
В зависимость от itemState - выводить нужную картинку
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
25.05.2011, 01:23  [ТС]
В общем попытался я прорисовывать кнопеки через WM_DRAWITEM.
Результат:
При появлении окна кнопки появляются как полагается, все хорошо.
Когда я нажимаю мышью на одну их кнопок картинка на ней меняется на нажатую (Clicked).
Когда я отпускаю кнопку мыши, то генерируется код WM_COMMAND, но...
Картинка не возвращается в положение не нежатой (UnClicked). Если поместить MessageBox в событие WM_COMMAND, то какртинка возвращается в положение UnCliked.

Вывод: WM_DRAWITEM реагирует только на изменение состояния кнопки, т.е Selected/Unselected, Focused/Unfocused.
И вовсе не реагирует на действие мыши (MouseButtonDown/MouseButtonUp). А это именно то, чего мне нужно добиться. Мне нужно именно создать эффект 'нажатия' на кнопку.

Пытался поместить обработку для WM_LMOUSEDOWN и WM_LMOUSEUP в родительское окно, но эти события не происходят на самих кнопках, только в родительском окне (Имеется ввиду MainWinProc).

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

Как же быть? А мне еще хотелось добавить и 'подсветку' кнопки при прохождении мыши над ней!?
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
25.05.2011, 01:51
Если, Вы задавали оконную процедуру для батона следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WNDPROC wpOrigProc=NULL;
LRESULT CALLBACK WndProcBut(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message) 
    {
        case WM_MOUSEMOVE:
            Beep(1000,10);
            break;
        case WM_LBUTTONDOWN:
            Beep(1000,10);
            break;
        case WM_LBUTTONUP:
            Beep(1000,10);
            break;
   }
   return CallWindowProc(wpOrigProc, hWnd, message, wParam, lParam);
}
//Где то п программе 
 wpOrigProc=(WNDPROC)SetWindowLong(hBut/*'Button'*/,GWL_WNDPROC,long(WndProcBut));
То проблем с прорисовкой не должно быть.

Ещё как вариант: может вообще отказаться от стандартного 'Button' и создать совственный?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
25.05.2011, 14:10  [ТС]
Da, ya ispolzoval imenno takoj variant.
V procedure ja tak ge dobavil obrabotku WM_PAINT.
Odnako button pojavlaetcja tolko posle najatia na nego, a ne v nachale.

A kak sozdat` svoju button?
0
1 / 1 / 2
Регистрация: 05.08.2009
Сообщений: 96
25.05.2011, 15:26
Добавили WM_PAINT(BeginPaint(...),EndPaint(...)) и перестало срабатывать WM_DRAWITEM в главном окне.А если отключите BeginPaint(...),EndPaint(...),то сново начнёт срабатывать WM_DRAWITEM.Если Вы уже рисуете в WM_DRAWITEM зачем Вам WM_PAINT?

Собственный батон - создаём своё окно через WNDCLASSEX,CreateWindows.
А дальше пишем все что мы хотим у видеть в своём батоне.
Просто коли уже все рисуем сами,и от стандартного батона практически ничего не осталось,то нужен ли он нам?
0
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
14.06.2011, 12:22  [ТС]
Спасибо 2 Kovalsky2, создал окно с графикой и графические кнопки на нем, однако...

Форма имеет не сплошное заполнение, а картинку.
Кроме того сама кнопка не имеет прямоугольную форму (есть элипсы и
округленные прямоугольники).
Мне необходимо, чтобы при прорисовке кнопки её лишние части не заслоняли
картинку на форме (т.е. некорорые части кнопки должны быть прозрачными), и
кроме того, при наведении мыши надо, чтобы курсор менялся только в
существенной части, я не на углах, к примеру (т.е. не в той части которая
должна быть прозрачной).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.06.2011, 12:22
Помогаю со студенческими работами здесь

Не создается главное окно при запуске программы, Win32 API
Ошибок нет, есть предупреждения, но они не касаются данной темы. Код в тех местах, где создается главное окно, не трогал.

[masm64] Создать окно с кнопками
Кто сможет помочь,нужно на masm64 создать окно с тремя кнопками: A - закрытие окна, а остальные 2-е запускают 2 приложения. 2 приложения...

Создать окно с заголовком и кнопками
Хотелось бы узнать, как на языке C можно создать программу в привычном смысле - с красным крестиком в правом верхнем углу, с кнопками и...

Создать окно с тремя кнопками, используя Swing
Добрый день! Помогите, пожалуйста, решить задачу. Создать окно с тремя кнопками. Каждая кнопка должна окрашивать поверхность...

Win32 API, как создать меню?
Здраствуйте помогите пожалуста. Нужно до простой программы каторая выводит пустое окно добавить меню с пунктамы Fille который имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru