KNOW INTUIT, Лекция, Програмиране под Windows с помощта на Win API
Регистриране на клас прозорец
Всеки прозорец, който се създава в приложение на Windows, трябва да се основава на клас прозорец, шаблон, който дефинира избрани от потребителя стилове, шрифтове, заглавия и т.н. Всички дефиниции на класове на прозорци използват стандартния тип структура. Така първо се дефинира структурата WNDCLASS w и след това полетата на структурата се попълват с информация за класа на прозореца. Тази структура има много полета, но повечето от тях могат да бъдат дефинирани като нулеви. В програмата това става с реда memset(&w,0,sizeof(WNDCLASS)) ;
Разгледайте следния програмен фрагмент:
Този фрагмент дефинира стила на класа (всички идентификатори на стил започват с префикса CS_). В програмата стойностите на полето за стил се задават от константи. CS_HREDRAW ¬– осигурява преначертаване на съдържанието на клиентската област на прозореца, когато прозорецът се преоразмерява хоризонтално, CS_VREDRAW – осигурява преначертаване на съдържанието на клиентската област на прозореца, когато прозорецът се преоразмерява вертикално.
w.lpfnWndProc = WndProc е стойността на указател към функция на прозорец ( WndProc ), която изпълнява всички задачи, свързани с прозореца.
w.hInstance = hInstance – Указва екземпляра на приложението, който регистрира класа прозорец.
w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH) – Указва четката, използвана за рисуване на фона на прозореца.
w.lpszClassName = "Моят клас" е указател към символен низ, завършващ с 0, който указва името на класа. Класът тук не е клас в смисъла на ООП (обектно ориентирано програмиране). Терминът е един, но значението е две. Исторически, прозоречните класове предхождат ООП класовете.
RegisterClass(&w) - регистрацията става чрез извикване на функцията RegisterClass()..
Създаване на прозорец на базата на клас прозорец
hwnd = CreateWindow("Моят клас","Потребителски прозорец", WS_OVERLAPPEDWINDOW,500,300,500,380,NULL,NULL,hInstance,NULL);
Първият параметър на функцията се използва за задаване на класа на прозореца. Второто е заглавието на прозореца. Третият определя стила на прозореца (обикновен прозорец с наслагване със заглавна лента, бутон на системното меню, бутони за минимизиране и максимизиране и рамка). Следващите шест параметъра определят позицията на прозореца на екрана (X-ос и Y-ос), X- и Y-размерите на прозореца, ID на родителския прозорец и ID на менюто на прозореца. Следващото поле ( hInstance ) съдържа идентификатора на екземпляра на програмата, последван от информация за липсата на допълнителни параметри ( NULL ). Ако създаването на прозореца е успешно, тогава функцията CreateWindow(. ) връща идентификатора на създадения прозорец, в противен случай NULL. След като прозорецът е създаден, той трябва да бъде показан и актуализиран. За да покажете главния прозорец на приложението, извикайте функцията Windows ShowWindow(. ).
ShowWindow(hwnd,nCmdShow) показва прозореца. Параметърът hwnd съдържа идентификатора на прозореца, създаден при извикването на CreateWindow(. ). Вторият параметър определя как прозорецът се показва в първия момент.
Последната стъпка в извеждането на прозореца на екрана е извикването на функцията Windows UpdateWindow(hwnd), която кара клиентската област на прозореца да бъде преначертана.
Създайте цикъл на съобщения
Сега програмата е готова да изпълнява основната си задача - да обработва съобщения. Използва се стандартният C/C++ цикъл while:
Използване на функцията GetMessage
Използване на функцията TranslateMessage
Функцията TranslateMessage(. ) преобразува виртуални ключови съобщения в съобщения със знаци.
Използване на функцията DispatchMessage
Функцията DispatchMessage(.) се използва за разпространение на текущото съобщение до съответната функция на прозореца.
Прозоречна функция WndProc
Втората част на всяка Windows програма е процедурата на прозореца. В разглеждания пример той е малък (тъй като програмата не прави нищо), но именно тази част е най-важната и интересна в приложението.
Помислете за функцията WndProc:
Основната цел на прозоречната функция е да обработва съобщения на Windows. Всяко приложение получава много съобщения. Техният източник може да е различен. Например съобщения от потребителя или от самия Windows. Тези съобщения се обработват във функцията прозорец. Това означава, че за всяко съобщение трябва да напишете свой собствен манипулатор. Ако няма манипулатор, тогава приложението няма да обърне внимание на съобщението. Функцията прозорец има четири параметъра. Първият hwnd от тип HWND указва прозореца, който ще обработи съобщението. Второто UINT съобщение е съобщението, което се изпраща. Последните два WPARAM wparam, LPARAM lparam задават допълнителни параметри за предаденото съобщение. Те са различни за всяко съобщение. Процедурата на прозореца изпраща съобщение до превключвателя, който в примера има само един случай:
Тоест, докато въпросната програма обръща внимание само на съобщението WM_DESTROY. Прозорецът получава това съобщение само когато бъде унищожен. След като приемете това съобщение, трябва да извикате функцията PostQuitMessage(. ). В отговор на съобщение WM_DESTROY, съобщение WM_QUIT трябва да бъде поставено на опашка. Това прави функцията PostQuitMessage(. ), като публикува това съобщение в опашката и казва, че процесът трябва да бъде прекратен. Ако искаме нашата програма да реагира на нещо друго, тогава трябва да пишемдруг случай.
Помислете за следващия клон по подразбиране. Той извиква функцията DefWindowProc(hwnd, Message, wparam, lparam). Основната цел на тази функция е да обработва съобщения на Windows, които не се обработват в нашата програма (т.е. за които няма случай). В този случай нищо не се прави, но опашката от съобщения отива.