WinPro logo. Перейти на сайт www.winpro.narod.ru

Пример передачи сообщений напрямую оконной процедуре



Функция SendMessage используется для отправления сообщений напрямую оконной процедуре. Эта функция вызывает оконную процедуру и ожидает завершение ею обработки полученного сообщения.

Такие сообщения можно высылать любым окнам - для этого нужен только описатель окна. Система использует описатель окна для определения оконной процедуры, которая должна получить передаваемое сообщение. Перед обработкой сообщения оконной процедурой она должна вызвать функцию InSendMessage. Если эта функция возвращает TRUE, то нужно вызвать функцию ReplyMessage:

case WM_USER + 5: 
    if (InSendMessage()) 
        ReplyMessage(TRUE); 
 
    DialogBox(hInst, "MyDialogBox", hwndMain, (DLGPROC) MyDlgProc); 
    break;

Сообщения могут высылаться элементам управления диалогового окна. Например, сообщение CB_ADDSTRING добавляет строку в комбинированный список.

Для отправления сообщения элементу управления диалогового окна используйте функцию SendDlgItemMessage. В ней указывается идентификатор нужного элемента управления и описатель диалогового окна, в котором он находится. В следующем примере показана процедура диалогового окна, копирующая строку из элемента редактирования текста комбинированного списка добавляя ее в этот список:

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