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

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
 
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
#1

Как заставить работать кнопку, которая находится на другом объекте (статической панели)? - C++ WinAPI

10.01.2017, 10:00. Просмотров 737. Ответов 31
Метки нет (Все метки)

Подскажите пожалуйста! Не знаю как получить событие от кнопки1.

Имеются две кнопки, которая находится в панели не работает. Не знаю как получить от нее событие!

Как получить событие на кнопке 1? Вызов WM_COMMAND: не создается на кнопке 1.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <windows.h>         // Подключаем заголовочный файл Windows
 
//MainWinProc - обработчик событий из windows. Windows запускает.
LRESULT CALLBACK MainWinProc(HWND   hwnd, UINT    msg, WPARAM  wparam, LPARAM  lparam)          
{
    
 switch (msg) 
  {
      case WM_CREATE:
          {
              //Создаем панель, в которой будет находится кнопка
              DWORD dwExStyle = /*WS_EX_CLIENTEDGE |*/WS_EX_DLGMODALFRAME;
              DWORD dwStyle = WS_CHILD|WS_VISIBLE|SS_CENTER|SS_CENTERIMAGE|SS_SUNKEN;//SS_CENTER
              HWND panel = CreateWindowEx(dwExStyle, TEXT("STATIC"), TEXT("Панель"), dwStyle, 10, 50, 300, 300, hwnd, (HMENU)NULL, NULL, (LPVOID)NULL);
    
              //Создаем кнопку1 находиится на панели
              HWND knopka=CreateWindow(TEXT("BUTTON"),TEXT("Кнопка 1"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
              50,50,100,30,panel,(HMENU)853,NULL,NULL);
 
              //Создаем кнопку2 работает но она не в панели
              HWND knopka2=CreateWindow(TEXT("BUTTON"),TEXT("Кнопка 2"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
              330,100,100,30,hwnd,(HMENU)854,NULL,NULL);
          }
          break;
 
 
 
 
      case WM_COMMAND:// При нажатии кнопки 1 Это не вызывается!
          {
              if ((HIWORD(wparam)==0) && (LOWORD(wparam)==853)) 
                  MessageBox(hwnd,TEXT("Нажали кнопку 1!"),TEXT("Информация"),MB_OK|MB_ICONWARNING);
 
              if ((HIWORD(wparam)==0) && (LOWORD(wparam)==854)) 
                  MessageBox(hwnd,TEXT("Нажали кнопку 2!"),TEXT("Информация"),MB_OK|MB_ICONWARNING);
          }
   break;
 
      case WM_DESTROY://Методы при закрытие окна.
            PostQuitMessage(0);
            break;
      default :
            return DefWindowProc(hwnd, msg, wparam, lparam);
  }
} 
 
 
 
//WinMain - Точка входа программы. Отсюда начинается работа кода.
int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
 
{
 
WNDCLASSEX windowsclass;  // Создаем класс
HWND       hwnd;          // Создаем дескриптор окна
MSG        msg;           // Идентификатор сообщения
 
 
// Определим класс окна WNDCLASSEX
windowsclass.cbSize         = sizeof(WNDCLASSEX);
windowsclass.style          = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowsclass.lpfnWndProc    = MainWinProc;
windowsclass.cbClsExtra     = 0;
windowsclass.cbWndExtra     = 0;
windowsclass.hInstance      = hinstance;
windowsclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);//Значок программы
windowsclass.hCursor        = LoadCursor(NULL, IDC_ARROW);//Курсор на окне
windowsclass.hbrBackground  = NULL;//(HBRUSH)GetStockObject(GRAY_BRUSH);Раскраска объекта в серый цвет (GRAY_BRUSH)
windowsclass.lpszMenuName   = NULL;
windowsclass.lpszClassName  = TEXT("WINDOWSCLASS");
windowsclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);//Значок программы
 
// Зарегистрируем класс
RegisterClassEx(&windowsclass);
 
hwnd = CreateWindowEx(NULL,              // стиль окна
                       TEXT("WINDOWSCLASS"),         // класс
                       TEXT("Программа"), // название окна
                       WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_VSCROLL,// | WS_HSCROLL,//Стили окна для разных работ
                       100,100,  // левый верхний угол 
                       500,500,   // ширина и высота окна
                       NULL,                   // дескриптор родительского окна 
                       NULL,                   // дескриптор меню
                       hinstance,              // дескриптор экземпляра приложения
                       NULL);                  // указатель на данные окна         
 
 
ShowWindow(hwnd, ncmdshow);//Выводит окно на экран. Второй параметр означает как открыть окно. Его можно открыть на весь экран или свернуть.
UpdateWindow(hwnd);//Перерисовка окна после изменения
 
while (GetMessage(&msg, 0, 0, 0)) 
    {
            TranslateMessage(&msg);//преобразует некоторые сообщения полученные с помощью клавиатуры
            DispatchMessage(&msg);//Отправляет сообщения оконной процедуре
    }
 
     return msg.wParam;
 
 
};
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 10:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как заставить работать кнопку, которая находится на другом объекте (статической панели)? (C++ WinAPI):

Как скрыть кнопку на form2, нажав на кнопку которая находится на form1 - C#
Как скрыть кнопку на form2, нажав на кнопку которая находится на form1? т.е. нажав на кнопку OpenFrm2, открывается форма Form2, и кнопка...

Как на панели заставить кнопку появляться и исчезать при наведении - и отводе курсора - C#
Опишу такой фрагмент код: 1. На форму бросил панель (panel1) 2. Заполняю эту панель динамически созданным объектом тоже типа...

Как заставить кнопку 'X' работать на свертывание? - Visual Basic
Как заставить кнопку 'X' у формы работать на свертывание?

Как заставить работать кнопку закрытия окна? - Java
Как заставить работать кнопку закрытия окна? import java.applet.Applet; import java.awt.*; public class MyButton extends Applet{ ...

Как в QML TextArea заставить правильно работать кнопку TAB? - C++ Qt
Если кинуть в QML GUI элемент TextArea и что - то в нём писать и попытаться сделать табуляцию (отступ), то вместо того, что бы это сделать...

Как по нажатии на картинку, которая находится на панели, перетаскивать её мышкой - C#
Вопросы такие: 1) как по нажатии на картинку которая находится на панели перетаскивать её мышкой и при отпускании что бы она оставалась...

31
Fulcrum_013
Заблокирован
11.01.2017, 09:43 #16
Цитата Сообщение от infobos Посмотреть сообщение
во многих книгах и примерах кода этот с++ WinApi.
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
0
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
11.01.2017, 15:12  [ТС] #17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
Ладушки. Это тоже становится ясно по ходу изучения. Надо все равно понимать что WinAPI, а что нет. Понимать где Directx зная WInAPI. Просто начал книгу по DirectX изучать. А они давай меня грузить WinAPI кодом. Вот и приходится изучать WinAPI.

Добавлено через 5 минут
Кстати вычитывал где-то что сам DirectX на С++ WinAPI написан. Ладно главное, чтобы в библиотеках DirectX был тот функционал, который мне нужен. Приемы упрощения рисования. Грани за гранями чтобы не рисовать, а сразу рисовать видимые элементы, чтобы не тратить время на создание своих алгоритмов рисования. Там есть что-то подобное? Или придется писать свои алгоритмы отделения граней от других граней?

Добавлено через 6 минут
Имеется ввиду не рисовать в одной проекции-экрана 3,4 объекта в одной области. То есть не рисовать тот объект, который закрыт из поля зрения другим объектом. А еще если нужно отобразить части двух объектов. Тут тоже возникает как это нарисовать, чтобы затратить минимум циклов рисования. Надеюсь это есть в библиотеках. Если нет то сильно не расстроюсь придется изобретать велосипед, если не будет готового решения.
0
Fulcrum_013
Заблокирован
11.01.2017, 16:30 #18
Цитата Сообщение от infobos Посмотреть сообщение
Приемы упрощения рисования.
Он умеет рисовать треугольник всеми цветами радуги. Но рисовать очень быстро.

Добавлено через 2 минуты
Цитата Сообщение от infobos Посмотреть сообщение
Если нет то сильно не расстроюсь придется изобретать велосипед, если не будет готового решения.
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
0
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
11.01.2017, 16:33  [ТС] #19
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
Да, Это понятно, что видеокарта делает что-то внутри себя для скорости. Остается понять что она умеет.
Я со временем отпишусь о результатах. Да каждая проблема будет описываться на этом форуме.
0
Fulcrum_013
Заблокирован
11.01.2017, 17:01 #20
Цитата Сообщение от infobos Посмотреть сообщение
Кстати вычитывал где-то что сам DirectX на С++ WinAPI написан
НА самом деле винапи под капотом давно через директ икс отрисовывается. ине только отрисовывается звук тоже под капотом иксовый. Да кстати и икс теперь можно сказать к винапи относится. во всяком случае SDK для 12-го не отдельное а входит в platform SDK
Так ладно небольшой примерчик ООП оборачивания винапи. Упрощенный до безобразия. но должно быть понятен принцип как фреймверки это все круто пачками и по многу окошуи малюют:
0
Fulcrum_013
Заблокирован
11.01.2017, 17:02 #21
Во вот теперь загрузился. Win32Project1.rar
1
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
13.01.2017, 07:24  [ТС] #22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Во вот теперь загрузился. Win32Project1.rar
Сейчас пробую запустить ваш проект не выходит.
Вообще не понимаю в какой файл тыкать, чтобы открылся весь проект целиком.
Все файлы открываются по отдельности. Проект не видит все другие файлы.
0
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
13.01.2017, 07:28  [ТС] #23
Дошло: Нужно открывать файл: Win32Project1.sln
Но выходит ошибка при запуске не хватает файла: VCRUNTIME140D.dll
Скриншот
0
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
13.01.2017, 07:47  [ТС] #24
Потихоньку начинает доходить. Только хорошо было бы увидеть это в динамике. Что нужно делать с проектом Win32.
Может в сети есть такие видеоуроки? Я думал Вы мне пустой проект обошьете ООП оберткой. А тут дополнительные расширения и плагины. Ладно эту затею оставим на потом. Я пока на пустом проекте тестирую коды. Я с пустым проектом еще плаваю. На про дополнительные файлы нет обучающих материалов. Может книги и статьи подбросите по этим расширениям?
0
Fulcrum_013
Заблокирован
13.01.2017, 14:09 #25
Цитата Сообщение от infobos Посмотреть сообщение
Я думал Вы мне пустой проект обошьете ООП оберткой.
А это и есть пустой проект MSVC++ 2015 обшитый ООП оберткой. Просто обертка делалась по тому же принципу что и VCL поэтому код ее использования сильно похож на код для C++ Builder. в папочке Win32Project1 полный исходник. Win32Project1.sln под 15-ю визуал студию. меньшая версиия скорее всего не откроет.
Цитата Сообщение от infobos Посмотреть сообщение
о выходит ошибка при запуске не хватает файла: VCRUNTIME140D.dll
Это редистр Microsoft.VC140.CRT.rar от 15-ой визуал студии.
1
Fulcrum_013
Заблокирован
13.01.2017, 17:27 #26
Control.h и Control.cpp сама минимальная основа ООП обертки и минимальный набор компонентов(контролов) с минимальным функционалом- абстрактный контрол и порожденные от него кнопка, панель и форма . MyForm.h и MyForm.cpp - форма созданная с использованием обертки. Win32Project1.cpp - файл с WinMain и главным циклом управления. В принципе все что в WinMain тоже выносится в отдельный класс который должен содержать массив созданных форм, метод с главным циклом управления и методы получения информации о режимах экрана и т..п.

Добавлено через 3 часа 3 минуты
Цитата Сообщение от infobos Посмотреть сообщение
Да, Это понятно, что видеокарта делает что-то внутри себя для скорости. Остается понять что она умеет.
Умеет она линии точки и треугольники рисовать. Так же умеет запускать при этом подпрограммы пользователя - шейдеры(исполняются на видеокарте а не на CPU) Предназначенные для расчета как именно этот треугольник повернуть и покрасить. Так же умеют запускать шейдеры которые гененрируют "на лету" набор треугольников из более сложных примитивов. Ну и еще умеют запускать вычислительный шейдер который ничего не рисует а только пересчитывает данные, но зато по любой запрограммированной схеме расчета а не по схеме конвейера растеризации. Пользуется это в основном для расчета анимации и физической модели. Ну еще для крипттосистем в том числе майнинга биткоина.
1
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
13.01.2017, 18:25  [ТС] #27
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Умеет она линии точки и треугольники рисовать. Так же умеет запускать при этом подпрограммы пользователя - шейдеры(исполняются на видеокарте а не на CPU) Предназначенные для расчета как именно этот треугольник повернуть и покрасить.
Меня интересует вот что:
Видеокарта имеет свою память на расположение треугольников по вершинам? И чтобы по определению поворота сама знала что рисовать и как рисовать эти треугольники? Имеется ввиду мне на с++ придется писать видеокарте все вершины различных фигур? Они один раз загрузятся и будут сами воспроизводится? Просто я пока понял, что я сам пишу код на с++ который определяет вершины фигур.

Добавлено через 5 минут
Я запарился уже с интерфейсом WinApi. Не могу наладить работу кнопок и полей ввода. Возникает всякая чихарда. Код просто не работает так как положено. Нужно вписывать переменные там то и там. Если переменная там то работает, если нет - то не работает. В общем пожинаю плоды сложного winAPI.
Код вроде работает. Как выношу его в отдельные методы - отказывается работать.

Добавлено через 15 минут
Кое как разобрался с этой чехардой. Глобальная Переменная была объявлена внутри метода. В итоге глобальной переменной не было присвоение значения. Вот бывает же косяк.
0
Fulcrum_013
Заблокирован
13.01.2017, 18:37 #28
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от infobos Посмотреть сообщение
Меня интересует вот что:
Значит по порядку:
Буфера вершины и индексы текстуры, шейдеры и прочие загружаются в видеокарту там и живут.
Естественно загрузка из файла и/или програмная генерация самой исходной геометрии делается на С++.
В каком формате вопрос отдельный потому как по большому счету видеокарте указывается только размеры данных а их назначение она по большому счету не знает. Знает это шейдер.
Т.е. система такая - код на С++ загружает в видеокарту буфера геометрии. Потом обновляет только буфера константных данных шейдера - т.е. матрицы поворота и т.п. с которыми рисовать. Устанавливает нужный буфер и нужный шейдер и дает команду отрисовки n-ного количества примитивов записанных в этом буфере.
Карта собирает примитивы по индексам. При этом для каждой вершины вызывается вершинный шейдер, написанный на HLSL (C подобный язык программирования шейдеров), который рассчитывает преобразование вершины по матрицам хранимымы в буфере констант из модельного пространство в экранное пространство (ну а так же другие пространства и считаете дополнительные данные для вершины по желанию программиста). Дальше карта отсекает собранные примитивы по пирамиле отсечения, производит персективное деление и растеризует оставшиеся после отсечения треугольники.Умеет при этом использовать Z-буффер и Stencil-буффер При растеризации для каждого закрашиваемоо пикселя (прошедшего z и stencil тесты) вызывается пиксельный шейдер который расчитывает его цвет и прозрачность. После этого полученный цвет и прозрачность карта комбинирует с пикселом из буфером кадра используя настройки блендинга.
Это минимальный программируемый конвейер. Еще возможно добавление геометрического и пары тасселяционных шейдеров которые делают модификации на уровне примитивов.
К примеру набор прямоугольников можно задать в буфер положением центра размером по x и y и направлением нормали. А в геометрическом шейдере по этим данным построить пару треугольников которые и будут поданы на конвейер.
Тасселяционная же стадия конвейера использует два шейдера - domain и hull шейдеры. Домайн определяет количество разделений заданного примитива. т.е. количество шагов по u по v в параметрической форме задания поверхности,после чего карта генерирует узлы (вершины) треугольного или прямоугольного лоскута, hull шедер вычисляет значения атрибутов вершин для каждой вершины по переданнв из буфра данным (к примеру опорным и котрольным точкам аоверхости Безъе ) в координатах u,v соответствующих сгенерированным вершинам лоскута. После чего сгенерированный лоскут идет на отсечение и дальнейшую растеризацию.
Т.е. фактически классический 3D конвейер с возможностью программировать каждую из его стадий. т.е. фактически карта выполняет всю работу по передаче данных между стадиями и тривиальные стадии ковейера, оставляя возможность программировать нетривиальные стадии на HLSL
Так же карта еще умеет инстансинг. Суть в чем. К примеру нужно отрисовать много копий одной модели но в разных координатах и с разной покраской/настройками и т.д. Передача этих данных обновлением константных буферов шейдеров на каждую копию со стороны CPU занятие торомзное. Поэтому имеется возможность все эти данные записать в буфер (по одной записи на копию) и дать команду отрисовать сразу много копий модели используя для каждой очередную запись из буфера настроек.
1
infobos
Строитель
353 / 58 / 1
Регистрация: 18.06.2010
Сообщений: 487
14.01.2017, 06:58  [ТС] #29
Супер! Поставил лучший ответ.

Добавлено через 11 часов 54 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Это редистр Microsoft.VC140.CRT.rar от 15-ой визуал студии.
Все равно такими закидонами файлов проблема с запуском не решается!
Мне бы хотябы Exe файл запустить.
Чтобы exe-файл не требовал различные файлы требуется делать со статическими линковками. Обсуждалось тут: Exe-файла от среды Visual Studio требует msvcr110.dll

Добавлено через 5 минут
Fulcrum_013 сделай так со статической линковкой (Скомпонованные exe файлы в папке release под функциями:
/MT)

На будущее будем знать как заставить работать файлы у клиента. Может у Вас еще особый случай, который тоже требует решения. Меня очень волнуют проблемы запуска файлов на стороне клиента.
0
Fulcrum_013
Заблокирован
14.01.2017, 15:17 #30
Цитата Сообщение от infobos Посмотреть сообщение
Меня очень волнуют проблемы запуска файлов на стороне клиента.
Полностью эту проблему решает только инсталлятор. И то не всегда.
Пересобрал в статике Win32Project1.rar
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2017, 15:17
Привет! Вот еще темы с ответами:

Как подключить к программе базу данных, которая находится на другом компьютере - C#
Добрый вечер!! Будьте любезны объясните шаг за шагом(ну уж очень подробно:) ) как же все таки подключить к программе базу данных которая...

Не могу заставить работать на другом компьюторе - Visual Basic
Помогите пожалуйста!!!! Я совсем еще начинающий :( Не могу заставить работать на другом компьюторе скомпелированный c базами данных(Data)...

Как по нажатию на кнопку можно открыть папку, которая находится рядом с экзешником проекта - C#
Здравствуйте. У меня вот такой вопрос. Как по нажатию на кнопку можно открыть папку, которая находится рядом с экзешником проекта, с...

Как заставить сделать фигуры статической - Delphi WinAPI
Доброго времени суток , очень нужна ваша помощь с api функциями есть задание . Создать графической приложение при помощи API-функций...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
14.01.2017, 15:17
Ответ Создать тему
Опции темы

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