Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 93

Почему переменная HWND hwnd объявлена дважды?

17.03.2018, 22:48. Показов 1700. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Один раз в функции WinMain:
C++
1
2
3
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ HWND hwnd; // дескриптор окна
...
и второй раз в функции WndProc:
C++
1
2
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
...
Весь код целиком:
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
/*WinAPI приложение. Минимальный 
набор функций для отображения окна. 
Эта программа станет базовой заготовкой для всех последующих программ*/ 
 
#include <windows.h>
 
//Создаём прототип функции окна 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); 
//объявляем имя программы 
char szProgName[]="Имя программы"; 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) 
{ 
HWND hWnd; //идентификатор окна 
MSG lpMsg; 
 
WNDCLASS w; //создаём экземпляр структуры WNDCLASS и начинаем её заполнять 
 
w.lpszClassName=szProgName; //имя программы 
w.hInstance=hInstance; //идентификатор текущего приложения 
w.lpfnWndProc=WndProc; //указатель на функцию окна 
w.hCursor=LoadCursor(NULL, IDC_ARROW); //загружаем курсор в виде стрелки 
w.hIcon=0; //иконки у нас не будет пока 
w.lpszMenuName=0; //и меню пока не будет 
w.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //цвет фона окна - белый 
w.style=CS_HREDRAW|CS_VREDRAW; //стиль окна - перерисовываемое по х и по у 
w.cbClsExtra=0; 
w.cbWndExtra=0; 
 
//Если не удалось зарегистрировать класс окна - выходим 
if(!RegisterClass(&w)) 
return 0; 
 
//Создадим окно в памяти, заполнив аргументы CreateWindow 
 
hWnd=CreateWindow(szProgName, //Имя программы 
"Моя первая программа! ", //Заголовок окна 
WS_OVERLAPPEDWINDOW, //Стиль окна - перекрывающееся 
100, //положение окна на экране по х 
100, //по у 
500, //размеры по х 
400, //по у 
(HWND)NULL, //идентификатор родительского окна 
(HMENU)NULL, //идентификатор меню 
(HINSTANCE)hInstance, //идентификатор экземпляра программы 
(HINSTANCE)NULL); //отсутствие дополнительных параметров 
 
//Выводим окно из памяти на экран 
ShowWindow(hWnd, nCmdShow); 
//Обновим содержимое окна 
UpdateWindow(hWnd); 
 
//Цикл обработки сообщений 
 
while(GetMessage(&lpMsg, NULL, 0, 0)) { //Получаем сообщение из очереди 
TranslateMessage(&lpMsg); //Преобразуем сообщения клавиш в символы 
DispatchMessage(&lpMsg); //Передаём сообщение соответствующей функции окна 
} 
return(lpMsg.wParam); 
} 
 
//Функция окна 
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg, 
WPARAM wParam, LPARAM lParam) 
{ 
HDC hdc; //создаём контекст устройства 
PAINTSTRUCT ps; //создаём экземпляр структуры графического вывода 
 
//Цикл обработки сообщений 
switch(messg) 
{ 
//сообщение рисования 
case WM_PAINT : 
//начинаем рисовать 
hdc=BeginPaint(hWnd, &ps); 
//здесь вы обычно вставляете свой текст: 
TextOut(hdc, 150,150, "Здравствуй, WIN 32 API!!!!", 26); 
//закругляемся 
//обновляем окно 
ValidateRect(hWnd, NULL); 
//заканчиваем рисовать 
EndPaint(hWnd, &ps); 
break; 
 
//сообщение выхода - разрушение окна 
case WM_DESTROY: 
PostQuitMessage(0); //Посылаем сообщение выхода с кодом 0 - нормальное завершение 
break; 
 
default: 
return(DefWindowProc(hWnd, messg, wParam, lParam)); 
} 
return 0; 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2018, 22:48
Ответы с готовыми решениями:

Для чего служит первый параметр (HWND hWnd) в функции WndProc?
// функция обработки сообщений LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) Расшифруйте...

Окно на WinAPI, параметр функции WndProc (HWND hWnd,.)
Пытаюсь понять какое значение хранит первый параметр HWND hWnd в функции WndProc. В Windows в качестве окна может быть не только главное...

Найти HWND окна, зная HWND окна, породившего его
Здравствуйте! Имеется основное окно &quot;А&quot;. Это окно создаёт новое недочернее окно &quot;Б&quot;. Необходимо найти HWND окна &quot;Б&quot;,...

5
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
18.03.2018, 01:09
hwnd - Дескриптор - уникальный номер экземпляра окна программы(каждая программа при запуска получает его от windows автоматически), для того чтобы windows могла их различать.

В большинстве функций win API используется именно hWnd, чтобы система могла точно знать с каким окном ей необходимо выполнить требуемое действие...

WndProc Функция, определяемая приложением, которая обрабатывает сообщения, отправленные в окно.
HWND hWnd, // дескриптор окошка
UINT uMsg, // сообщение, посылаемое ОС
WPARAM wParam, // параметры
LPARAM lParam // сообщений, для последующего обращения
1
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 93
18.03.2018, 02:30  [ТС]
Antikl, правильно ли я понимаю, что переменная HWND hwnd в функции WinMain —
C++
1
2
3
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ HWND hwnd; // дескриптор окна
...
никак не связана с переменной HWND hwnd в функции WndProc —
C++
1
2
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
...
и что эти две переменные указывают на два разных окна, если да, то на какие окна они указывают?
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
18.03.2018, 02:46
Цитата Сообщение от usit Посмотреть сообщение
и что эти две переменные указывают на два разных окна, если да, то на какие окна они указывают?
указывает на одно и то же окно вы когда класс окна регистрируете вот:

C++
1
w.lpfnWndProc=WndProc; //указатель на функцию окна
поэтому эта переменная одна и та же, сделана для удобств что бы не делать куча непонятных переменных
1
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 93
18.03.2018, 11:25  [ТС]
Antikl, спасибо, вроде бы понял. И ещё хотел бы спросить, почему в функции WndProc указывается тип переменной (HWND):
C++
1
2
LONG WINAPI WndProc(HWND hWnd, ...)
...
а в других местах тип переменной не указан, стоит только имя переменной (hWnd):
C++
1
hdc=BeginPaint(hWnd, ...
C++
1
2
3
ValidateRect(hWnd, ...
//заканчиваем рисовать 
EndPaint(hWnd, &ps);
(мои извинения за такие глупые вопросы).
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
18.03.2018, 13:36
Цитата Сообщение от usit Посмотреть сообщение
HWND hwnd в функции WndProc, LONG WINAPI WndProc(HWND hwnd, ...
usit, пока функция WndProc не вызвана, нет смысла говорить о значении ее параметров. См. в связи с этим такие понятия: "формальный параметр" и "фактический параметр".
Пример. Если бы в приложении было несколько окон с одной процедурой WndProc, то при различных вызовах WndProc, параметр hwnd относился бы к разным окнам.

Добавлено через 34 минуты
Цитата Сообщение от usit Посмотреть сообщение
Почему переменная объявлена дважды?
usit, возможно вам будут интересны такие понятия: область видимости и скрытие имён.
Пример.

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
    int n = 4;
    {
        n = n + 3;
        int n = 10;
        n = n + 5;
    }
    printf( " n == %d   " , n );  // результат:  n == 7 
    getchar();
}
Добавлено через 40 минут

Не по теме:

Цитата Сообщение от Antikl Посмотреть сообщение
сделана для удобств что бы чтобы не делать куча непонятных переменных
Союз чтобы пишется слитно.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.03.2018, 13:36
Помогаю со студенческими работами здесь

Почему окна WinAPI-приложения имеют одинаковые идентификаторы (hWnd), разве они не должны быть уникальными?
Здравствуйте. У каждого окна должен быть только уникальный идентификатор, чтобы система могла отличить одно окно от другого. Почему тогда в...

HWND
Доброго времени суток, извините за такой тупой вопрос, но.... объявляю функцию void draw(HWND hwnd) { PAINTSTRUCT ps; ...

hwnd = 0x00000000
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { MSG msg; if(!doc.Open(FILE_NAME))...

HWND в double
Всем привет! Сразу скажу, что плохо в этом разбираюсь, поэтому не ругайтесь. У меня есть такая функция: double find_window(char...

DECLARE_HANDLE (HWND);
Почему так странно объявлен тип HWND? Может кто прокомментировать эти строки: //winnt.h #define DECLARE_HANDLE(name) struct name##__...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru