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

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
 
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
#1

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

10.01.2017, 10:00. Просмотров 581. Ответов 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;
 
 
};
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 10:00     Как заставить работать кнопку, которая находится на другом объекте (статической панели)?
Посмотрите здесь:

Как заставить кнопки отображаться стилем Win7? (MinGW) C++ WinAPI
C++ WinAPI Как получить дескриптор EditBox'a на диалоговой панели
C++ WinAPI Возможно ли изменить иконку (в стороннем приложении), которая находится в верхнем левом углу окна?
C++ WinAPI Как заставить новый поток писать в консоль?
C++ WinAPI Как заставить пищать системный динамик?
Как получить HWND окна на панели задач по координатам мыши? C++ WinAPI
Может кто подсказать как заставить объект двигаться C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
11.01.2017, 17:02     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #21
Во вот теперь загрузился. Win32Project1.rar
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
13.01.2017, 07:24  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #22
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Во вот теперь загрузился. Win32Project1.rar
Сейчас пробую запустить ваш проект не выходит.
Вообще не понимаю в какой файл тыкать, чтобы открылся весь проект целиком.
Все файлы открываются по отдельности. Проект не видит все другие файлы.
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
13.01.2017, 07:28  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #23
Дошло: Нужно открывать файл: Win32Project1.sln
Но выходит ошибка при запуске не хватает файла: VCRUNTIME140D.dll
Скриншот
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
13.01.2017, 07:47  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #24
Потихоньку начинает доходить. Только хорошо было бы увидеть это в динамике. Что нужно делать с проектом Win32.
Может в сети есть такие видеоуроки? Я думал Вы мне пустой проект обошьете ООП оберткой. А тут дополнительные расширения и плагины. Ладно эту затею оставим на потом. Я пока на пустом проекте тестирую коды. Я с пустым проектом еще плаваю. На про дополнительные файлы нет обучающих материалов. Может книги и статьи подбросите по этим расширениям?
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
13.01.2017, 14:09     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #25
Цитата Сообщение от infobos Посмотреть сообщение
Я думал Вы мне пустой проект обошьете ООП оберткой.
А это и есть пустой проект MSVC++ 2015 обшитый ООП оберткой. Просто обертка делалась по тому же принципу что и VCL поэтому код ее использования сильно похож на код для C++ Builder. в папочке Win32Project1 полный исходник. Win32Project1.sln под 15-ю визуал студию. меньшая версиия скорее всего не откроет.
Цитата Сообщение от infobos Посмотреть сообщение
о выходит ошибка при запуске не хватает файла: VCRUNTIME140D.dll
Это редистр Microsoft.VC140.CRT.rar от 15-ой визуал студии.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
13.01.2017, 17:27     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #26
Control.h и Control.cpp сама минимальная основа ООП обертки и минимальный набор компонентов(контролов) с минимальным функционалом- абстрактный контрол и порожденные от него кнопка, панель и форма . MyForm.h и MyForm.cpp - форма созданная с использованием обертки. Win32Project1.cpp - файл с WinMain и главным циклом управления. В принципе все что в WinMain тоже выносится в отдельный класс который должен содержать массив созданных форм, метод с главным циклом управления и методы получения информации о режимах экрана и т..п.

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

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

Добавлено через 15 минут
Кое как разобрался с этой чехардой. Глобальная Переменная была объявлена внутри метода. В итоге глобальной переменной не было присвоение значения. Вот бывает же косяк.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
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 занятие торомзное. Поэтому имеется возможность все эти данные записать в буфер (по одной записи на копию) и дать команду отрисовать сразу много копий модели используя для каждой очередную запись из буфера настроек.
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
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)

На будущее будем знать как заставить работать файлы у клиента. Может у Вас еще особый случай, который тоже требует решения. Меня очень волнуют проблемы запуска файлов на стороне клиента.
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
14.01.2017, 15:17     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #30
Цитата Сообщение от infobos Посмотреть сообщение
Меня очень волнуют проблемы запуска файлов на стороне клиента.
Полностью эту проблему решает только инсталлятор. И то не всегда.
Пересобрал в статике Win32Project1.rar
infobos
Мoдepaтоp
 Аватар для infobos
133 / 20 / 1
Регистрация: 18.06.2010
Сообщений: 330
14.01.2017, 15:32  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #31
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Полностью эту проблему решает только инсталлятор. И то не всегда.
Пересобрал в статике Win32Project1.rar
Спасибо! Все таки статика решает эту проблему, гораздо лучше чем перекидывания различных файлов.
Я читал про функцию статик. Она сделана специально, чтобы поместить используемые коды из библиотек во внутрь исполняемого файла. Особенно говорят, что таким образом файл становится легко переносимый на другие ПК.
Так что многие до сих пор эту тему не уловили. Интернет по этому поводу слабо развит. Наверно потому что новички имея один ПК тестируют только на своем и не понимают проблем переносимости другими ПК.
Файл запустился, без всяких лишних файлов.

Добавлено через 2 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Полностью эту проблему решает только инсталлятор
Каким инсталятором пользуетесь?

Добавлено через 3 минуты
Ваш проект имеет косяки в плане перерисовки окна. Когда меняешь размеры окна возникают проблемы. Наверно косяк в коде.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2017, 16:50     Как заставить работать кнопку, которая находится на другом объекте (статической панели)?
Еще ссылки по теме:

Экспортировать из dll функцию которая создает кнопку C++ WinAPI
C++ WinAPI Как заставить Windows принять изменения в реестре без перезагрузки?
C++ WinAPI Как отправить js-команду в веббраузер в другом приложении?
Как заставить Edit control принимать сообщения ctrl+c, и тп? C++ WinAPI
C++ WinAPI Как заставить кнопки реагировать на нажатия?

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

Или воспользуйтесь поиском по форуму:
Fulcrum_013
 Аватар для Fulcrum_013
566 / 670 / 72
Регистрация: 14.12.2014
Сообщений: 5,345
Завершенные тесты: 2
14.01.2017, 16:50     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #32
Цитата Сообщение от infobos Посмотреть сообщение
Наверно потому что новички имея один ПК тестируют только на своем и не понимают проблем переносимости другими ПК.
Дело в том что в принципе вопрос может быть не только в DLL а и в совместимости в системе инструкций программы и процессора на котором ее запускают. И бывают такие дела далеко не только у новичков. К примеру недавно вышел апдейт драйверов Intel VGA устанавливающийся автоматически через сервер обновления Windows. Так вот обновленный драйвер тупо крешит винду на старте если проц ниже Ivy Bridge. Пришлось из за этой хрени третий монитор который на интегрированной видюхе проца висел отключить.

Добавлено через 58 секунд
Цитата Сообщение от infobos Посмотреть сообщение
Наверно косяк в коде.
Не столько косяк сколько полную потребную обработку сообщений никто не делал. Только связка чтобы кнопки нажимались.

Добавлено через 11 минут
Цитата Сообщение от infobos Посмотреть сообщение
Каким инсталятором пользуетесь?
На данный момент вообще не пользуюсь (суть решаемых задач по заказам обычно в создании библиотек которое потом кто о адаптирует к конкретным задачам. да и то особо не до них. А свой курпняк во первых еще делать и делать а во вторых инсталлятор он потребует сетевой с загрузкой через торрент и автообновлениями с предварительным ощупыванием проца на предмет какие из SSE/AVX расширений доступны. посему придется свой изобретать.). Раньше Borland Install Shield пользовал.

Добавлено через 19 минут
Цитата Сообщение от infobos Посмотреть сообщение
Когда меняешь размеры окна возникают проблемы.
Да кстати в приложениях DirectX когда меняешь размеры окна всегда проблемы возникают даже при полной обработке сообщений винды. Связано это с тем что изменение размеров буфера кадра требует сброса устройства что приводит к потере всех буферов загруженных в видеокарту следовательно изменение размеров требует полной перезагрузки всей геометрии и т.д. Соответсвенно по этим причинам обычно приложения DirectX запрещают ресайз окна и ресайзят сами из диплога настроек по какому то набору фиксированных размеров.

Добавлено через 36 минут
Цитата Сообщение от infobos Посмотреть сообщение
Все таки статика решает эту проблему, гораздо лучше чем перекидывания различных файлов.
Кстати касательно опять же приложений DirectX то таки файлы с собой тягать однозначно придется. Имеются как минимум файлы с геометрией шейдерами и т.д. Т.е. какой то менеджмент файлов/инсталлятор все равно придется делать. НУ а поскольку в плане менеджмента файлов DLL ничем от файл данных не отличается то как бы наличие DLL и проблем никаких не доставляет. Кстати программ по созданию инсталляций обычно умеют прочитать из таблицы импорта список нужных DLL и даже найти их на диске компутера на котором производится сборка пакета инсталяции.
Yandex
Объявления
14.01.2017, 16:50     Как заставить работать кнопку, которая находится на другом объекте (статической панели)?
Ответ Создать тему
Опции темы

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