Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение объекта по HWND / 6 сообщений из 6, страница 1 из 1
02.07.2021, 12:52
    #40081372
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
Очень нужно в дополнительном потоке отобразить окно прогресса с кнопкой "Отмена". Само окно без проблем рисуется на WinApi. Вопрос - как мне из оконной функции добраться до конкретного объекта, который реализует работу с этим окном?

Сейчас у меня есть два варианта: либо повторить реализацию MakeObjectInstance (стандартный использовать нельзя, т.к. он оперирует глобальными переменными) и обрабатывать сообщения уже самим объектом, либо помещать указатель на объект через SetWindowLongPtr(Handle, GWLP_USERDATA, Self).

Первый способ правильнее, второй проще. Может еще есть варианты?

Фактически нужно только особым способом обрабатывать WM_CLICK по кнопке. Со всем остальным отлично справляется cстандартная DefWindowProc()

С уважением, Vasilisk
...
Рейтинг: 0 / 0
02.07.2021, 13:00
    #40081378
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
Раз ты отображаешь окно в дополнительном потоке, значит в этом потоке есть цикл обработки
сообщений. Выкинь оконную процедуру вообще, обрабатывай сообщение непосредственно в цикле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.07.2021, 15:26
    #40081424
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
Dimitry Sibiryakov
обрабатывай сообщение непосредственно в цикле.
Вариант
...
Рейтинг: 0 / 0
09.07.2021, 12:30
    #40082960
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
В итоге остановился на таком варианте:
1. При регистрации класса окна оказываем
Код: pascal
1.
AParams.cbWndExtra := SizeOf(TObject);


2. В CreateWindowEx последним параметром передаем Self
3. Оконную функцию пишем так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function WindowProc(AHWnd: HWND; AMsg: UINT; AWParam: WPARAM; ALParam: LPARAM): LRESULT; stdcall;
var
  LCreateStruct: PCreateStruct absolute ALParam;
  LPrevVal: LONG_PTR;
  LError: Cardinal;
  LObj: TObject;
  LMsg: TMessage;
begin
  LMsg.Result := DefWindowProc(AHWnd, AMsg, AWParam, ALParam);
  if AMsg = WM_NCCREATE then begin
    LObj := LCreateStruct^.lpCreateParams;
    SetLastError(0);
    LPrevVal := SetWindowLongPtr(AHWnd, 0, LONG_PTR(LObj));
    if LPrevVal <> 0 then
      raise Exception.Create('Object already assigned');
    LError := GetLastError;
    if LError <> 0 then
      RaiseLastOSError(LError);
  end else
    LObj := TObject(GetWindowLongPtr(AHWnd, 0));
  if LObj <> nil then begin
    LMsg.Msg := AMsg;
    LMsg.WParam := AWParam;
    LMsg.LParam := ALParam;
    LObj.Dispatch(LMsg);
  end;
  Result := LMsg.Result;
end;
...
Рейтинг: 0 / 0
09.07.2021, 12:55
    #40082974
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
_Vasilisk_,

ыыы... это весенне - летнее обострение... я на днях тоже такое делал https://www.sql.ru/forum/1336558/kak-iz-nestaticheskogo-metoda-obekta-sdelat-staticheskiy-ili-analog-allocatehwnd :)
...
Рейтинг: 0 / 0
09.07.2021, 13:12
    #40082980
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получение объекта по HWND
ъъъъъ,

Я хотел уйти от GWL_USERDATA
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение объекта по HWND / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]