Как использовать SendMessage() вместо SendDlgItemMessage()

Далее описывается в каких случаях используется функция SendMessage(), а в каких SendDlgItemMessage().

Как SendMessage() так и SendDlgItemMessage() можно использовать для добавление строк в окно списка. SendMessage() используется для отправки сообщения указанному окну используя дескриптор окна списка. SendDlgItemMessage() используется для отправки сообщения дочернему окну данного окна используя идентификатор (ID) ресурса окна списка. SendDlgItemMessage() наиболее часто используется в функциями диалогового окна, которые имеют дескриптор диалога, а не элемента управления дочернего окна.

Вызов SendDlgItemMessage()

   SendDlgItemMessage (hwnd, id, msg, wParam, lParam) 

эквивалентен следующему вызову SendMessage():

   hwnd2 = GetDlgItem (hwnd, id);
SendMessage (hwnd2, msg, wParam, lParam);

Обратите внимание, что PostMessage() никогда не должна использоваться для общения с дочерними окнами диалогов по следующим причинам:

  1. Если сообщение не будет помещено в очередь сообщений элемента управления, то PostMessage() вернёт только ошибку. Так как многие сообщения возвращают элементу управления информацию, то PostMessage() не будет работать, так как она не возвращает информацию вызвавшему её.

  2. Только для 16-бит: Сообщения, такие как WM_SETTEXT которые включают дальний указатель (far pointer) на строку могут вызвать проблемы если постить при помощи функции PostMessage(). Дальний указатель может указывать на буфер, который находится внутри DS (data segment). PostMessage() не обрабатывает сообщения немедленно, а DS может быть перемещён. Поэтому, если DS будет перемещён до обработки сообщения, то дальний указатель на буфер будет неправильным.
Читайте также:
  • Как узнать количество элементов и размер корзины
    //Получает размер и количество элементов в корзинеSHSTDAPI SHQueryRecycleBin( LPCTSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);   ...
  • Как очистить корзину
    //Очищает корзину на указанном дискеSHSTDAPI SHEmptyRecycleBin( HWND hwnd, LPCTSTR pszRootPath, DWORD dwFlags);   ...
  • Как скрыть/показать панель задач
    Следующая функция позволяет не только скрыть/показать панель задач, но и установить рабочую область десктопа (при помощи SystemParametersInfo), чтобы при скрытии панель задач внизу не оставалось пустого места:void gShowHideTaskBar(BOOL bHide /*=FALSE*/){ CRect rectWorkArea = CRect(0,0,0,0); CRect ...
  • Как программно нажать кнопку Пуск
    А вот так: #include void main(void){ HWND hTaskBar, hButton; HDC hDCScreen = GetDC(NULL); DWORD ScreenHeight=GetDeviceCaps(hDCScreen,VERTRES); ReleaseDC(NULL, hDCScreen); hTaskBar= FindWindow("Shell_TrayWnd",NULL); hButton= GetWindow(hTaskBar, GW_CHILD); ...
  • Добавляем иконку в System Tray
    Данный пример представляет собой небольшую программку, при запуске которой, в строке статуса (там где в Windows показывается время) появляется иконка, которая может обрабатывать различные события, такие как двойное нажатие мышкой, и нажатие правой кнопкой на иконке.   Соответственно в зависи...