Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизКак запретить двигать форму? Найти похожие ветки
← →
Бегун (2004-04-28 18:14) [0]subj
← →
Gero © (2004-04-28 18:18) [1]ShowMessage("Форму двигать запрещено! За нарушение - штраф 1000$!");
← →
Gero © (2004-04-28 18:19) [2]Да, забыл сказать, это надо в WM_MOVE писать...
← →
Бегун (2004-04-28 18:21) [3]Это понятно.
type
TfrmAdd = class(TForm)
public
procedure WMMove(var m: TMessage); message WM_MOVE;
end;
procedure TfrmAdd.WMMove(var m: TMessage);
begin
А ЧТО ЗДЕСЬ ПИСАТЬ?
end;
← →
Бегун (2004-04-28 18:23) [4]procedure TfrmAdd.WMMove(var m: TMessage);
begin
frmAdd.Left:=100;
frmAdd.Top:=100;
end;
Так мигает :(
← →
Gero © (2004-04-28 18:25) [5]M.Result := 0;
← →
Бегун (2004-04-28 18:29) [6]>Gero © (28.04.04 18:25) [5]
Все равно мигает, когда пытаюсь передвинуть.
Хочу что-бы не мигало, когда пытаюсь передвинуть.
← →
Gero © (2004-04-28 18:36) [7]Уберите у формы заголовок.
И тогда юзер ее двигать не сможет.
← →
Бегун (2004-04-28 18:41) [8]>Gero © (28.04.04 18:36) [7]
Такое решение имеет место быть :)
А что-бы не убирать заголовок?
← →
Игорь Шевченко © (2004-04-28 18:52) [9]Gero © (28.04.04 18:19)
WM_MOVE - это нотификационное сообщение (уведомление об изменении позиции)
Бегун (28.04.04 18:41)
WM_WINDOWPOSCHANGING
" An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS. "
← →
Sanek_metaller © (2004-04-29 00:04) [10]BorderStyle:=bsnone;
← →
DVM © (2004-04-29 00:24) [11]WM_MOVING тогда уж, а не WM_MOVE
← →
Бегун (2004-04-29 01:47) [12]Народ, или я тупой или лыжи не едут...
Использую WM_WINDOWPOSCHANGING, WM_MOVING
все равно форма мигает, если пытаюсь её тащить.. :(
Давайте еще раз четко изложу задачу.
Я ХОЧУ РАЗРЕШАТЬ/ЗАПРЕЩАТЬ ДВИГАТЬ ФОРМУ.
На форме frmAdd положим cbMove: TCheckBox.
Если True - двигать можно, если False - нельзя.
Как это сделать?
← →
default © (2004-04-29 02:17) [13]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
protected
procedure WMNCHITTEST(var Msg: TWMNCHITTEST); message WM_NCHITTEST;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
CanMove: Boolean = True;
implementation
{$R *.dfm}
procedure TForm1.WMNCHITTEST(var Msg: TWMNCHITTEST);
begin
inherited;
if not CanMove then if Msg.Result = HTCAPTION then Msg.Result := HTCLIENT
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CanMove := not CanMove
end;
end.
← →
Бегун (2004-04-29 03:06) [14]Спасибо, работает.
← →
DVM © (2004-04-29 10:37) [15]
> Бегун (29.04.04 03:06) [14]
А если подвинуть программно, то не сработает.
← →
ChainikDenis © (2004-05-20 20:31) [16]А еще не сработает если вызвать меню в правом углу формы "переместить". Проверил!
← →
tesseract © (2004-05-21 09:17) [17]А зачем тебе заголовок - кинь на форму панель и замаскируё под неё - и на фи не надо все сообщения обрабатывать - винда и без лишнего вмешательства логадается чем процессор занять.
← →
GEN (2004-05-21 13:07) [18]>Бегун
Загодовок убирать не надо. Просто координаты мыши надо переустанавливать "внутрь формы", пусть Win думает, что пытаемся тащить не за заголовок
← →
WebErr © (2004-05-21 18:23) [19]
> Использую WM_WINDOWPOSCHANGING, WM_MOVING
> все равно форма мигает, если пытаюсь её тащить.. :(
Ты процедуру Abort знаешь?
Используй её в WM_WINDOWPOSCHANGING процедуре!!!
Неужели не доходит! :))))
← →
WebErr © (2004-05-21 18:28) [20]Просто напиши между begin и end слово Abort; !
← →
LMD © (2004-05-21 23:23) [21]
> Ты процедуру Abort знаешь?
> Используй её в WM_WINDOWPOSCHANGING процедуре!!!
Если ты пробовал, то приведи рабочий код. Если не пробовал, то не сбивай людей с толку, Abort в обработчике сообщения не приводит к нужному эффекту.
← →
tesseract © (2004-05-22 11:56) [22]А зачем тебе неперетасиваемое окно с заголовком? ну накатай свой, похожий. Юзер увидев окно с заголовком сразу начнёт его перетаскивать - так-что лучше не парься.
← →
Глеб © (2004-05-29 13:50) [23]
for i := 1 to 10000000 do
begin
ShowMessage("Чтобы переместить форму, тебе придётся все эти сообщения закрыть :-)");
end;
:-)
← →
Ivolg (2004-05-30 15:44) [24]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrmAdd = class(TForm)
CheckBox1: TCheckBox;
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FrmAdd: TFrmAdd;
b:boolean;
implementation
{$R *.dfm}
procedure TFrmAdd.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if b then
ReleaseCapture;
Perform(wm_SysCommand,$F012,0);
end;
procedure TFrmAdd.CheckBox1Click(Sender: TObject);
begin
b:=not b
end;
end.
и на FormCreate или в ручную:
BorderStyle:=bsnone;
← →
Глеб © (2004-05-31 11:00) [25]запустить бесконечный цикл
← →
grom (2004-05-31 15:49) [26]а можно попровывать вот так
public { Public declarations }
Procedure WMGetSysCommand(var Message:TMessage);message WM_SYSCOMMAND;
========================
procedure TForm1.WMGetSysCommand(var Message:TMessage); //**
begin
if (CheckBox1.Checked)or(Message.wParam=SC_MINIMIZE)or(Message.wParam=SC_CLOSE)
or(Message.wParam=SC_MAXIMIZE)//и так далее...
then inherited;
end;
← →
MetalFan © (2004-05-31 17:30) [27]хех) а как вам:
align := alCustom ?
← →
grom (2004-06-01 08:55) [28][27] align := alCustom -прощее не придумаеш
← →
inic © (2004-06-01 10:46) [29]Лучше поздно, чем никогда!!!
WM_WINDOWPOSCHANGING: begin
PWindowPos(ALParam)^.flags:=
PWindowPos(ALParam)^.flags or SWP_NOMOVE or SWP_NOSIZE;
Result:= 0;
end;
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.032 c