Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Tarik20
21 / 22 / 5
Регистрация: 14.02.2013
Сообщений: 243

Оконная процедура в классе

15.06.2013, 12:42. Показов 1531. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как вставить простую оконную процедуру в класс?Ставил вот так:
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
class Form
{
private:
static LRESULT WINAPI WindowProcedure(HWND,UINT,WPARAM,LPARAM);
public:
Form(char *Class);
 
HWND Handle;
 
};
Form::Form(char *Class)
{
WNDCLASSEX wincl;
wincl.hInstance = GetModuleHandle(0);
wincl.lpszClassName = Class;
wincl.lpfnWndProc = WindowProcedure;
wincl.style = CS_DBLCLKS;
wincl.cbSize = sizeof (WNDCLASSEX);
wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
wincl.lpszMenuName = NULL;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
 
RegisterClassEx(&wincl);
 
 
Handle = CreateWindowEx(0,Class,Class,WS_OVERLAPPEDWINDOW,Left,Top,Width,Height,0,0,0,0);
 
};
LRESULT WINAPI Form::WindowProcedure(HWND,UINT,WPARAM,LPARAM)
{
return DefWindowProc(hWnd, msg, wParam, lParam);
};
Но в оконной процедуре нет указателя this.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2013, 12:42
Ответы с готовыми решениями:

Оконная процедура в классе
Доброго времени суток! Пишу с телефона,так что без кода,постараюсь объяснить все на словах. Пишу окно на АПИ.Суть в том,что хочу...

Оконная процедура
Общий вопрос. Вот при создании окна через функ-ю CreateWindows , через параметр Lparam можно что-то передать в оконную процедуру...

Оконная процедура не знает, что мышь ушла
{ RECT ClientRectangle; HDC Context; PAINTSTRUCT Paint; std::string s; ...

10
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
15.06.2013, 13:29
Может быть полезно: WinApi: CALLBACK WndProc
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
15.06.2013, 13:31
Используйте функцию SetWindowLongPtr с параметром GWLP_USERDATA,
чтобы связать окно с конкретными данными (передать this, например).
Оконная процедура затем сможет извлечь их через GetWindowLongPtr и вызвать
метод соответствующего объекта. Учитывайте, что впервые оконная процедура
вызывается во время выполнения CreateWindow(Ex), когда окно еще не создано.
2
 Аватар для Tarik20
21 / 22 / 5
Регистрация: 14.02.2013
Сообщений: 243
15.06.2013, 14:03  [ТС]
Спасибо за помощь!
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
22.06.2015, 17:14
В продолжение темы вопрос:
можно ли узнать HANDLE диалогового окна, создаваемого макросом DialogBox( ... ), чтобы привязаться к нему в функции SetWindowLongPtr() ?
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
22.06.2015, 17:25
Цитата Сообщение от VIKT0R Посмотреть сообщение
создаваемого макросом DialogBox( ... )
а CreateDialog не подходит? Возвращает дескриптор диалогового окна.
0
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
22.06.2015, 17:43
Не, CreateDialog создает немодальный диалог, а мне нужен модальный. В общем, я так понял, придётся использовать функцию CreateWindowEx, которая собственно и вызывается макросом DialogBox.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
22.06.2015, 17:46
Цитата Сообщение от VIKT0R Посмотреть сообщение
можно ли узнать HANDLE диалогового окна, создаваемого макросом DialogBox( ... ), чтобы привязаться к нему в функции SetWindowLongPtr() ?
Во-первых, у окна HWND, а не HANDLE, это разные вещи.
Во-вторых, когда DialogBox(Param) вернет управление, окна уже не будет.
В-третьих, чем не устраивает взять первый аргумент диалоговой оконной функции ?
1
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
22.06.2015, 19:01
Цитата Сообщение от Убежденный Посмотреть сообщение
Во-первых, у окна HWND, а не HANDLE, это разные вещи.
Да, спасибо за поправку.

Цитата Сообщение от Убежденный Посмотреть сообщение
В-третьих, чем не устраивает взять первый аргумент диалоговой оконной функции ?
Первый аргумент процедуры я использую в функции GetWindowLongPtr( hWnd, GWLP_USERDATA ).
Если я правильно понял смысл, то hWnd - это HWND диалогового окна, к которому до вызова процедуры я привязываю свои данные функцией SetWindowLongPtr( hWnd, GWLP_USERDATA, myData ):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void f( MyData *myData )
{
    HWND hWnd = ???   // Создаем диалоговое окно ( пока не знаю как )
 
    SetWindowLongPtr( hWnd, GWLP_USERDATA, myData ); // Привязываем к диалоговому окну свои данные
 
}
 
 
INT_PTR CALLBACK DialogProc( HWND hWnd, ... )
{
    ...
 
   MyData *myData  = GetWindowLongPtr( hWnd, GWLP_USERDATA )   // Получаем свои данные
 
    ...
 
}
0
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
22.06.2015, 19:09
Если требуется передать некие данные диалоговой процедуре используй DialogBoxParam и в последнем параметре LPARAM передавай эти данные.
Потом вытаскивай их в WM_INITDIALOG
1
9 / 9 / 5
Регистрация: 15.11.2011
Сообщений: 115
22.06.2015, 19:58
Спасибо, jonson, заработало!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.06.2015, 19:58
Помогаю со студенческими работами здесь

Оконная процедура дочернего окна - обработчик кнопки "Close" не работает
Здравствуйте! В своей программе создала дочернее окно, и создала оконную процедуру для него. А в нем написала обработчик кнопки...

Может ли оконная процедура различить, изменён ли размер окна функцией MoveWindow, или мышью за рамку окна?
Стиль WS_BORDER | WS_SIZEBOX | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_VISIBLE.

Процедура/функция обратного вызова в классе
Здравствуйте. Хочу сделать принадлежность процедуры/функции обратного вызова классу. Делаю это через классовые процедуры/функции: ...

Хранимая процедура или запросы в классе?
Доброго времени суток всем! Хотел бы узнать мнение опытных программеров, у меня есть два варианта: 1) реализовать все запросы в отдельном...

Оконная программа
Доброго времени суток. Вот такой тупой вопрос: как прикрутить к оконной программе кнопки листы и т.д. ? Почему то не получается(


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru