Window docking

17 отговора 365 прегледа
#1

Window docking

Zadachata - Prekachane na prozoreca kum kraq na ekrana

Probvah po dva nachina, no ne moga da izpipam dobre rabotata. Ednoto e promqnata da se pravi na novata poziciq (pri poluchavane na WM_MOVE). Drugoto - proverkata da se izvurshva dokato prozoreca se mesti, 4rez promqna na LParam na WM_MOVING. Problemite sa:

Ako proverkata se pravi na WM_MOVE pri "Show windows content while dragging" se izrisuva novoto mqsto, i sled tova promqnata, koqto pravq => stava premigvane

Ake se promenq na WM_MOVING ima problem pri izkarvaneto na prozoreca ot zonata za prikachane
i se izmestva mnogo poziciqta na cursor-a

Nqkoi ot vas nqma li opit s tazi rabota. Iskam da stane neshto kato Winamp-a

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #2

Re: Window docking

Ne si pisal na kakaw ezik predpo4itash ama predpolagam 4e e za C++ - e ne moga da ti pomogna - ama pogledni towa (wsi4ki mrazesti Obj Pascal da ne gledat) moze da ti pomogne. (e oba4e ima edin problem - ne poddarja multi-monitors - za sazalenie)
-------------------------------------------------------------------
unit MagneticForm;

interface

// uTMagneticForm v1.0 - Makes a form "magnetic" to the screen border and
// enables (proportional) resizing and moving on borderless forms
// Delphi implementation (w) 1999 Dennis D. Spreen ([email protected])
// This unit is freeware. Just drop me a line if this unit is useful for you.

{

TMagneticForm properties
========================

AlwaysMoveable : boolean
// true = make a (captionless) form everywhere on the form moveable
// does not work with WndProc-Controls on the form (e.g. TPanels)

AlwaysOnScreen : boolean
// true = form can't be moved out of the screen

- Margin(TMargin)
Enabled : boolean (default TRUE)
// Enable the "magnetic" screen margin

BottomMax : integer (default 10)
BottomMin : integer (default -5)
LeftMax : integer (default 10)
LeftMin : integer (default -5)
RightMax : integer (default 10)
RightMin : integer (default -5)
TopMax : integer (default 10)
TopMin : integer (default -5)



A negative value means "outside the visible screen", e.g.:
.----------------------
"invisible |
screen" . | .
| | | "visible
. | . screen"
| | |
x=-5 | x=10
| | |
|
x=0
\_____/

-5>=x>=10 (form will be moved to x=0 if anywhere between -5 and +10)
LeftMin LeftMax


- Resize (TResize)
Enabled : boolean
// true = make a borderless form resizeable

BorderWidth : integer
// "invisible" form border for simulating resize area

- Ratio (TRatio)
Enabled : boolean
// true = do a proportional resize only (applies only when
user resizes at the edges (TopLeft, TopRight, BottomLeft &
BottomRight)

AspectRatio:single
Height:integer
Width:integer
// define the proportional value either with an AspectRatio
// or by setting initial values for Height and Width

}


uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type

TOnMovingEvent = procedure (Sender: TObject;var rect:TRect) of object;

TRatio = class (TPersistent)
private
fEnabled:boolean;
fWidth:integer;
fHeight:integer;
fAspectRatio:single;
protected
procedure SetWidth(value:integer);
procedure SetHeight(value:integer);
procedure SetAspectRatio(value:single);
public
constructor Create;
destructor Destroy;override;
published
property Enabled:boolean read fEnabled write fEnabled;
property Width:integer read fWidth write SetWidth;
property Height:integer read fHeight write SetHeight;
property AspectRatio:single read fAspectRatio write SetAspectRatio;
end;

TResize = class (TPersistent)
private
fEnabled:boolean;
fRatio:TRatio;
fBorderWidth:integer;
procedure SetRatio(Value:TRatio);
public
constructor Create;
destructor Destroy;override;
published
property Enabled:boolean read fEnabled write fEnabled;
property Ratio:TRatio read fRatio write SetRatio;
property BorderWidth:integer read fBorderWidth write fBorderWidth;
end;


TMargin = class (TPersistent)
private
FLeftMin :integer;
FLeftMax :integer;
FTopMin :integer;
FTopMax :integer;
FRightMin :integer;
FRightMax :integer;
FBottomMin:integer;
FBottomMax:integer;
fEnabled:boolean;
public
constructor Create;
destructor Destroy;override;
published
property Enabled:boolean read fEnabled write fEnabled;
property LeftMin:integer read FLeftMin write FLeftMin;
property LeftMax:integer read FLeftMax write FLeftMax;
property RightMin:integer read FRightMin write FRightMin;
property RightMax:integer read FRightMax write FRightMax;
property TopMin:integer read FTopMin write FTopMin;
property TopMax:integer read FTopMax write FTopMax;
property BottomMin:integer read FBottomMin write FBottomMin;
property BottomMax:integer read FBottomMax write FBottomMax;
end;



type
TMagneticForm = class(TComponent)
private
{ private declarations }
fMargin:TMargin;
fOnMovingEvent:TOnMovingEvent;
fAlwaysOnScreen:boolean;
fOldTWndMethod:TWndMethod;
fAlwaysMoveable:boolean;
fForm:TForm;
fResize:TResize;
protected
{ protected declarations }
procedure SetMargin(Value:TMargin);
procedure SetResize(Value:TResize);
procedure WndProc(var Message: TMessage);
procedure WMMOVING(var M: TMessage);
procedure WMNCHitTest(var M: TMessage);
procedure WMSIZING(var M: TMessage);
public
{ public declarations }
constructor Create(AOwner:TComponent); override;
destructor Destroy; override;
published
{ published declarations }
property Margin:TMargin read fMargin write SetMargin;
property AlwaysOnScreen:boolean read fAlwaysOnScreen write fAlwaysOnScreen;
property AlwaysMoveable:boolean read fAlwaysMoveable write fAlwaysMoveable;
property Resize:TResize read fResize write SetResize;
property OnMoving:TOnMovingEvent read fOnMovingEvent write fOnMovingEvent;
end;


procedure Register;

implementation


procedure TRatio.SetWidth(value:integer);
begin
fWidth:=value;
if Height=0 then fAspectRatio:=0
else fAspectRatio:=Width/Height;
end;


procedure TRatio.SetHeight(value:integer);
begin
fHeight:=value;
if Height=0 then fAspectRatio:=0
else fAspectRatio:=Width/Height;
end;


procedure TRatio.SetAspectRatio(value:single);
begin
fAspectRatio:=value;
fWidth:=100;
if value=0 then fHeight:=0
else fHeight:=trunc(100/value);
end;



constructor TRatio.Create;
begin
inherited Create;
end;

destructor TRatio.Destroy;
begin
inherited Destroy;
end;


destructor TResize.Destroy;
begin
fRatio.free;
inherited Destroy;
end;

constructor TResize.Create;
begin
inherited Create;
fRatio:=TRatio.Create;
fBorderWidth:=5;
end;

procedure TResize.SetRatio(Value:TRatio);
begin
FRatio.Assign(Value);
end;


constructor TMargin.Create;
begin
inherited Create;
LeftMin :=-5;
LeftMax :=10;
RightMin :=-5;
RightMax :=10;
TopMin :=-5;
TopMax :=10;
BottomMin:=-5;
BottomMax:=10;
Enabled:=true;
end;

destructor TMargin.Destroy;
begin
inherited Destroy;
end;

constructor TMagneticForm.Create(AOwner:TComponent);
begin
inherited Create(AOwner);
fMargin:=TMargin.Create;
fResize:=TResize.Create;
fForm:=TForm(AOwner);
fOldTWndMethod:=fForm.WindowProc;
fForm.WindowProc:=WndProc;
fResize.Ratio.Width:=fForm.Width;
fResize.Ratio.Height:=fForm.Height;
if fForm.BorderStyle=bsNone then AlwaysMoveAble:=true;
end;


destructor TMagneticForm.Destroy;
begin
fMargin.Free;
fResize.Free;
fForm.WindowProc:=fOldTWndMethod;
// Problems may arise if any component after or before TMagneticform
// changes the form.WindowProc - the destructor only works if the
// components are destroyed in the reversed order as constructed
inherited Destroy;
end;


procedure TMagneticForm.WndProc(var Message: TMessage);
begin
if (CsDesigning in ComponentState) then fOldTwndMethod(Message) // disable during Delphi IDE
else
case Message.Msg of
WM_MOVING : WMMOVING(Message);
WM_NCHITTEST: WMNCHITTEST(Message);
WM_SIZING : WMSIZING(Message);
else fOldTwndMethod(Message);
end;
end;


procedure TMagneticForm.WMSIZING(var M: TMessage);
var PR : PRect;
begin
if (not(Resize.Ratio.Enabled)) or (Resize.Ratio.AspectRatio=0) then exit;
PR := Pointer(m.LParam);
if M.WParam=WMSZ_BOTTOMRIGHT then PR^.right:=PR^.Left+trunc((PR^.Bottom-PR^.Top)*Resize.Ratio.AspectRatio) else
if M.WParam=WMSZ_BOTTOMLEFT then PR^.left :=PR^.Right-trunc((PR^.Bottom-PR^.Top)*Resize.Ratio.AspectRatio) else
if M.WParam=WMSZ_TOPLEFT then PR^.left :=PR^.Right-trunc((PR^.Bottom-PR^.Top)*Resize.Ratio.AspectRatio) else
if M.WParam=WMSZ_TOPRIGHT then PR^.right:=PR^.Left+trunc((PR^.Bottom-PR^.Top)*Resize.Ratio.AspectRatio);
end;



procedure TMagneticForm.WMMOVING(var M: TMessage);
var PR : PRect;
begin

PR := Pointer(m.LParam);

if assigned (OnMoving) then
begin
OnMoving(self,pr^);
fOldTwndMethod(m);
exit;
end;

if ((PR^.left < Margin.LeftMax) and (PR^.Left>Margin.LeftMin) and (Margin.Enabled)) or
((AlwaysOnScreen) and (PR^.Left<0))then
begin
PR^.left := 0;
PR^.Right := fForm.width;
end;

if ((PR^.top < Margin.TopMax) and (PR^.Top>Margin.TopMin) and (Margin.Enabled)) or
((AlwaysOnScreen) and (PR^.Top<0)) then
begin
PR^.top := 0;
PR^.Bottom := fForm.height;
end;

if ((PR^.Bottom > screen.Height-Margin.BottomMax) and
(PR^.Bottom+Margin.BottomMin < screen.Height) and (Margin.Enabled)) or
((AlwaysOnScreen) and (PR^.Bottom>screen.height)) then
begin
PR^.Bottom := screen.height;
PR^.top := screen.height - fForm.height;
end;

if ((PR^.Right > screen.Width-Margin.RightMax) and
(PR^.Right + Margin.RightMin< screen.Width) and (Margin.Enabled)) or
((AlwaysOnScreen) and (PR^.Right>Screen.Width)) then
begin
PR^.Right := screen.width;
PR^.Left := screen.width - fForm.width;
end;
fOldTwndMethod(m);
end;




procedure TMagneticForm.WMNCHitTest(var M: TMessage);
var point:TPoint;
CPoint:TPoint;
isLeft,isright,isTop,isbottom:boolean;
begin
fOldTwndMethod(m); // call old method

if Resize.Enabled then
begin
point.x:=TWMNCHitTest(M).Xpos;
point.y:=TWMNCHitTest(M).Ypos;

CPoint:=fForm.ScreenToClient(point);

isLeft :=(CPoint.x<Resize.BorderWidth);
isTop :=(CPoint.y<Resize.BorderWidth);
isRight :=(CPoint.x+Resize.BorderWidth>=fForm.ClientWidth);
isBottom:=(CPoint.y+Resize.BorderWidth>fForm.ClientHeight);

if IsLeft then if isTop then m.Result:=HTTOPLEFT
else
if isBottom then m.Result:=HTBOTTOMLEFT
else m.Result:=HTLEFT
else
if IsRight then if isTop then m.Result:=HTTOPRIGHT
else
if isBottom then m.Result:=HTBOTTOMRIGHT
else m.Result:=HTRIGHT
else
if IsTop then m.Result:=HTTOP
else
if IsBottom then m.Result:=HTBOTTOM;
end;

if (m.Result = htClient) and (AlwaysMoveable) then m.result:=htCaption;
end;



procedure TMagneticForm.SetMargin(Value:TMargin);
begin
FMargin.Assign(Value);
end;


procedure TMagneticForm.SetResize(Value:TResize);
begin
FResize.Assign(Value);
end;

procedure Register;
begin
RegisterComponents('Freeware', [TMagneticForm]);
end;

end.

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #3

Gadno

Eeee mnogo gadno. Nqma da svurshi rabota, zashtoto mi trqbva za Delphi. E vse pak shte se opitam da go podkaram toq Object Pascal

Haide sega seriozno. Tova e tochno kato moeto deto go napravih s WM_MOVING samo deto az sum predvidil prikachane kum taskbar-a. Ima nqkakuv problem pri bavno mestene na mishkata (deto Winamp-a go nema). Izminavash nqkude 100 pixela za da trugne prozoreca s tui WM_MOVING.

I drugoto deto go vidqh, 4e pri izbirane ot system menu-to na MOVE prozoreca ne se moje da se otkachi ot ruba (kato si go mestish s klaviaturata).

Stana mi smeshno kato se opitah da svalq zakacheniq, kum vurha, prozorech (nali samo s klaviaturata). Reshih sled tova da se vurna nagore i toq zapochna da se smalqva, vmesto da se mesti nagore. Awe Winbouz bugava istoriq.

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #4

Re: Gadno

Hi4 ne e gadno - ako iskash ste ti izpratia i drugite fajlowe (dcr-a ) i samo triabwa da go pahnesh w paket po izbor .
A be ne moga samo edno da razbera - sto kato ti triabwa nesto na Delphi ne pishesh direktno w kluba- ne misli 4e tam se otbiwat po malko hora!!!!!!!!!!

---
Е т'ва е живот!
Отговор
в отговор на PhantomAS #5

Re: Gadno

Ne mi trqbva dcr-to. Nali ti kazvam, 4e moito dori mai e po-dobre ot tova (probvah go, vse pak si mi pratil pulniq unit). Ama ima bugove tozi nachin. A az iskam da e "idealno". Trqbvat nqkakvi dopulnitelni dobavki ili neznam kakvo.

Naistina go pisha na Delphi, no stava vurpos za WM_-ta i mislq, 4e tuk ima pove4e hora, koito znaqt kak stavat tezi raboti. V sluchaq sa golemi podrobnosti.

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #6

Imam neshto...

Abe imam niakakav source code tochno za tazi rabota...Maiche...
Ama e na Visual Basic...

Ama ne mojah da razbera dobre - iskash niakakav tvoi prozorec da "ne izliza" izvan ekrana i da zalepva po "stenite" my kato gi dobliji, ili niakakav (ne ot tvoita programa) prozorec (forma) da se prikachi za tvoia ?

Hmmmm - i az veche se obarkah shtoto stana 05:45 sytrinta mai gledam tyka doly v diasno...

Умният обича да се учи.
Глупавият - да поучава.
Отговор
в отговор на Гeoprи #7

Re: Imam neshto...

Moq prozorec mi trqbva da se prika4a kum ugula na ekrana

S WM_MOVING ima problem pri bavno mestene na kursora ili pri opit za promqna na poziciqta ot klaviqturata

Trqbva mi dosta izpipana rabota

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #8

Re: Imam neshto...

Ami az sam si napravil edin component (User Control) na Visual Basic deto moje da ti mesti formata (i ne samo formi ami vsiakakvi kontroli koito imat MoseDown, MouseMove i MouseUp sabitia) i da my dadesh ogranichitelen "pravoagalnik" na obekta, koito mardash. No niama da raboti s "normalni" prozorci sas sinia lenta - triabva da e bez takava lenta ili formata ti da e .Moveable=False i da ia mardash kato natisnesh niakade po neia ili pak da si napravish formata bez Caption (i bez sinia lenta) i da slojish nai otgore edin Label sas sin fon ( :))) ) i da mardash formata kato go "hvanesh" nego.

Samo shte triabva da si dobavish koda, koito ti "zalepva" formata ako e po-blizo ot X piksela do kraia na ekrana. Koda na Visual Basic e mnogo malak - vsashtnost tova e edna procedura s okolo 20 reda. Ako te interesyva moga da ti pratia VB koda a pak ti shte si go obarnesh na kakvoto programirash.

Poshtata mi e GogoX@Lycos.com

Отговор
в отговор на Гeoprи #9

hehe

Ideata e dobra (za razni mouse down, up, dup). Koda ne mi trqbva shtoto sum si go napisal, no s Caption Bar ne vurvi dobre. To moeto ne e suvsem Caption Bar: bez Caption sum no na mousedown izpulnqva:

const
SC_DRAGMOVE = $F012;
begin
if Button = mbLeft then
begin
ReleaseCapture;
Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
end;

taka 4e stava sushtoto. Ai ostavi shte pomislq malko po tova s MouseDown , Up i Dup...

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #10

Re: hehe

Da ama s tova SC_DRAGMOVE ne mojesh mai da kontrolirash formata da ne izliza izvan ekrana. Tova sam go pravil s WM_MOVE ili WM_MOVEWINDOW li beshe ama ne mogat da se nalagat ogranichenia.

Eto ti koda na Visual Basic koito moje da te navede na niakakva ideia:


' Tazi procedyra se vika pri MouseDown na formata ako e natisnat levia byton
' na mishkata
' I za CoordinateX i CoordinateY se predavat koordinatite kadeto
' E natisnata mishkata, shtoto te posle shte triabvat
Public Sub CaptureObject(CoordinateX As Long, CoordinateY As Long)
CoordinateXWhenMouseDown = CoordinateX ' Lokalna LONG promenliva
CoordinateYWhenMouseDown = CoordinateY ' Lokalna LONG promenliva
Moving = True ' Lokalna BOOL promenliva
End Sub


' Tazi procedyra se vika pri MouseMove na formata (command bytona, picture boxa...) ako e natisnat levia byton
' Target e imeto na obekta (toest samia obekt - naprimer Form1)
' XWhenMouseMove e koordinatata na mishkata vzeto ot MouseMove
' YWhenMouseMove - kato XWhenMouseMove
' Drygite parametri sa opcionalni
' MoveByX i MoveByY sa BOOL promenlivi, koito pokazvat dali obekta Target (formata)
' Da se dviji po X i Y koordinatata
' MinX,MaxX,MinY i MaxY sa saotvetno minimyma i maximyma na .Left poziciata na obekta i minimyma i maksimyma na .Top poziciata na obekta
Public Sub MoveObject(Target As Object, XWhenMouseMove As Long, YWhenMouseMove As Long, Optional MoveByX As Boolean = True, Optional MoveByY As Boolean = True, Optional MinX As Long = 0, Optional MaxX As Long = 0, Optional MinY As Long = 0, Optional MaxY As Long = 0)
' Mestene samo ako e bila izvikana procedurata CaptureObject
If Moving = True Then
' Ako e ykazano da se mesti po X koordinatata
If MoveByX Then XCoordinate = Target.Left + XWhenMouseMove - CoordinateXWhenMouseDown
' Ako e ykazano da se mesti po Y koordinatata
If MoveByY Then YCoordinate = Target.Top + YWhenMouseMove - CoordinateYWhenMouseDown

' Ako .Left na Target (Formata) stane po-malka ot zadadenata
If XCoordinate < MinX And (MinX = MaxX = 0) Then XCoordinate = MinX
' Ako .Left na Target (Formata) stane po-goliama ot zadadenata
If XCoordinate > MaxX And (MinX = MaxX = 0) Then XCoordinate = MaxX

' Sashtoto kato za XCoordinate
If YCoordinate < MinY And (MinY = MaxY = 0) Then YCoordinate = MinY
If YCoordinate > MaxY And (MinY = MaxY = 0) Then YCoordinate = MaxY

' Ako triabva da se marda po X se promenia .Left property
If MoveByX Then Target.Left = XCoordinate
' Sashtoto kato za MoveByX
If MoveByY Then Target.Top = YCoordinate

' Ako .MovingEventPresent na User Controla e True
' Da Raise Moving sabitieto
If m_MovingEventPresent = True Then
RaiseEvent Moving(Target)
End If
End If
End Sub


' Tazi procedyra se vika ot MouseUp na obekta ako e natisnat levia byton
Public Sub ReleaseTargetObject()
Moving = False
End Sub



Na stranicata mi ima edno EXE (niama virysi ), koeto marda formata, koiato e bez caption bez da izliza ot ekrana, za da vidish nagledno kakvo pravi tozi kod. Praveno e na VB6 i iziskva MSVBVM60.DLL no ti sigyrno go imash na tvoia Windows, taka che triabva da tragne.

Adresa e [линк]

Ycnex !


:))))

Отговор
в отговор на Гeoprи #11

Re: hehe

Awe moje da se pipa kato promenqsh na WM_MOVING ediniq parametur predi prozoreca da go obraboti , NO ima problemi pri mestene ot klaviaturata.
Drugoto e na WM_MOVE da se smeni mqstoto na prozoreca sled kato toi si go e obrabotil , NO taka se poluchava premigvane

Ta tvoito go vidqh. Gore dolu stava, no se ogranichavat mnogo nachinite za mestene na prozoreca. Loshoto e, 4e v momenta (s obrabotka na WM_MOVE) stava mnogo dobre, ima si system menu i ot tam mojesh da si go mestish, samo deto ako ti e vkliucheno "Show content while dragging" i stava premigvane pri mestene na prozoreca po-granicata.

Awe shte se pobaziakm malko i shte go izdokaram

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #12

Re: hehe

Pobazikah go i sq ve4e stava smeshno. Ili Windows-a e bug-av ili neznam. Znachi na WM_MOVEING stava vsi4ko. Prozoreca se dock-va. Kato se opitvash da go premestish se mesti samo cursor-a. Az vzimam kolko se e premestil cursora i ako e pove4e ot opredelenoto cislo otlepqm prozoreca. Taka ba4ka mnogo qko. Po dobre e ot Winamp-a shtoto moje i s klaviaturata da go mestish. Raboti li kazah... Da no samo pri lqvo i gorno prikachane. Ako se e prekachilo dolu ili v dqsno ne shte da mi broi s kolko pixel-a e premesten cursor-a i ne moga da go otkacha po tozi nachin. Toq Windows neshto luje . Ako pusna edna BETA shte se nameri li koi da pogledne malko source-a i da si kaje mnenieto? Pisal sum go na Delphi. Ako stane rabotata tova sigurno shte e nai-prefectniq kod za prikachane

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #13

Re: hehe

dai da go pogledna - ako moga, shte ti pomogna!

pozdrawi!

donangel@dir.bg

Отговор
в отговор на WiseGuy #15

Re: Eto

hmmm. za jalost towa, koeto si mi izpratil naistina e na Delphi. A pyk az okonchatelno skysah s Pascal-a prez 1991 . I nishtichko ne razbrah ot nowite advanced OO technologii, koito Borland e predlozil za Win RAD programming .

Problema e, che poradi lipsa na komentari i na logichni imena na <tvoite> promenliwi, ne moze i algorityma da se shvane (dotolkowa Pascal wse pak znaia). Ne goworqt nishto promenliwi kato 'r' (oswen che e nqkakyw Rectangle) $FB012 (ili neshto takowa beshe).

Za jalost, ot gornoto mozes da si naprawish izwoda, che i Delphi nqmam instalirano - taka che ne moga da naprawq debug na towa, koeto si mi izpratil. Mai ti dadoh (pone az) naprazna nadezda za pomost - izwinqwai! No az bqh razbral, che stawa wypros za C++ - togawa nqmashe da e problem.

Dano nqkoi Delpist wyw foruma pomogne!

PoZdrawi!

Отговор
в отговор на WiseGuy #16

Re: Eto

Awe mnogo iskam da mi pomognesh
Napisah edin Help (shtoto ne gi znam i Delphi programistite kakvo shte napravqt bez komentarite) pro4eti go i se nadqvam gore dolu da shvanesh kakva e istoriqta. Ostanaloto se otnosq do poznaniqta ti za Pascal ot '91

Compilirah i edno exe da vidish kakvo stava

[линк] - exe demo (154kb)
[линк] - help file

by Wise Guy
[email protected]
Отговор
в отговор на WiseGuy #17

Re: Window docking

A za towa setil li si se:
1. Pri WM_LBUTTONDOWN izwikwash SetCapture (HWND);
2. Posle pri WM_MOUSEMOVE prawish prowerka dali e natisnat leviat button na miskata, presmiatash malko koordinati i mestish prozoreca.
3. Pri WM_LBUTTONUP wikash ReleaseCapture (); i gotowo!

Towa tribwa da raboti iz celiat prozorec, bez zna4enie kade e mishkata.
Za BLUE lentata syobshteniata sa malko po-razlichni - WM_NCLBUTTONDOWN ....

Отговор
в отговор на ArnOld #18

Re: Window docking

Blagodarq za ideqta Mnogo e hubava

Samo 4e sum otdelil dosta vreme na tozi kod a toi pozvolqva premestvaniq i 4rez system menu-to taka 4e vse oshte tursq kude e problema. drazni me 4e v lqvo i gore vsi4ko e super.

Отговор