Функция 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;
//
// Обработка других команд диалогового окна.
//
}
//
// Обработка других сообщений диалогового окна.
//
}
|