


Почему переменная 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;
}
Для того, чтобы не изобретать каждый раз новые имена. Это не одна переменная, объявленная дважды, а ДВЕ РАЗНЫЕ переменные, каждая из которых доступна только в своей функции (и значение которой может быть передано в другую функцию при вызове последней).
Ты пытаешься разобраться с WinAPI, но при этом не знаешь элементарнейших свойств языка, на котором пишешь код.
СНАЧАЛА учатся пользоваться инструментами и только ПОТОМ начитают этими инструментами делать что-то реальное. Сначала С (Керниган & Ритчи), а только потом WinAPI.
Чувак, ты только что обнаружил разницу между глобальными и локальными переменными.
Можно сколько угодно клепать функций с "одинаковыми" переменными:
int func2x(int foo){
int result = 2*foo;
return(result); }
int funcx2(int foo){
int result = foo*foo;
return(result); }
Всё равно они будут разными. Потому что они ЛОКАЛЬНЫЕ.
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
это коллбэк функция.
если окно получает сообщение, оно вызывает указанную в WNDCLASS(EX) функцию.
по параметру (HWND hwnd) можно понять какое окно её вызвало
В WndProc она вообще-то как входящий параметр. А в WinMain она что-то типа глобальной. Всё тут правильно. А вот вопрос поставлен некорректно.