Функция SendMessage используется для отправки сообщения непосредственно оконной процедуре. SendMessage вызывает оконную процедуру и ждет эту процедуру, чтобы обработать сообщение и возвратить значение результата обработки.
Сообщение может быть отправлено в любое окно в системе; все, что требуется для этого - дескриптор окна. Система использует дескриптор, чтобы выяснить, какая оконная процедура должна получить сообщение.
Перед обработкой сообщения, которое, возможно, было отправлено из другого потока, оконная процедура, должна сначала обратиться к функции InSendMessage. Если эта функция возвратит значение ИСТИНА (TRUE), оконная процедура должна вызвать функцию ReplyMessage перед любой функцией, которая заставляет поток уступить управление, как показано в нижеследующем примере.
case WM_USER + 5: if (InSendMessage()) ReplyMessage(TRUE); DialogBox(hInst, "MyDialogBox", hwndMain, (DLGPROC) MyDlgProc); break; |
Ряд сообщений может быть отправлен в органы управления в блоке диалога. Эти управляющие сообщения устанавливают появление, поведение и содержание органов управления или извлекают информацию об органах управления. Например, сообщение CB_ADDSTRING может добавить строку в комбинированном блоке, а сообщение BM_SETCHECK может установить в состояние проверки ("галочки") окошка метки или радио-кнопки.
Используя функцию SendDlgItemMessage, чтобы отправить сообщение органу управления, установите идентификатор органа управления и дескриптора окна блока диалога, которое содержит орган управления. Нижеследующий пример, взятый из процедуры диалогового окна, копирует строку из поля редактирования текста комбинированного блока в его окно со списком. Пример использует функцию SendDlgItemMessage, чтобы отправить сообщение CB_ADDSTRING комбинированному блоку.
Демонстрационный пример
HWND hwndCombo; int cTxtLen; PSTR pszMem; switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDD_ADDCBITEM: // Получим дескриптор комбинированного окна и // длину строки в поле редактирования // комбинированного окна. hwndCombo = GetDlgItem(hwndDlg, IDD_COMBO); cTxtLen = GetWindowTextLength(hwndCombo); // Выделим память для строки и скопируем // строку в память. pszMem = (PSTR) VirtualAlloc((LPVOID) NULL, (DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); GetWindowText(hwndCombo, pszMem, cTxtLen + 1); // Добавим строку в окно со списком // комбинированного окна и удалим строку из // поля редактирования комбинированного окна. if (pszMem != NULL) { SendDlgItemMessage(hwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) ((LPSTR) pszMem)); SetWindowText(hwndCombo, (LPSTR) NULL); } // Освободим распределенную память и возвратим значение. VirtualFree(pszMem, 0, MEM_RELEASE); return TRUE; // // Обработка других команд диалогового окна. // } // // Обработка других сообщений диалогового окна. // } |