Надсилання повідомлення

Функція SendMessage використовується для відправки повідомлення безпосередньо до вікна процедури. SendMessage виклик процедури вікна і чекає, що процедура для обробки повідомлення та повернення результатів.

Повідомлення можуть бути відправлені на будь-якому вікні системи; все, що потрібно, це дескриптор вікна. Система використовує маркер для визначення, яке процедури вікна повинна з'явитися повідомлення.

Перед обробкою повідомлення, що можливо, були відправлені з інший потік, вікно процедура спочатку повинні викликати функцію InSendMessage . Якщо ця функція повертає TRUE, процедура вікна повинні зателефонувати ReplyMessage до будь-якої функції, що викликає потоку для отримання керування, як показано в нижченаведеному прикладі.

справа WM_USER + 5: Якщо (InSendMessage()) ReplyMessage(TRUE); 
 
    DialogBox (hInst, "MyDialogBox", hwndMain, MyDlgProc (DLGPROC)); 
    Перерва 

 

Кількість повідомлень, можуть бути відправлені до елементів керування в діалоговому вікні. Ці повідомлення керування встановити вигляд, поведінку та вміст елементів керування або отримати відомості про елементи керування. Наприклад, CB_ADDSTRING повідомлення можна додати рядок до поля зі списком, і BM_SETCHECK повідомлення можна встановити прапорець стан прапорця або перемикача.

Щоб надіслати повідомлення до елемента керування, вказавши ідентифікатор елемента керування і ручкою діалоговому вікні вікно, яке містить елемент керування використовується функція SendDlgItemMessage . Нижче прикладі взято з діалоговому вікні процедури, копіює рядок з редагувати елемент керування поле зі списком, в його списку. Приклад використовує SendDlgItemMessage відправити CB_ADDSTRING повідомлення в полі зі списком.

HWND hwndCombo; 
Int cTxtLen; 
PSTR pszMem; 
 
перемикач (uMsg) {випадку WM_COMMAND: перемикання (LOWORD(wParam)) {випадку IDD_ADDCBITEM: / / отримати ручку зі списком і на / / контролювати довжину рядка у Правка / / зі списком. 
 
                hwndCombo = GetDlgItem (hwndDlg, IDD_COMBO); 
                cTxtLen = GetWindowTextLength(hwndCombo); 
 
                / / Виділити пам'ять для рядка та копіювати / / рядок в пам'яті. 
 
                pszMem = (PSTR) NULL VirtualAlloc((LPVOID) (DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); 
                GetWindowText (hwndCombo, pszMem, cTxtLen + 1); 
 
                / / Додати рядок до списку з на / / комбо у полі і видалити рядок з з / /Edit керування списком. 
 
                Якщо (* pszMem! = NULL) {SendDlgItemMessage (hwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) (pszMem (LPSTR))); 
                    SetWindowText (hwndCombo, (LPSTR) значення NULL); 
                } / / Вільний пам'ять і повернутися. 
 
                VirtualFree (pszMem, 0, MEM_RELEASE); 
                повертає TRUE; 
            / / / / Інші команди діалоговому вікні процес. 
            / /} / / / / Процес інші повідомлення діалогового вікна. 
    // 
 
} 

 

Index