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

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
 
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
#1

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

10.01.2017, 10:00. Просмотров 669. Ответов 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 10:01  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #2
Скриншот
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
Alex5
1038 / 701 / 102
Регистрация: 12.04.2010
Сообщений: 1,763
10.01.2017, 11:30     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #3
Цитата Сообщение от infobos Посмотреть сообщение
Как получить событие на кнопке 1? Вызов WM_COMMAND: не создается на кнопке 1.
Сообщение WM_COMMAND будет отправлено родительскому окну кнопки - окну panel.
C++
1
2
3
// panel - родительское окно
HWND knopka=CreateWindow(TEXT("BUTTON"),TEXT("Кнопка 1"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE,
 50,50,100,30,panel,(HMENU)853,NULL,NULL);
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
Alex5
1038 / 701 / 102
Регистрация: 12.04.2010
Сообщений: 1,763
10.01.2017, 11:34     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #4
infobos, с помощью spy++ можно посмотреть, какие сообщения получает окно.
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 11:49  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #5
Цитата Сообщение от Alex5 Посмотреть сообщение
Сообщение WM_COMMAND будет отправлено родительскому окну кнопки - окну panel
Ну это я до Вас понял. Мне нужен код реализации. Связка.
И вопрос что за софт выдает такие коды?

Добавлено через 6 минут
Как тогда получить событие у родительского окна?
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
10.01.2017, 12:25     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #6
Цитата Сообщение от infobos Посмотреть сообщение
Как тогда получить событие у родительского окна?
Точно так же как и у формы. А именно создать для него свою функцию WndProc и назначить ее рродительскому окну, в данном случае панели

Добавлено через 5 минут
Т.е. точно так же зарегестрировать класс окна и т.д. только для панели. В общем все это очень элегантно делается средствами ООП и КОП. Посему если таких кнопок /панелей нужно много существует два реальных варианта их разрулить: 1 использовать готовый оконный ООП фреймверк. 2 Писать свой оконный ООП фреймверк. А в сыром винапи коде потеряетсь очень быстро.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 14:01  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #7
Механику понял позже проверю. По коду пока отменяется.
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
10.01.2017, 14:02     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #8
Цитата Сообщение от infobos Посмотреть сообщение
И вопрос что за софт выдает такие коды?
Имеется в виду что то типа конструктора интерфейсов который генерит винапи код? Таковых не существует в связи с тупиковостью такого подхода. Все конструкторы интерфейсов генерят не код а данные для создания иерархии объектов из классов какого либо оконного фреймверка. А сами написанные в ручную классы универсально обрабатывают по одному типу элемента вызывая соответствующие функции винапи.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 17:57  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #9
Я в стопоре. И все таки мне нужен код реализации. Я не нахожу связи. Там есть цикл. Должна быть установка идентификаторов. Жду код.

Добавлено через 16 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
1 использовать готовый оконный ООП фреймверк. 2 Писать свой оконный ООП фреймверк. А в сыром винапи коде потеряетсь очень быстро.
Уже занимаюсь потихоньку оптимизацией кода(Вывожу каждый элемент(кнопка,поле ввода и т.д.) в отдельный объект), но возникает проблема связки одного объекта ко всем событиям и функциям. Возникает сложность создать объект с присвоением идентификаторов.
В winapi привлекает токая сложность в получении общепринятых функций. То есть одним модификатором можно сразу везде поменять шрифты, размеры и прочее.
По поводу фреймворков. Только я не понял как и где это искать и что устанавливать. Не понятно что искать.

Добавлено через 12 минут
Событие запустил, а что с этим делать?
C++
1
2
3
4
5
while (GetMessage(&msg, 0, 0, 0)) 
    {
            TranslateMessage(&msg);//преобразует некоторые сообщения полученные с помощью клавиатуры
            DispatchMessage(&msg);//Отправляет сообщения оконной процедуре
    }
На всякий случай хочу увидеть решение опытного мастера. Чтобы не было у меня косяков.

Добавлено через 2 минуты
Вот что у меня получилось, но я не уверен, что там все учтено.

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#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);
    
              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("WINDOWSCLASS2"), 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);
  }
} 
 
//MainWinProc - обработчик событий из windows. Windows запускает.
LRESULT CALLBACK MainWinProc2(HWND   hwnd, UINT    msg, WPARAM  wparam, LPARAM  lparam)          
{
    
 switch (msg) 
  {
      case WM_CREATE:
          {
 
          }
          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 windowsclass2;  // Создаем класс
MSG        msg2;           // Идентификатор сообщения
 
// Определим класс окна 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);//Значок программы
 
// Определим класс окна WNDCLASSEX
windowsclass2.cbSize         = sizeof(WNDCLASSEX);
windowsclass2.style         = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
windowsclass2.lpfnWndProc   = MainWinProc2;
windowsclass2.cbClsExtra        = 0;
windowsclass2.cbWndExtra        = 0;
windowsclass2.hInstance     = hinstance;
windowsclass2.hIcon         = LoadIcon(NULL, IDI_APPLICATION);//Значок программы
windowsclass2.hCursor       = LoadCursor(NULL, IDC_ARROW);//Курсор на окне
windowsclass2.hbrBackground = NULL;//(HBRUSH)GetStockObject(GRAY_BRUSH);Раскраска объекта в серый цвет (GRAY_BRUSH)
windowsclass2.lpszMenuName  = NULL;
windowsclass2.lpszClassName = TEXT("WINDOWSCLASS2");
windowsclass2.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);//Значок программы
 
// Зарегистрируем класс
RegisterClassEx(&windowsclass);
RegisterClassEx(&windowsclass2);
 
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;
 
 
};
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
10.01.2017, 18:10     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #10
Цитата Сообщение от infobos Посмотреть сообщение
. Только я не понял как и где это искать и что устанавливать. Не понятно что искать.
С визуал студией идет в комплекте сразу установленный фреймверк MFC. С билдером в комплекте сразу два фреймверка - VCL и FireMonkey. c Qt в комплекте фреймверк QtWidgets. Они устанавиваются сразу при установке среды разработки.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 18:16  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #11
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С визуал студией идет в комплекте сразу установленный фреймверк MFC. С билдером в комплекте сразу два фреймверка - VCL и FireMonkey. c Qt в комплекте фреймверк QtWidgets. Они устанавиваются сразу при установке среды разработки.
Это что-то типа визуального редактора? Визуально ставишь элементы на панели окна и автоматом генерится код?
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
10.01.2017, 19:26     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #12
Цитата Сообщение от infobos Посмотреть сообщение
Это что-то типа визуального редактора? Визуально ставишь элементы на панели окна и автоматом генерится код?
Генерится не код. Генерится разметка по которой загрузчик фреймверка создает структуру объектов, оборачивающих вызова винапи. С голым винапи кодом без ооп обертки будет каша полная. ну к примеру удобнее пользуя объектную обертку написать что то в духе
Form2->Visible=false; чтобы закрыть форму
вместо ShowWindow(HandleForm2,SW_HIDE);
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
10.01.2017, 19:45  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #13
Наверно это расширение и код не генерится.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Генерится не код. Генерится разметка по которой загрузчик фреймверка создает структуру объектов, оборачивающих вызова винапи.
Ну здесь вроде понятно!
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С голым винапи кодом без ооп обертки будет каша полная. ну к примеру удобнее пользуя объектную обертку написать что то в духе
Form2->Visible=false; чтобы закрыть форму
вместо ShowWindow(HandleForm2,SW_HIDE);
А что такое ООП обертка? Можно дать определение с примером?
Я уже понимаю что каша будет. Эту кашу можно обернуть своими методами(Функциями, классами и прочее.)
С конструкторами имел дело. Поэтому будет проще войти в глубь WinApi после конструктора (Программировать приложение с помощью визуального редактора)
Я Выбрал WinApi с целью осилить DirectX. И подобное программирование очень сильно расширяет границы понимания в программировании. И опыт упростить WinApi своими методами будет некоторой зарядкой для программиста.
Не надо меня отговаривать о WinApi Я уже наслышен о том, как все сложно. Двигаемся в глубь пока не проверю DirectX на скорость с другими проектами. Также есть задачи ускорить свои специфические задачи для ускорения некоторых расчетов, которые требуют больших ресурсов.
После Directx или параллельно буду проверять 3d графику у WPF на C#. Тоже наслышен.
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
10.01.2017, 23:55     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #14
Цитата Сообщение от infobos Посмотреть сообщение
Я Выбрал WinApi с целью осилить DirectX.
Общего у DirectX и WinAPI только одно - Direct3D при инициализации дают хендл окна в который ему выводит отрисованный результат.

Добавлено через 3 часа 11 минут
Цитата Сообщение от infobos Посмотреть сообщение
А что такое ООП обертка? Можно дать определение с примером?
Примеры - классы MFC или та часть компонентов VCL которая предназначена для создания интерфейсом.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
11.01.2017, 06:03  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #15
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Общего у DirectX и WinAPI только одно - Direct3D при инициализации дают хендл окна в который ему выводит отрисованный результат.
Не знание WinApi не способствует пониманию DirectX во многих книгах и примерах кода этот с++ WinApi.
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
11.01.2017, 09:43     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #16
Цитата Сообщение от infobos Посмотреть сообщение
во многих книгах и примерах кода этот с++ WinApi.
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
11.01.2017, 15:12  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #17
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
Ладушки. Это тоже становится ясно по ходу изучения. Надо все равно понимать что WinAPI, а что нет. Понимать где Directx зная WInAPI. Просто начал книгу по DirectX изучать. А они давай меня грузить WinAPI кодом. Вот и приходится изучать WinAPI.

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

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

Добавлено через 2 минуты
Цитата Сообщение от infobos Посмотреть сообщение
Если нет то сильно не расстроюсь придется изобретать велосипед, если не будет готового решения.
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
infobos
Форумчанин
306 / 41 / 1
Регистрация: 18.06.2010
Сообщений: 407
11.01.2017, 16:33  [ТС]     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #19
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
Да, Это понятно, что видеокарта делает что-то внутри себя для скорости. Остается понять что она умеет.
Я со временем отпишусь о результатах. Да каждая проблема будет описываться на этом форуме.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 17:01     Как заставить работать кнопку, которая находится на другом объекте (статической панели)?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Fulcrum_013
657 / 725 / 72
Регистрация: 14.12.2014
Сообщений: 5,650
Завершенные тесты: 3
11.01.2017, 17:01     Как заставить работать кнопку, которая находится на другом объекте (статической панели)? #20
Цитата Сообщение от infobos Посмотреть сообщение
Кстати вычитывал где-то что сам DirectX на С++ WinAPI написан
НА самом деле винапи под капотом давно через директ икс отрисовывается. ине только отрисовывается звук тоже под капотом иксовый. Да кстати и икс теперь можно сказать к винапи относится. во всяком случае SDK для 12-го не отдельное а входит в platform SDK
Так ладно небольшой примерчик ООП оборачивания винапи. Упрощенный до безобразия. но должно быть понятен принцип как фреймверки это все круто пачками и по многу окошуи малюют:
Yandex
Объявления
11.01.2017, 17:01     Как заставить работать кнопку, которая находится на другом объекте (статической панели)?
Ответ Создать тему
Опции темы

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