|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Sending a Message
The SendMessage function is used to send a message directly to a window procedure. SendMessage calls a window procedure and waits for that procedure to process the message and return a result.
A message can be sent to any window in the system; all that is required is a window handle. Windows uses the handle to determine which window procedure should receive the message. Before processing a message that may have been sent from another thread, a window procedure should first call the InSendMessage function. If this function returns TRUE, the window procedure should call ReplyMessage before any function that causes the thread to yield control, as shown in the following example.
case WM_USER + 5: if (InSendMessage()) ReplyMessage(TRUE); DialogBox(hInst, "MyDialogBox", hwndMain, (DLGPROC) MyDlgProc); break;
A number of messages can be sent to controls in a dialog box. These control messages set the appearance, behavior, and content of controls or retrieve information about controls. For example, the CB_ADDSTRING message can add a string to a combo box, and the BM_SETCHECK message can set the check state of a check box or radio button. Use the SendDlgItemMessage function to send a message to a control, specifying the identifier of the control and the handle of the dialog box window that contains the control. The following example, taken from a dialog box procedure, copies a string from a combo box's edit control into its list box. The example uses SendDlgItemMessage to send a CB_ADDSTRING message to the combo box.
HWND hwndCombo; int cTxtLen; PSTR pszMem; switch (uMsg) { case WM_COMMAND: switch (LOWORD(wParam)) { case IDD_ADDCBITEM: // Get the handle of the combo box and the // length of the string in the edit control // of the combo box. hwndCombo = GetDlgItem(hwndDlg, IDD_COMBO); cTxtLen = GetWindowTextLength(hwndCombo); // Allocate memory for the string and copy
// the string into the memory. pszMem = (PSTR) VirtualAlloc((LPVOID) NULL, (DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); GetWindowText(hwndCombo, pszMem, cTxtLen + 1); // Add the string to the list box of the // combo box and remove the string from the // edit control of the combo box. if (*pszMem != NULL)
{ SendDlgItemMessage(hwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) ((LPSTR) pszMem)); SetWindowText(hwndCombo, (LPSTR) NULL); } // Free the memory and return. VirtualFree(pszMem, 0, MEM_RELEASE); return TRUE; // // Process other dialog box commands. //
} // // Process other dialog box messages. // }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Посылка Сообщения
Функция SendMessage использована, чтобы посылать сообщение непосредственно в процедуру окна. SendMessage ВЫЗЫВАЕТ процедуру окна и ждет эту процедуру, чтобы обрабатывать сообщение и возвращать результат.
Сообщение может быть послано в любое окно в системе; все, что потребовался, - ручка окна. Окно использует ручку, чтобы определять, что какая процедура окна должна получать сообщение. Перед обработкой сообщения, что возможно послан из другой резьбы, процедура окна должна сначала вызывать функцию InSendMessage. Если эта функция возвращает ИСТИНУ, процедура окна должна вызывать ReplyMessage перед любой функцией, которая заставляет резьбу, чтобы давать управление, как показано в следующем примере.
случай WM_USER + 5: если (InSendMessage()) ReplyMessage(ИСТИНА); DialogBox(hInst, "MyDialogBox", hwndMain, (DLGPROC) MyDlgProc); прерывание;
Множество сообщений может быть послано в элементы управления в диалоговом ящике. Эти управляют сообщениями устанавливать появление, поведение, и содержимое элементов управления или извлекает информацию об элементах управления. Например, сообщение CB_ADDSTRING может добавить строку к блоку combo, и сообщение BM_SETCHECK может установить контрольное состояние контрольного блока или радио кнопки. Используйте функцию SendDlgItemMessage, чтобы посылать сообщению на управление, определение идентификатора управления и ручка диалогового окна блока, которые содержат управление. Следующий пример, взятый из диалогового блока процедуры, копирует строку с управления редактирования блока combo в свой блока списка. Пример использует SendDlgItemMessage, чтобы посылать сообщение CB_ADDSTRING блоку combo.
HWND hwndCombo; int cTxtLen; PSTR pszMem; ключ (uMsg) { случай WM_COMMAND: ключ (LOWORD(wParam)) { случай IDD_ADDCBITEM: // Получать ручку блока combo и // длина строки на управлении / редактировании/ блока combo. hwndCombo = GetDlgItem(hwndDlg, IDD_COMBO); cTxtLen = GetWindowTextLength(hwndCombo); // Распределите памяти для строки и копии
// строка в память. pszMem = (PSTR) VirtualAlloc((LPVOID) НЕДЕЙСТВИТЕЛЬНЫЙ, (DWORD) (cTxtLen + 1), MEM_COMMIT, PAGE_READWRITE); GetWindowText(hwndCombo, pszMem, cTxtLen + 1); // Добавьте строку к блоку списка // combo блока и удаляйте строку с // управления редактирования блоком combo. если (*pszMem != НЕДЕЙСТВИТЕЛЬНЫЙ)
{ SendDlgItemMessage(hwndDlg, IDD_COMBO, CB_ADDSTRING, 0, (DWORD) ((LPSTR) pszMem)); SetWindowText(hwndCombo, (LPSTR) НЕДЕЙСТВИТЕЛЬНЫЙ); } // Свободный память и возврат. VirtualFree(pszMem, 0, MEM_RELEASE); возвращайтесь ВЕРНО; // // Процесс другой диалоговый блок команд. //
} // // Процесс другие диалоговые сообщения блока. // }
|
|
|
|
| |