Top.Mail.Ru
Ответы
Аватар пользователя
7лет
Изменено
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

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

Один раз в функции WinMain:

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{ HWND hwnd; // дескриптор окна
...

и второй раз в функции WndProc:

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
...

Весь код целиком:

/*WinAPI приложение. Минимальный
набор функций для отображения окна.
Эта программа станет базовой заготовкой для всех последующих программ*/

#include

//Создаём прототип функции окна
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;
}

По дате
По рейтингу
Аватар пользователя
Новичок
7лет

Для того, чтобы не изобретать каждый раз новые имена. Это не одна переменная, объявленная дважды, а ДВЕ РАЗНЫЕ переменные, каждая из которых доступна только в своей функции (и значение которой может быть передано в другую функцию при вызове последней).

Ты пытаешься разобраться с WinAPI, но при этом не знаешь элементарнейших свойств языка, на котором пишешь код.

СНАЧАЛА учатся пользоваться инструментами и только ПОТОМ начитают этими инструментами делать что-то реальное. Сначала С (Керниган & Ритчи), а только потом WinAPI.

Аватар пользователя
Мудрец
7лет

Чувак, ты только что обнаружил разницу между глобальными и локальными переменными.
Можно сколько угодно клепать функций с "одинаковыми" переменными:

int func2x(int foo){
int result = 2*foo;
return(result); }

int funcx2(int foo){
int result = foo*foo;
return(result); }

Всё равно они будут разными. Потому что они ЛОКАЛЬНЫЕ.

Аватар пользователя
Просветленный
7лет

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)

это коллбэк функция.

если окно получает сообщение, оно вызывает указанную в WNDCLASS(EX) функцию.

по параметру (HWND hwnd) можно понять какое окно её вызвало

Аватар пользователя
Высший разум
7лет

В WndProc она вообще-то как входящий параметр. А в WinMain она что-то типа глобальной. Всё тут правильно. А вот вопрос поставлен некорректно.