С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514

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

10.01.2017, 10:00. Показов 2344. Ответов 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)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.01.2017, 10:00
Ответы с готовыми решениями:

Как заставить кнопку работать?
Вечер добрый, форумчане. Уже второй день пытаюсь решить насущную для моего проекта проблему, а именно невозможность нажать на кнопку в том...

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

Как заставить созданную кнопку работать
Имею код: document.addEventListener('DOMContentLoaded', function() { var first =...

31
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 10:01  [ТС]
Скриншот
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.01.2017, 11:30
Цитата Сообщение от 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);
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
1
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
10.01.2017, 11:34
infobos, с помощью spy++ можно посмотреть, какие сообщения получает окно.
Миниатюры
Как заставить работать кнопку, которая находится на другом объекте (статической панели)?  
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 11:49  [ТС]
Цитата Сообщение от Alex5 Посмотреть сообщение
Сообщение WM_COMMAND будет отправлено родительскому окну кнопки - окну panel
Ну это я до Вас понял. Мне нужен код реализации. Связка.
И вопрос что за софт выдает такие коды?

Добавлено через 6 минут
Как тогда получить событие у родительского окна?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
10.01.2017, 12:25
Цитата Сообщение от infobos Посмотреть сообщение
Как тогда получить событие у родительского окна?
Точно так же как и у формы. А именно создать для него свою функцию WndProc и назначить ее рродительскому окну, в данном случае панели

Добавлено через 5 минут
Т.е. точно так же зарегестрировать класс окна и т.д. только для панели. В общем все это очень элегантно делается средствами ООП и КОП. Посему если таких кнопок /панелей нужно много существует два реальных варианта их разрулить: 1 использовать готовый оконный ООП фреймверк. 2 Писать свой оконный ООП фреймверк. А в сыром винапи коде потеряетсь очень быстро.
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 14:01  [ТС]
Механику понял позже проверю. По коду пока отменяется.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
10.01.2017, 14:02
Цитата Сообщение от infobos Посмотреть сообщение
И вопрос что за софт выдает такие коды?
Имеется в виду что то типа конструктора интерфейсов который генерит винапи код? Таковых не существует в связи с тупиковостью такого подхода. Все конструкторы интерфейсов генерят не код а данные для создания иерархии объектов из классов какого либо оконного фреймверка. А сами написанные в ручную классы универсально обрабатывают по одному типу элемента вызывая соответствующие функции винапи.
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 17:57  [ТС]
Я в стопоре. И все таки мне нужен код реализации. Я не нахожу связи. Там есть цикл. Должна быть установка идентификаторов. Жду код.

Добавлено через 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;
 
 
};
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
10.01.2017, 18:10
Цитата Сообщение от infobos Посмотреть сообщение
. Только я не понял как и где это искать и что устанавливать. Не понятно что искать.
С визуал студией идет в комплекте сразу установленный фреймверк MFC. С билдером в комплекте сразу два фреймверка - VCL и FireMonkey. c Qt в комплекте фреймверк QtWidgets. Они устанавиваются сразу при установке среды разработки.
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 18:16  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С визуал студией идет в комплекте сразу установленный фреймверк MFC. С билдером в комплекте сразу два фреймверка - VCL и FireMonkey. c Qt в комплекте фреймверк QtWidgets. Они устанавиваются сразу при установке среды разработки.
Это что-то типа визуального редактора? Визуально ставишь элементы на панели окна и автоматом генерится код?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
10.01.2017, 19:26
Цитата Сообщение от infobos Посмотреть сообщение
Это что-то типа визуального редактора? Визуально ставишь элементы на панели окна и автоматом генерится код?
Генерится не код. Генерится разметка по которой загрузчик фреймверка создает структуру объектов, оборачивающих вызова винапи. С голым винапи кодом без ооп обертки будет каша полная. ну к примеру удобнее пользуя объектную обертку написать что то в духе
Form2->Visible=false; чтобы закрыть форму
вместо ShowWindow(HandleForm2,SW_HIDE);
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
10.01.2017, 19:45  [ТС]
Наверно это расширение и код не генерится.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Генерится не код. Генерится разметка по которой загрузчик фреймверка создает структуру объектов, оборачивающих вызова винапи.
Ну здесь вроде понятно!
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С голым винапи кодом без ооп обертки будет каша полная. ну к примеру удобнее пользуя объектную обертку написать что то в духе
Form2->Visible=false; чтобы закрыть форму
вместо ShowWindow(HandleForm2,SW_HIDE);
А что такое ООП обертка? Можно дать определение с примером?
Я уже понимаю что каша будет. Эту кашу можно обернуть своими методами(Функциями, классами и прочее.)
С конструкторами имел дело. Поэтому будет проще войти в глубь WinApi после конструктора (Программировать приложение с помощью визуального редактора)
Я Выбрал WinApi с целью осилить DirectX. И подобное программирование очень сильно расширяет границы понимания в программировании. И опыт упростить WinApi своими методами будет некоторой зарядкой для программиста.
Не надо меня отговаривать о WinApi Я уже наслышен о том, как все сложно. Двигаемся в глубь пока не проверю DirectX на скорость с другими проектами. Также есть задачи ускорить свои специфические задачи для ускорения некоторых расчетов, которые требуют больших ресурсов.
После Directx или параллельно буду проверять 3d графику у WPF на C#. Тоже наслышен.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
10.01.2017, 23:55
Цитата Сообщение от infobos Посмотреть сообщение
Я Выбрал WinApi с целью осилить DirectX.
Общего у DirectX и WinAPI только одно - Direct3D при инициализации дают хендл окна в который ему выводит отрисованный результат.

Добавлено через 3 часа 11 минут
Цитата Сообщение от infobos Посмотреть сообщение
А что такое ООП обертка? Можно дать определение с примером?
Примеры - классы MFC или та часть компонентов VCL которая предназначена для создания интерфейсом.
1
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
11.01.2017, 06:03  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Общего у DirectX и WinAPI только одно - Direct3D при инициализации дают хендл окна в который ему выводит отрисованный результат.
Не знание WinApi не способствует пониманию DirectX во многих книгах и примерах кода этот с++ WinApi.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.01.2017, 09:43
Цитата Сообщение от infobos Посмотреть сообщение
во многих книгах и примерах кода этот с++ WinApi.
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
11.01.2017, 15:12  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Из WinApi там только создание прямоугольника в который он рисует. А так у него все свое - звук, ввод, графика.
Ладушки. Это тоже становится ясно по ходу изучения. Надо все равно понимать что WinAPI, а что нет. Понимать где Directx зная WInAPI. Просто начал книгу по DirectX изучать. А они давай меня грузить WinAPI кодом. Вот и приходится изучать WinAPI.

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

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

Добавлено через 2 минуты
Цитата Сообщение от infobos Посмотреть сообщение
Если нет то сильно не расстроюсь придется изобретать велосипед, если не будет готового решения.
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
0
Строитель
 Аватар для infobos
460 / 77 / 4
Регистрация: 18.06.2010
Сообщений: 514
11.01.2017, 16:33  [ТС]
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Лисапед бкде медленнее по определению. Во первых икс все рисует на видеокарте. Во вторых он кроме всего остального общается с видеокартой напрямую в обход виртуализации. Никто так не может кроме него под виндой в принципе. Свежеиспеченный Вулкан от 11-го икса (7-летней давности) по скорости отстает не то что от 12-го
Да, Это понятно, что видеокарта делает что-то внутри себя для скорости. Остается понять что она умеет.
Я со временем отпишусь о результатах. Да каждая проблема будет описываться на этом форуме.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
11.01.2017, 17:01
Цитата Сообщение от infobos Посмотреть сообщение
Кстати вычитывал где-то что сам DirectX на С++ WinAPI написан
НА самом деле винапи под капотом давно через директ икс отрисовывается. ине только отрисовывается звук тоже под капотом иксовый. Да кстати и икс теперь можно сказать к винапи относится. во всяком случае SDK для 12-го не отдельное а входит в platform SDK
Так ладно небольшой примерчик ООП оборачивания винапи. Упрощенный до безобразия. но должно быть понятен принцип как фреймверки это все круто пачками и по многу окошуи малюют:
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.01.2017, 17:01
Помогаю со студенческими работами здесь

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

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

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

Подскажите, как можно разместить кнопку Button на картинке или на Canvas или на каком нибудь другом объекте
Подскажите, как можно разместить кнопку Button на картинке или на Canvas или на каком нибудь другом объекте

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru