Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2016, 10:55   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию SetWindowLong(handle,GWL_EXSTYLE, WS_EX_CLIENTEDGE) не работает под классом

Здравствуйте.
Нужно изменить расширеный стиль окна в классе TWinApiPanel. За это отвечает свойство StyleEx базового
класса TWinApiBase и процедура SetStyleEx.
Код:

type
  TWinApiBase = class(TObject)
    private
      fHandle : HWND;
	  {.......}
	  fStyle : Cardinal;
      fStyleEx : Cardinal;
      procedure SetStyleEx(NewStyleEx : Cardinal); virtual;
	  {..........}
    public
      constructor Create(ParentWnd : HWND); virtual;
      destructor Destroy; virtual;
	  {...........}
      property Handle : HWND read fHandle;
	  {...........}
      property StyleEx: Cardinal read fStyleEx write SetStyleEx;
  end;

type
  TWinApiPanel = class(TWinApiBase)
    private
      fText : string;
      procedure SetText(t : string);
	  {.........}
    public
      constructor Create(ParentWnd : HWND); virtual;
      destructor Destroy; virtual;
      property Text : string read fText write SetText;
  end;

implementation

constructor TWinApiBase.Create(ParentWnd: HWND);
begin
  fLeft := 0;
  fTop := 0;
  fWidth := 0;
  fHeight := 0;
  fStyle := WS_CHILD or WS_VISIBLE;
  fStyleEx := WS_EX_ACCEPTFILES;
end;

destructor TWinApiBase.Destroy;
begin
  Exit;
end;

procedure TWinApiBase.SetStyleEx(NewStyleEx: Cardinal);
var
  res : LongInt;
begin
  res := SetWindowLong(Handle,GWL_EXSTYLE, NewStyleEx);
  fStyleEx := NewStyleEx;
end;






constructor TWinApiPanel.Create(ParentWnd: HWND);
begin
  inherited Create(ParentWnd);
  fhandle := CreateWindowExW(fStyleEx,'Static','',
  fStyle, 0,0,0,0, ParentWnd,0, hInstance, nil);
//  StyleEx := WS_EX_CLIENTEDGE;
end;

destructor TWinApiPanel.Destroy;
begin
  DestroyWindow(fHandle);
  inherited;
end;

procedure TWinApiPanel.SetText(t: string);
begin
  SendMessage(fHandle, WM_SETTEXT, 0, lparam(LongInt(t)));
  fText := t;
end;
В коде программы делаю так:
Код:
    WM_CREATE:
    begin
      lab := TWinApiPanel.Create(wnd);
      lab.SetPositionSize(0,70,400,400);
      lab.Text := 'text';
      lab.StyleEx := WS_EX_CLIENTEDGE;  //выполняется, но не работает.
    end;

    wm_destroy :
    Begin
      lab.Free;
    end;
При попытке изменить свойство StyleEx внешний вид окна не меняется. И даже если
напрямую вызвать SetWindowLong(lab.Handle,GWL_EXSTYL E, WS_EX_CLIENTEDGE) - всё-равно ничего не меняется.
А если делать это в конструкторе класса TWinApiPanel - тогда работает.
Почему так и можно ли это решить?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.08.2016, 11:09   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Где вызов SetWindowPos ?
p51x вне форума Ответить с цитированием
Старый 30.08.2016, 11:18   #3
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Где вызов SetWindowPos ?
вот:
Код:
procedure TWinApiPanel.SetPositionSize(x: SmallInt; y: SmallInt; w: SmallInt; h: SmallInt);
begin
  MoveWindow(fHandle,x,y,w,h,True);
  inherited;
end;
а разве это имеет значение?
BLACK_RAIN вне форума Ответить с цитированием
Старый 30.08.2016, 11:24   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

1. это не вызов, а определение метода
2. этот SetPositionSize к SetWindowPos мало имеет отношение, даже названия разные
3.
Цитата:
а разве это имеет значение?
Да не, просто в офф документации всякую фигню пишут, типа:
Цитата:
Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function. Specifically, if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly.
p51x вне форума Ответить с цитированием
Старый 30.08.2016, 11:41   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

согласен, лохонулся
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SetWindowLong + WS_EX_NOACTIVATE delphinewbie Win Api 3 23.01.2016 02:06
GetWindowLong и SetWindowLong Coyot Помощь студентам 0 04.12.2010 14:03
Как узнать handle окна имея handle обного из его компонентов SeRhy Win Api 2 18.10.2009 19:31
Как узнать HANDLE компонента который находится под курсором мыши SeRhy Общие вопросы Delphi 7 04.02.2009 20:39
Как имея handle окна узнать handle edit-a который находится в етом окне SeRhy Общие вопросы Delphi 1 20.07.2008 13:48