From: kortyzon <kor...@gm...> - 2005-10-12 12:34:15
|
Hello ! I'm a french win32 gui user and i search how to move the window whitout the dragbar. I think it's posible to do this with system : While MouseDown event (for example on a label), move the window at the cursor position. But i don't know how to make it! Can somebody help me? Thanks! |
From: Jason P. <ma...@cc...> - 2005-10-12 14:38:29
|
kortyzon wrote: >Hello ! > > >I'm a french win32 gui user and i search how to move the window >whitout the dragbar. > >I think it's posible to do this with system : >While MouseDown event (for example on a label), move the window at the >cursor position. > >But i don't know how to make it! > > >Can somebody help me? > >Thanks! > > you will need 3 things. mouseDown, mouseMove, mouseUp (these are generic names, the specifcs are up to you in OEM/NEM) inside the mouseDown event, set a state flag (like $mouseIsDown) when the mouseMove event is fired, check the status of $mouseIsDown, and then move the window accordingly. when mouseUp is fired, set $mouseIsDown to 0/-1/undef/your version of false. viola. there may be some other slightly more specfic, but unmentioned code realting to the exact method by which you know how and where to move the window to, but these are the basics. Jason P. |
From: Robert M. <rm...@po...> - 2005-10-12 19:47:46
|
Jason P. wrote: > kortyzon wrote: > >> I'm a french win32 gui user and i search how to move the window >> whitout the dragbar. >> > you will need 3 things. > > mouseDown, mouseMove, mouseUp (these are generic names, the specifcs are > up to you in OEM/NEM) > > inside the mouseDown event, set a state flag (like $mouseIsDown) > > when the mouseMove event is fired, check the status of $mouseIsDown, and > then move the window accordingly. > > when mouseUp is fired, set $mouseIsDown to 0/-1/undef/your version of > false. > > viola. > > there may be some other slightly more specfic, but unmentioned code > realting to the exact method by which you know how and where to move the > window to, but these are the basics. Here's a (C++) article describing what you're looking for (see the second part of the article): http://msdn.microsoft.com/msdnmag/issues/02/12/CQA/default.aspx And because I wanted to understand the difference between then, here's Win32::GUI implementations of both methods: (1) Using mouse down/move/up: #!perl -w use strict; use warnings; use Win32::GUI; my $down = 0; # Flag to indcate if we are dragging or not my $msx; # last known position of mouse in screen co-ordinates my $msy; # last known position of mouse in screen co-ordinates my $mw = Win32::GUI::Window->new( -title => "Click anywhere to move", -pos => [100,100], -size => [400,300], -onMouseDown => \&down, -onMouseUp => \&up, -onMouseMove => \&move, ); $mw->Show(); Win32::GUI::Dialog(); exit(0); sub down { my ($object, $x, $y) = @_; # we're dragging $down = 1; # record mouse position ($msx, $msy) = $object->ClientToScreen($x, $y); # capture mouse $object->SetCapture(); return 1; } sub up { my ($object) = @_; # not dragging any more $down = 0; # release mouse capture $object->ReleaseCapture(); return 1; } sub move { my ($object, $x, $y) = @_; # x/y in client co-ordinates # don't do anything unless the left button is down return unless $down; # how much have we moved? my ($sx, $sy) = $object->ClientToScreen($x, $y); my $xshift = $sx - $msx; my $yshift = $sy - $msy; # record the new mouse position ($msx, $msy) = ($sx, $sy); # move the window $object->Move($object->Left() + $xshift, $object->Top() + $yshift); return 1; } __END__ (2) using WM_NCHITTEST: #!perl -w use strict; use warnings; use Win32::GUI; sub WM_NCHITTEST() {132} sub HTCAPTION() {2} my $mw = Win32::GUI::Window->new( -title => "Click anywhere to move", -pos => [100,100], -size => [400,300], ); $mw->Hook(WM_NCHITTEST, \&hittest); $mw->Show(); Win32::GUI::Dialog(); exit(0); sub hittest { my ($object, $wParam, $lParam, $type, $msgcode) = @_; return unless $type == 0; return unless $msgcode == WM_NCHITTEST; # get mouse position from $lParam (screen co-ordinates) my $sx = $lParam & 0xFFFF; my $sy = ($lParam >> 16) & 0xFFFF; # convert to client co-ordinates: my ($cx, $cy) = $object->ScreenToClient($sx, $sy); # See if we're in the client area ... my ($cl, $ct, $cr, $cb) = $object->GetClientRect(); if ( $cx < $cl or $cx > $cr or $cy < $ct or $cy > $cb ) { # not in client area, pass to defwindowproc return 1; } # In client area, return HTCAPTION $object->Result(HTCAPTION); return 0; } __END__ Regards, Rob. |
From: Jason P. <ma...@cc...> - 2005-10-13 01:44:35
|
Spawned from " [perl-win32-gui-users] How to do "While MouseDown, Move Window" " --- While we're on the subject of these events I'd like to point out that on WinXP SP2/ AS Perl 5.8.7, MRightUp is apparently not firing at all times. If given a fair (say, 1 second) time span, it will indeed fire. If you are fast with your optical mouse, it may not fire at all, leaving you with a constantly stuck "down" state. Although it RightClick will always fire. Hmm... Anyone else have this problem? Jason P |
From: Robert M. <rm...@po...> - 2005-10-18 18:42:09
|
Jason P. wrote: > Spawned from " [perl-win32-gui-users] How to do "While MouseDown, Move > Window" " > --- > > While we're on the subject of these events I'd like to point out that on > WinXP SP2/ AS Perl 5.8.7, MRightUp is apparently not firing at all times. > > If given a fair (say, 1 second) time span, it will indeed fire. > If you are fast with your optical mouse, it may not fire at all, leaving > you with a constantly stuck "down" state. > > Although it RightClick will always fire. > > Hmm... Anyone else have this problem? > > Jason P I've not seen it on Win98 or Wink, but don't have XP. Rob. -- Robert May Win32::GUI, a perl extension for native Win32 applications http://perl-win32-gui.sourceforge.net/ |
From: kortyzon <kor...@gm...> - 2005-10-13 10:30:45
|
2005/10/12, Robert May <rm...@po...>: > Jason P. wrote: > > kortyzon wrote: > > > >> I'm a french win32 gui user and i search how to move the window > >> whitout the dragbar. > >> > > you will need 3 things. > > > > mouseDown, mouseMove, mouseUp (these are generic names, the specifcs ar= e > > up to you in OEM/NEM) > > > > inside the mouseDown event, set a state flag (like $mouseIsDown) > > > > when the mouseMove event is fired, check the status of $mouseIsDown, an= d > > then move the window accordingly. > > > > when mouseUp is fired, set $mouseIsDown to 0/-1/undef/your version of > > false. > > > > viola. > > > > there may be some other slightly more specfic, but unmentioned code > > realting to the exact method by which you know how and where to move th= e > > window to, but these are the basics. > > Here's a (C++) article describing what you're looking for (see the > second part of the article): > http://msdn.microsoft.com/msdnmag/issues/02/12/CQA/default.aspx > > And because I wanted to understand the difference between then, here's > Win32::GUI implementations of both methods: > > (1) Using mouse down/move/up: > > #!perl -w > use strict; > use warnings; > > use Win32::GUI; > > my $down =3D 0; # Flag to indcate if we are dragging or not > my $msx; # last known position of mouse in screen co-ordinates > my $msy; # last known position of mouse in screen co-ordinates > > my $mw =3D Win32::GUI::Window->new( > -title =3D> "Click anywhere to move", > -pos =3D> [100,100], > -size =3D> [400,300], > -onMouseDown =3D> \&down, > -onMouseUp =3D> \&up, > -onMouseMove =3D> \&move, > ); > > $mw->Show(); > Win32::GUI::Dialog(); > exit(0); > > sub down > { > my ($object, $x, $y) =3D @_; > > # we're dragging > $down =3D 1; > > # record mouse position > ($msx, $msy) =3D $object->ClientToScreen($x, $y); > > # capture mouse > $object->SetCapture(); > > return 1; > } > > sub up > { > my ($object) =3D @_; > > # not dragging any more > $down =3D 0; > > # release mouse capture > $object->ReleaseCapture(); > > return 1; > } > > sub move > { > my ($object, $x, $y) =3D @_; # x/y in client co-ordinates > > # don't do anything unless the left button is down > return unless $down; > > # how much have we moved? > my ($sx, $sy) =3D $object->ClientToScreen($x, $y); > my $xshift =3D $sx - $msx; > my $yshift =3D $sy - $msy; > > # record the new mouse position > ($msx, $msy) =3D ($sx, $sy); > > # move the window > $object->Move($object->Left() + $xshift, $object->Top() + $yshift= ); > > return 1; > } > __END__ > > (2) using WM_NCHITTEST: > > #!perl -w > use strict; > use warnings; > > use Win32::GUI; > > sub WM_NCHITTEST() {132} > sub HTCAPTION() {2} > > my $mw =3D Win32::GUI::Window->new( > -title =3D> "Click anywhere to move", > -pos =3D> [100,100], > -size =3D> [400,300], > ); > > $mw->Hook(WM_NCHITTEST, \&hittest); > > $mw->Show(); > Win32::GUI::Dialog(); > exit(0); > > sub hittest > { > my ($object, $wParam, $lParam, $type, $msgcode) =3D @_; > > return unless $type =3D=3D 0; > return unless $msgcode =3D=3D WM_NCHITTEST; > > # get mouse position from $lParam (screen co-ordinates) > my $sx =3D $lParam & 0xFFFF; > my $sy =3D ($lParam >> 16) & 0xFFFF; > > # convert to client co-ordinates: > my ($cx, $cy) =3D $object->ScreenToClient($sx, $sy); > > # See if we're in the client area ... > my ($cl, $ct, $cr, $cb) =3D $object->GetClientRect(); > > if ( $cx < $cl or $cx > $cr > or $cy < $ct or $cy > $cb ) { > # not in client area, pass to defwindowproc > return 1; > } > > # In client area, return HTCAPTION > $object->Result(HTCAPTION); > return 0; > } > __END__ > > Regards, > Rob. > > > ------------------------------------------------------- > This SF.Net email is sponsored by: > Power Architecture Resource Center: Free content, downloads, discussions, > and more. http://solutions.newsforge.com/ibmarch.tmpl > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > https://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users > http://perl-win32-gui.sourceforge.net/ > Yehh it's works fine. Thanks you both! |
From: Jason P. <ma...@cc...> - 2005-10-13 16:42:47
|
This Chunk of code, isolated for posterity's sake. This piece, courtesy of Rob, implements simple drag/drop detection on MOST controls within WIn32::GUI, notably Treeview/Listview/Listbox. There are underlying support procedure in place for handling the "candy" side of things such as CreateDragImage in Treeview. Please note, that while portions CAN be implemented in OEM, they are done here using the NEM model, which has per experience (personally myself) provided a more accurate functionality to the desired result. Jason P. PS - hopefully shortly I will find the time to send an implementation of this in regad to the Treeview control, that I simply haven't had the spare time prep for general use. >> - spawned from [While Mouse Down, Move Window] >>(1) Using mouse down/move/up: >> >>#!perl -w >>use strict; >>use warnings; >> >>use Win32::GUI; >> >>my $down = 0; # Flag to indcate if we are dragging or not >>my $msx; # last known position of mouse in screen co-ordinates >>my $msy; # last known position of mouse in screen co-ordinates >> >>my $mw = Win32::GUI::Window->new( >> -title => "Click anywhere to move", >> -pos => [100,100], >> -size => [400,300], >> -onMouseDown => \&down, >> -onMouseUp => \&up, >> -onMouseMove => \&move, >>); >> >>$mw->Show(); >>Win32::GUI::Dialog(); >>exit(0); >> >>sub down >>{ >> my ($object, $x, $y) = @_; >> >> # we're dragging >> $down = 1; >> >> # record mouse position >> ($msx, $msy) = $object->ClientToScreen($x, $y); >> >> # capture mouse >> $object->SetCapture(); >> >> return 1; >>} >> >>sub up >>{ >> my ($object) = @_; >> >> # not dragging any more >> $down = 0; >> >> # release mouse capture >> $object->ReleaseCapture(); >> >> return 1; >>} >> >>sub move >>{ >> my ($object, $x, $y) = @_; # x/y in client co-ordinates >> >> # don't do anything unless the left button is down >> return unless $down; >> >> # how much have we moved? >> my ($sx, $sy) = $object->ClientToScreen($x, $y); >> my $xshift = $sx - $msx; >> my $yshift = $sy - $msy; >> >> # record the new mouse position >> ($msx, $msy) = ($sx, $sy); >> >> # move the window >> $object->Move($object->Left() + $xshift, $object->Top() + $yshift); >> >> return 1; >>} >>__END__ >> >>Regards, >>Rob. >> >> >> |