Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Классы и WinAPI


Автор: dvamaster 25.3.2010, 13:03
Доброго времени суток!!!

есть класс который создает поток.
в потоке создается и обрабатывается окно

как передать класс в процедуру окна

Код

FThread := CreateThread(nil, 0, @MainWndThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadId);


здесь класс прекрасно передается в MainWndThreadProc

Код

function MainWndThreadProc(ASelf: TMainWndPlugin):DWORD; stdcall;
var
  wc: WNDCLASS;
  mess: MSG;
begin
  Result := 0;
  wc.style := CS_HREDRAW or CS_VREDRAW;
  wc.lpfnWndProc := @MainWndProc;
  wc.cbClsExtra := 0;
  wc.cbWndExtra := 0;
  wc.hInstance := HInstance;
  wc.hIcon := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := COLOR_WINDOW;
  wc.lpszMenuName := nil;
  wc.lpszClassName := @szMainWndClass;
  if Windows.RegisterClass(wc) = 0 then
      Exit;
  ASelf.FMainWnd := CreateWindow(@szMainWndClass,
    @szCaption,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    GetDesktopWindow,
    0,
    HInstance,
    nil); // <---- вот сюда пытаюсь передать класс (Pointer(ASelf) или @ASelf)
  if ASelf.FMainWnd = 0 then
    Exit;
  ShowWindow(ASelf.FMainWnd, CmdShow);
  UpdateWindow(ASelf.FMainWnd);
  while GetMessage(mess, 0, 0, 0) do
    begin
      TranslateMessage(mess);
      DispatchMessage(mess)
    end;
  ASelf.FCore.TerminateApplication
end;


там где помечено пытаюсь передать класс и как Pointer(ASelf), и как @ASelf
без разницы, переменная LPARAM в оконной процедуре (MainWndProc)
указывает на непонятный адрес, причем с одним и тем же значением.

так же пробовал передать через SetWindowLong и SetWindowLongPtr, не помогает.

Как сохранить в окне класс?

Автор: bems 25.3.2010, 20:39
Правильно Pointer(ASelf). И указатель будет доступен в оконной процедуре при получении сообщения WM_CREATE.
Код

PCreateStruct(lParam).lpCreateParams

Автор: dvamaster 29.3.2010, 12:25
 smile точно, я и забыл про структуру TCreateStruct

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)