Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы


Окно просмотра Clipboard - часть 2


Текущее окно просмотра получает сообщения, связанные с изменением состояния Clipboard, и передает их по цепочке.

Когда содержимое Clipboard изменяется, текущее окно просмотра получает сообщение WM_DRAWCLIPBOARD. Функция окна просмотра предает это сообщение по цепочке с помощью функции SendMessage и перерисовывает внутреннюю область окна, вызывая функцию InvalidateRect:

case WM_DRAWCLIPBOARD: { if(hwndNextViewer) SendMessage(hwndNextViewer, msg, wParam, lParam); InvalidateRect(hwnd, NULL, TRUE); return 0; }

Чтение и рисование нового содержимого Clipboard выполняется при обработке сообщения WM_PAINT, которое записывается в очередь приложения в результате вызова функции InvalidateRect.

В любой момент времени любое из существующих окон просмотра Clipboard может быть уничтожено пользователем или другим приложением. При этом если будет уничтожено следующее в цепочке окно просмотра, идентификатор которого вы сохранили в переменной hwndNextViewer, следует обновить содержимое переменной hwndNextViewer.

При любых изменениях в списке окон просмотра функция окна просмотра получит от Windows сообщение WM_CHANGECBCHAIN. Параметр wParam этого сообщения будет содержать идентификатор окна, удаляемого из списка окон просмотра. Младшее слово параметра lParam будет содержать идентификатор следующего окна просмотра в цепочке.

Обработка сообщения WM_CHANGECBCHAIN может быть выполнена следующим образом:

case WM_CHANGECBCHAIN: { if(wParam == (WPARAM)hwndNextViewer) hwndNextViewer = (HWND)LOWORD(lParam); else if(hwndNextViewer) SendMessage(hwndNextViewer, msg, wParam, lParam); return 0; }

Если удаляется следующее (по отношению к вашему) окно просмотра, значение параметра wParam равно значению, которое хранится в переменной hwndNextViewer. В этом случае мы записываем в переменную hwndNextViewer новое значение для идентификатора следующего в цепочке окна просмотра.

Если же удаляется другое окно, сообщение WM_CHANGECBCHAIN передается без изменений следующему окну. В том случае, когда следующего окна нет (наше окно является последним в цепочке окон просмотра Clipboard), содержимое переменной hwndNextViewer равно NULL, и нам не надо передавать это сообщение дальше.




Начало  Назад  Вперед



Книжный магазин