Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.83
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
22.05.2011, 19:07     Помогите создать окно с кнопками, графика win32 API #1
Используются только функции Win32 API.

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

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

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

Помогите мне, я с графикой пока плохо знаком.
Если можно, маленький пример (можно без создания отдельного потока).
Окно с катинкой + кнопка на нем с картинкой.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2011, 19:07     Помогите создать окно с кнопками, графика win32 API
Посмотрите здесь:

C++ Win32 API Работа с процессами
С++ Win32 API C++
Исходники Win32 Api C++
C++ Временные диалоги Win32 API
Макросы, win32 API C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
23.05.2011, 01:15     Помогите создать окно с кнопками, графика win32 API #2
В первом случае,Вы скорее всего кнопкам не указали их ID.
ID можно установить через SetWindowLong(hBut,GWL_ID,999);

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

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

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

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

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

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

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

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

Т.е. при установленном свойстве кнопки OnwerDraw=true как задействовать этот самый OwnerDraw?
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
24.05.2011, 00:39     Помогите создать окно с кнопками, графика win32 API #6
Теперь обрабатываем 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 - выводить нужную картинку
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
25.05.2011, 01:23  [ТС]     Помогите создать окно с кнопками, графика win32 API #7
В общем попытался я прорисовывать кнопеки через 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 событие.

Как же быть? А мне еще хотелось добавить и 'подсветку' кнопки при прохождении мыши над ней!?
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
25.05.2011, 01:51     Помогите создать окно с кнопками, графика win32 API #8
Если, Вы задавали оконную процедуру для батона следующим образом:
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' и создать совственный?
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
25.05.2011, 14:10  [ТС]     Помогите создать окно с кнопками, графика win32 API #9
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?
Kovalsky2
0 / 0 / 0
Регистрация: 05.08.2009
Сообщений: 96
25.05.2011, 15:26     Помогите создать окно с кнопками, графика win32 API #10
Добавили WM_PAINT(BeginPaint(...),EndPaint(...)) и перестало срабатывать WM_DRAWITEM в главном окне.А если отключите BeginPaint(...),EndPaint(...),то сново начнёт срабатывать WM_DRAWITEM.Если Вы уже рисуете в WM_DRAWITEM зачем Вам WM_PAINT?

Собственный батон - создаём своё окно через WNDCLASSEX,CreateWindows.
А дальше пишем все что мы хотим у видеть в своём батоне.
Просто коли уже все рисуем сами,и от стандартного батона практически ничего не осталось,то нужен ли он нам?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2011, 12:22     Помогите создать окно с кнопками, графика win32 API
Еще ссылки по теме:

C++ Не создается главное окно при запуске программы, Win32 API
Книжки Win32 API на с++ C++
mdi в win32 api C++

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

Или воспользуйтесь поиском по форуму:
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
14.06.2011, 12:22  [ТС]     Помогите создать окно с кнопками, графика win32 API #11
Спасибо 2 Kovalsky2, создал окно с графикой и графические кнопки на нем, однако...

Форма имеет не сплошное заполнение, а картинку.
Кроме того сама кнопка не имеет прямоугольную форму (есть элипсы и
округленные прямоугольники).
Мне необходимо, чтобы при прорисовке кнопки её лишние части не заслоняли
картинку на форме (т.е. некорорые части кнопки должны быть прозрачными), и
кроме того, при наведении мыши надо, чтобы курсор менялся только в
существенной части, я не на углах, к примеру (т.е. не в той части которая
должна быть прозрачной).
Yandex
Объявления
14.06.2011, 12:22     Помогите создать окно с кнопками, графика win32 API
Ответ Создать тему
Опции темы

Текущее время: 20:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru