Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 91
1

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

17.03.2018, 22:48. Показов 1127. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2018, 22:48
Ответы с готовыми решениями:

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

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

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

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

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

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

WndProc Функция, определяемая приложением, которая обрабатывает сообщения, отправленные в окно.
HWND hWnd, // дескриптор окошка
UINT uMsg, // сообщение, посылаемое ОС
WPARAM wParam, // параметры
LPARAM lParam // сообщений, для последующего обращения
1
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 91
18.03.2018, 02:30  [ТС] 3
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
с++
1259 / 505 / 220
Регистрация: 15.07.2015
Сообщений: 2,526
18.03.2018, 02:46 4
Цитата Сообщение от usit Посмотреть сообщение
и что эти две переменные указывают на два разных окна, если да, то на какие окна они указывают?
указывает на одно и то же окно вы когда класс окна регистрируете вот:

C++
1
w.lpfnWndProc=WndProc; //указатель на функцию окна
поэтому эта переменная одна и та же, сделана для удобств что бы не делать куча непонятных переменных
1
1 / 1 / 0
Регистрация: 19.08.2015
Сообщений: 91
18.03.2018, 11:25  [ТС] 5
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
1128 / 787 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
18.03.2018, 13:36 6
Цитата Сообщение от 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2018, 13:36

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

hwnd = 0x00000000
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {...

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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