Базовые элементы Windows-приложений. Проект типа Win32 Application, страница 6

Если требуется нарисовать что-либо вне обработчика WM_PAINT, последовательность действий должна быть следующей:

{

HDC hdc = GetDC(hwnd);

//рисуем с помощью hdc

...

ReleaseDC(hwnd, hdc);

}

Прототипы функций:

HDC GetDC( HWND hWnd);

,где HWND hwnd - функция в качестве параметра принимает дескриптор окна, в котором хотим рисовать, если параметр равен 0, хотим рисовать на всем экране возвращаемое значение – в случае успешного завершения функция возвращает дескриптор контекста для рисования, иначе 0

..9 Синхронные и асинхронные сообщения

Не все сообщения попадают в очередь приложения и соответственно передаются операционной системой в функцию окна приложения через цикл обработки сообщений (PostMessage()). Существует способ передачи сообщения оконной процедуре напрямую – минуя очередь приложения (SendMessage()). Для программиста такой синхронный вызов выглядит как вызов функции.

PostMessage – в очередь приложения

SendMessage – прямо в оконную процедуру. Для нас (программистов) такой вызов эквивалентен вызову функции (но это делается с помощью системных сервисов!).

.  Виды

Platform SDK\User Interface Services\ Windows User Interface\Windowing\Messages and Message Queues

..1 Сообщение WM_CREATE

Это сообщение посылается, когда приложение просит ОС создать окно с помощью сервиса CreateWindow()или CreateWindowEx(). Оконная процедура создаваемого нового окна получает это сообщение, после того как соответствующий объект создан, но перед тем, как окно становится видимым. (и до того, как произошел возврат из CreateWindow())

LRESULT CALLBACK WindowProc(

HWND hwnd,       // handle to window

UINT uMsg,       // WM_CREATE

WPARAM wParam,   // not used

LPARAM lParam// creation data (LPCREATESTRUCT)

);

Если приложение обрабатывает это сообщение, оно должно вернуть 0, чтобы завершилось создание окна. Если приложение возвращает –1, окно уничтожается, а функция CreateWindow() возвращает нулевой описатель.

If the WS_VISIBLE style is specified, CreateWindow sends the window all the messages required to activate and show the window.

..2 Сообщение WM_DESTROY

Это сообщение посылается когда пользователь выбирает пункт системного меню Close или нажимает на системную кнопку. Оно посылается оконной процедуре главного окна сразу же после того, как объект-окно уничтожен (окно исчезло с экрана). Сначала сообщение посылается уничтожаемому окну, а потом дочерним окнам, если они есть (поэтому во время обработки сообщения Вы можете быть уверены, что дети еще существуют).

DefWindowProc does not automatically call PostQuitMessage when it handles a WM_DESTROY message

Важно! – это сообщение дает Вам возможность завершить Ваше приложение (не обрабатывается процедурой по умолчанию) => Вы должны его обработать и в обработчике вызвать сервис:

PostQuitMessage(0)

, который в свою очередь пошлет Вашему приложению WM_QUIT. Иначе Вы никогда не сможете выйти из цикла обработки сообщений Вашего приложения.

LRESULT CALLBACK WindowProc(

HWND hwnd,       // handle to window

UINT uMsg,       // WM_DESTROY

WPARAM wParam,   // not used

LPARAM lParam    // not used

);

If an application processes this message, it should return zero.

..3 Сообщение WM_COMMAND

Практически все, что вы видите на экране – это окна => каждый такой элемент имеет свою оконную процедуру, которая специфическим для данного конкретного класса окна образом обрабатывает (явным образом или передает процедуре по умолчанию) все сообщения для данного окна, в том числе WM_LBUTTONDOWN...: Каждое окно “живет” своей жизнью посредством оконной процедуры.

LRESULT CALLBACK WndProc(     HWND hWindow,  //дескриптор экземпляра-окна для данного (зарегистрированного) класса окна. Это тот дескриптор, который был возвращен функцией Create()

UINT Message,//константа, соответствующая данному сообщению (определена для стандартных сообщений в WINDOWS.H или WINUSER.H, для пользовательских – в соответствующем *.h). В нашем случае WM_COMMAND