Отправка сообщений

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

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz