windows_programming_notes.nbk: Home | Index | Next Page: SendMessage | Previous Page: SelectObject
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. The system 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. // }
windows_programming_notes.nbk: Home | Index | Next Page: SendMessage | Previous Page: SelectObject
Notebook exported on Monday, 7 July 2008, 18:56:50 PM Eastern Daylight Time