Odoslanie správy

SendMessage funkcia sa používa na odoslanie správy priamo na okno postupu. SendMessage funkcia volá externú procedúru okno a čaká na tento postup na spracovanie správy a vráti výsledok.

Správy je možné zaslať ľubovoľného okna v systéme; všetko, čo je potrebné je okno rukoväť. Systém používa popisovač zistiť, aký okno postup by mal dostať správu.

Pred spracovania správ, ktoré boli odoslané z iného vlákna, okno postup najprv volať funkciu InSendMessage . Ak táto funkcia vráti hodnotu TRUE, okno postup by mal zavolať ReplyMessage pred žiadnu funkciu, ktorá spôsobuje vlákno prinášať ovládací prvok, ako je to znázornené v nasledovnom príklade.

prípad WM_USER + 5: Ak (InSendMessage()) ReplyMessage(TRUE); 
 
    DialogBox (hInst, "MyDialogBox", hwndMain, MyDlgProc (DLGPROC)); 
    prestávka 
 

Číslo správy je možné zaslať ovládacie prvky dialógového okna. Tieto kontrolné správy nastaviť vzhľad, správanie a obsah ovládacích prvkov alebo získať informácie o kontrolách. Napríklad, CB_ADDSTRING správy môžete pridať reťazec do poľa so zoznamom a BM_SETCHECK správu môžete nastaviť stav začiarkavacie políčko alebo prepínacie tlačidlo.

Funkcia SendDlgItemMessage poslať správu na ovládací prvok, uvedie identifikátor kontroly a rúčkou dialógové okno pole, obsahujúcu ovládací prvok. Nasledujúci príklad odobraté postup dialógové okno pole skopíruje rozbaľovacie pole upraviť kontrolu reťazec do svojho zoznamu bloku. Tento príklad používa SendDlgItemMessage CB_ADDSTRING správu odoslať rozbaľovacie pole.

HWND hwndCombo; 
int cTxtLen; 
PSTR pszMem; 
 
prepínač (uMsg) {prípad WM_COMMAND: prepínanie (LOWORD(wParam)) {prípad IDD_ADDCBITEM: / / získať popisovač poľa so zoznamom a / / dĺžku reťazca v poli upravte kontroly / / pole so zoznamom. 
 
                hwndCombo = GetDlgItem (hwndDlg, IDD_COMBO); 
                cTxtLen = GetWindowTextLength(hwndCombo); 
 
                / / Vyhradiť pamäť pre reťazec a kópia / / reťazec do pamäte. 
 
                pszMem = (PSTR) VirtualAlloc((LPVOID) NULL, (DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); 
                GetWindowText (hwndCombo, pszMem, cTxtLen + 1); 
 
                / / Pridať reťazec do poľa zoznamu / / rozbaľovacie pole a odstrániť reťazec z / / ovládací prvok rozbaľovacie pole na úpravu. 
 
                Ak (* pszMem! = NULL) {SendDlgItemMessage (hwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) ((ukončený nulou LPSTR) pszMem)); 
                    SetWindowText (hwndCombo, ukončený nulou (LPSTR) NULL); 
                } / / Uvoľnite pamäť a návrat. 
 
                VirtualFree (pszMem, 0, MEM_RELEASE); 
                Vráti hodnotu pravda; 
            / / / Procesu iné dialógové okno poľa príkazy. 
            / /} / / / Procesu iné dialógové okno pole správy. 
    // 
 
} 
 

Index