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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.83
kpoxa
5 / 5 / 0
Регистрация: 08.12.2009
Сообщений: 213
#1

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

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

Используются только функции Win32 API.

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

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

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

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

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

С++ Win32 API - C++
Подскажите книгу с самым доступным объяснением по данной теме. Что-то в роде "С++ за 21 день" только по Win32. Для чайников так сказать......

mdi в win32 api - C++
mdi в win32 api Хочу для удобстава сделать мбди приложение, но пробовал по разному WS_CHILD ставил (для дочерний) а родителем...

Исходники Win32 Api - C++
У кого есть свои или знаете где их взять прошу скиньте ссылку. Книг хороших куча, но нужен самый простой шаблон с прямоугольником, что бы я...

Макросы, win32 API - C++
Создал проект Win32 API. В файле resource.h есть макросы на кнопки управления, диалоговые окна, картинки и т.д. Сменил у некоторых...

Книжки Win32 API на с++ - C++
Доброго времени суток! Нам в универе на лабораторные работы задают задание, написать консольную програмку с использованием win32 api. И...

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

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

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

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

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

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

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

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

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

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

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

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

Форма имеет не сплошное заполнение, а картинку.
Кроме того сама кнопка не имеет прямоугольную форму (есть элипсы и
округленные прямоугольники).
Мне необходимо, чтобы при прорисовке кнопки её лишние части не заслоняли
картинку на форме (т.е. некорорые части кнопки должны быть прозрачными), и
кроме того, при наведении мыши надо, чтобы курсор менялся только в
существенной части, я не на углах, к примеру (т.е. не в той части которая
должна быть прозрачной).
0
14.06.2011, 12:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2011, 12:22
Привет! Вот еще темы с ответами:

Win32 API Работа с процессами - C++
Господа, здравствуйте! Я новичок в программировании, помогите пожалуйста в программе, не знаю как сделать. Мне нужно реализовать...

Временные диалоги Win32 API - C++
Во общем в Win32API я полный ноль, да и изучать мы его будем очень поврхностно и изучение закончится после сдачи заданий )), нам дали всего...

Проигрывание CD с помощью Win32 API - C++
hi надо прослушать music cd так|| не получается играет не очень правильно!что не так? || || ...

Буфер обмена win32 api - C++
Доброе время суток. Подскажите пожалуйсто как пользоваться буфером обмена. Мне нужно копировать, вырезать, вставлять текст.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru