15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как использовать 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 будет перемещён до обработки сообщения, то дальний указатель на буфер будет неправильным.