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


Автор: Igor_thief 31.8.2007, 23:42
Имеется следующий код:
Код

type
  TForm4 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    procedure WMNCCreate(var Message: TWMNCCreate); message WM_NCCREATE;
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;
  end;

var
  Form4: TForm4;
  TitleBarSize: LongInt;

implementation

{$R *.dfm}

{ TForm4 }

procedure TForm4.WMNCCalcSize(var Message: TWMNCCalcSize);
begin
end;

procedure TForm4.WMNCCreate(var Message: TWMNCCreate);
var
  dwStyle: longint;
begin
  TitleBarSize := (GetSystemMetrics(SM_CYCAPTION) div 2) + 1;
  dwStyle := GetWindowLong(Handle, GWL_STYLE);
//  dwStyle := dwStyle or WS_SMALLTITLEBAR;
  if (dwStyle and WS_DLGFRAME) = WS_DLGFRAME then
    dwStyle := dwStyle and not longint(WS_DLGFRAME);
  dwStyle := dwStyle and not (WS_BORDER);
  SetWindowLong(Handle, GWL_STYLE, dwStyle);

  inherited;  {Call default processing.}
end;


Все выше указанное делается для того, чтобы убрать у формы заголовок и при этом иметь возможность изменять размеры формы при помощи мыши. Но наткнулся на один нюанс. Если теперь навести курсор мыши на один из 4-х углов формы, то курсор, как и должен, меняется на курсор который символизирует что можно менять размер формы, но когда начинаешь плавно двигать курсор по одному из краев формы, то он, напротяжении определенного растояния не меняется на вертикальную/горизонтальную стрелочку для изменения размеров. Как это исправить?
http://img63.imageshack.us/my.php?image=20070831234218bp8.png

Автор: try_to_get 1.9.2007, 19:32
Igor_thief, В Делфи у готовых форм vcl уже все курсоры где нужно установлены.
Видимо ваш код изменил стандартную форму и теперь вам нужно самому написать код установки нужного курсора, например при изменение размера, такой курсор и т.д.

Автор: Igor_thief 2.9.2007, 21:14
Цитата(try_to_get @  1.9.2007,  18:32 Найти цитируемый пост)
Igor_thief, В Делфи у готовых форм vcl уже все курсоры где нужно установлены.
Видимо ваш код изменил стандартную форму и теперь вам нужно самому написать код установки нужного курсора, например при изменение размера, такой курсор и т.д. 

За ответ конечно спасибо, но вы не правы.

Есть еще варианты?

Автор: BaD_SeCt0R 4.9.2007, 01:05
Хех... Пока ничо в голову кроме совета обработать WM_NCMOUSEMOVE не приходит.

Автор: greenpc 4.9.2007, 07:53
а такой вариант подойдет ?
Код

public
procedure CreateParams(var Params: TCreateParams); override;
---------
procedure TForm1.Createparams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
    Style := (Style or WS_POPUP) and (not WS_DLGFRAME);
end;


Автор: BaD_SeCt0R 4.9.2007, 19:23
Цитата(greenpc @  4.9.2007,  07:53 Найти цитируемый пост)
а такой вариант подойдет ?


не работает твой вариант...

Автор: greenpc 5.9.2007, 07:53
BaD_SeCt0R, проверь
borderstyle :=bsSizeable;
все работает (XP SP2 лицензия, D7 лицензия)
или так
Код

procedure TForm1.CapClose;
var
  dwStyle: Longint;
begin
  if BorderStyle=bsNone then
    Exit;
  dwStyle:=GetWindowLong(Handle, GWL_STYLE);
  if (dwStyle and WS_CAPTION)=WS_CAPTION then
  begin
    case BorderStyle of
      bsSingle, bsSizeable:
        SetWindowLong(Handle, GWL_STYLE, dwStyle and (not WS_CAPTION) or WS_BORDER);
      bsDialog:
        SetWindowLong(Handle, GWL_STYLE, dwStyle and
        (not WS_CAPTION) or DS_MODALFRAME or WS_DLGFRAME);
    end;
    Height:=Height-GetSystemMetrics(SM_CYCAPTION);
    Refresh;
  end;
end;




Автор: BaD_SeCt0R 5.9.2007, 08:46
Цитата(greenpc @  5.9.2007,  07:53 Найти цитируемый пост)
borderstyle :=bsSizeable;
все работает (XP SP2 лицензия, D7 лицензия)


greenpc, все то же самое, бордер убираеться, но проблема с курсором на углах остается. Имхо, баг какой-то...

Автор: greenpc 5.9.2007, 08:59
BaD_SeCt0R, 
а эти процедуры выкинул ?
Код

protected
    procedure WMNCCreate(var Message: TWMNCCreate); message WM_NCCREATE;
    procedure WMNCCalcSize(var Message: TWMNCCalcSize); message WM_NCCALCSIZE;



Автор: BaD_SeCt0R 5.9.2007, 09:28
Цитата(greenpc @  5.9.2007,  08:59 Найти цитируемый пост)
а эти процедуры выкинул ?


Ессессьвенно! Еще пока головой думаю smile

Автор: Yanis 7.9.2007, 18:09
По моим наблюдением такое поведение типично для большинства окон Windows. Ничего смертельного в этом нет.

Автор: BaD_SeCt0R 7.9.2007, 19:29
Цитата(Yanis @  7.9.2007,  18:09 Найти цитируемый пост)
По моим наблюдением такое поведение типично для большинства окон Windows. Ничего смертельного в этом нет.

Смертельного, конечно, нет, но неприятно все-таки... Ты сам бы какое решение предложил?

Автор: Yanis 10.9.2007, 12:37
Цитата(BaD_SeCt0R @  7.9.2007,  20:29 Найти цитируемый пост)
Ты сам бы какое решение предложил?

Не извращаться smile

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