Если требуется нарисовать что-либо вне обработчика WM_PAINT, последовательность действий должна быть следующей:
{
HDC hdc = GetDC(hwnd);
//рисуем с помощью hdc
...
ReleaseDC(hwnd, hdc);
}
Прототипы функций:
HDC GetDC( HWND hWnd);
,где HWND hwnd - функция в качестве параметра принимает дескриптор окна, в котором хотим рисовать, если параметр равен 0, хотим рисовать на всем экране возвращаемое значение – в случае успешного завершения функция возвращает дескриптор контекста для рисования, иначе 0
Не все сообщения попадают в очередь приложения и соответственно передаются операционной системой в функцию окна приложения через цикл обработки сообщений (PostMessage()). Существует способ передачи сообщения оконной процедуре напрямую – минуя очередь приложения (SendMessage()). Для программиста такой синхронный вызов выглядит как вызов функции.
PostMessage – в очередь приложения
SendMessage – прямо в оконную процедуру. Для нас (программистов) такой вызов эквивалентен вызову функции (но это делается с помощью системных сервисов!).
Platform SDK\User Interface Services\ Windows User Interface\Windowing\Messages and Message Queues
Это сообщение посылается, когда приложение просит ОС создать окно с помощью сервиса 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.
Это сообщение посылается когда пользователь выбирает пункт системного меню 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.
Практически все, что вы видите на экране – это окна => каждый такой элемент имеет свою оконную процедуру, которая специфическим для данного конкретного класса окна образом обрабатывает (явным образом или передает процедуре по умолчанию) все сообщения для данного окна, в том числе WM_LBUTTONDOWN...: Каждое окно “живет” своей жизнью посредством оконной процедуры.
LRESULT CALLBACK WndProc( HWND hWindow, //дескриптор экземпляра-окна для данного (зарегистрированного) класса окна. Это тот дескриптор, который был возвращен функцией Create()
UINT Message,//константа, соответствующая данному сообщению (определена для стандартных сообщений в WINDOWS.H или WINUSER.H, для пользовательских – в соответствующем *.h). В нашем случае WM_COMMAND
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.