From: Lloyd, S. <Ste...@la...> - 2005-08-10 22:39:19
|
Thanks Rob, I will give it a try in Perl and Win32::GUI. Steve -----Original Message----- From: Robert May [mailto:rm...@po...]=20 Sent: Wednesday, August 10, 2005 4:34 PM To: Lloyd, Steve Cc: per...@li... Subject: Draggable 'window' [Was: MDIFrame and background Image] Lloyd, Steve wrote: > Is there a way using Win32::GUI to create a dragable child window that > can be dragged and dropped onto another window like winspy does? >=20 > Steve Are you referring to the 'Find' window from Windows Spy++? If so, then that's not a draggable window at all: the application=20 changes the cursor, and captures the mouse (see SetCapture()) so that it gets mouse move events for the mouse outside it's window borders. It=20 then hit-tests on each mouse move to find the handle to any window under the mouse, gets the window co-ordinates (GetWindowRect() on the handle=20 found), and then draws the rectangle around the window by drawing into=20 the 'DISPLAY' DC (See CreateDC). Of course, it may do it entirely differently, but that's how I would do it. Regards, Rob. This email, and any files previous email messages included with it, may = contain confidential and/or privileged material. If you are not the = intended recipient please contact the sender and delete all copies. |
From: Robert M. <rm...@po...> - 2005-08-10 22:59:33
|
Lloyd, Steve wrote: > From: Robert May [mailto:rm...@po...] > Lloyd, Steve wrote: > >>Is there a way using Win32::GUI to create a dragable child window that > >>can be dragged and dropped onto another window like winspy does? >> >>Steve > > Are you referring to the 'Find' window from Windows Spy++? > > If so, then that's not a draggable window at all: the application > changes the cursor, and captures the mouse (see SetCapture()) so that it > > gets mouse move events for the mouse outside it's window borders. It > then hit-tests on each mouse move to find the handle to any window under > > the mouse, gets the window co-ordinates (GetWindowRect() on the handle > found), and then draws the rectangle around the window by drawing into > the 'DISPLAY' DC (See CreateDC). > > Of course, it may do it entirely differently, but that's how I would do > it. > Thanks Rob, > I will give it a try in Perl and Win32::GUI. > > Steve That would be interesting code to share if you get it working :-) Rob. |
From: Robert M. <rm...@po...> - 2005-08-11 17:57:25
|
Steven Lloyd wrote: > Rob, > I have got this far but I cannot seem to get SetCapture to allow me to > go outside my window. Any ideas? Steve, Please can we keep discussion on-list (unless they are OT) - others may be able to help, and may like to see the problems being solved. Read up about SetCapture at: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputfunctions/setcapture.asp You only continue to get mouse move events outside your window if a mouse button is depressed, so you'll need to catch a mouse down event, SetCapture(), process mouse moves and then ReleaseCapture() on the mouse up event (OK, this last step is not strictly necessary, as the system will do it for you). I was also wrong about the hit-hest idea - I think you'll need to use some combination of WindowFromPoint() and ChildWindowFromPoint() - I haven't looked to see if they're in Win32::GUI or not. Regards, Rob. #!perl -w # Left-Click on the target image, and drag use warnings; use strict; use Win32::GUI 1.0; use Win32::GUI::BitmapInline(); my $mw = Win32::GUI::Window->new( -name => "MainWindow", -title => "Win32::GUI Spy++", -pos => [100,100], -size => [100,100], ); my $cursor = get_cursor(); $mw->AddLabel( -name => "Target", -icon => $cursor, -notify => 1, -onMouseDown => \&mouseDown, -onMouseUp => \&mouseUp, -onMouseMove => \&mouseMove, ); $mw->Show(); Win32::GUI::Dialog(); exit(0); sub mouseDown { my $label = shift; Win32::GUI::SetCursor($cursor); $label->SetCapture(); return; } sub mouseUp { my $label = shift; $label->ReleaseCapture(); return; } sub mouseMove { my ($label, $x, $y) = @_; # x,y in client co-ordinates return unless Win32::GUI::GetCapture(); Win32::GUI::SetCursor($cursor); print "Mouse at: $x,$y\n"; return; } sub get_cursor { return Win32::GUI::BitmapInline->newCursor( q( AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj ///AB///4A////g///////////////////////////////////////8= ) ); } |
From: Steven L. <sl...@ti...> - 2005-08-11 18:39:27
|
Thanks Rob, Lesson learned. I will try to exand on this tonight. You rock! Steve Lloyd http://www.basgetti.com > Steven Lloyd wrote: >> Rob, >> I have got this far but I cannot seem to get SetCapture to allow me to >> go outside my window. Any ideas? > > Steve, > > Please can we keep discussion on-list (unless they are OT) - others may > be able to help, and may like to see the problems being solved. > > Read up about SetCapture at: > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputfunctions/setcapture.asp > > You only continue to get mouse move events outside your window if a > mouse button is depressed, so you'll need to catch a mouse down event, > SetCapture(), process mouse moves and then ReleaseCapture() on the mouse > up event (OK, this last step is not strictly necessary, as the system > will do it for you). > > I was also wrong about the hit-hest idea - I think you'll need to use > some combination of WindowFromPoint() and ChildWindowFromPoint() - I > haven't looked to see if they're in Win32::GUI or not. > > Regards, > Rob. > > #!perl -w > > # Left-Click on the target image, and drag > > use warnings; > use strict; > > use Win32::GUI 1.0; > use Win32::GUI::BitmapInline(); > > my $mw = Win32::GUI::Window->new( > -name => "MainWindow", > -title => "Win32::GUI Spy++", > -pos => [100,100], > -size => [100,100], > ); > > my $cursor = get_cursor(); > > $mw->AddLabel( > -name => "Target", > -icon => $cursor, > -notify => 1, > -onMouseDown => \&mouseDown, > -onMouseUp => \&mouseUp, > -onMouseMove => \&mouseMove, > ); > > $mw->Show(); > Win32::GUI::Dialog(); > exit(0); > > sub mouseDown > { > my $label = shift; > Win32::GUI::SetCursor($cursor); > $label->SetCapture(); > > return; > } > > sub mouseUp > { > my $label = shift; > $label->ReleaseCapture(); > > return; > } > > sub mouseMove > { > my ($label, $x, $y) = @_; # x,y in client co-ordinates > > return unless Win32::GUI::GetCapture(); > > Win32::GUI::SetCursor($cursor); > print "Mouse at: $x,$y\n"; > > return; > } > > sub get_cursor > { > return Win32::GUI::BitmapInline->newCursor( q( > AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA > AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA > AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g > D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj > ///AB///4A////g///////////////////////////////////////8= > ) ); > } > > > -- <a href="http://www.thetreasuredbox.com">Hooded Bath Towels</a><br> |
From: Steven L. <sl...@ti...> - 2005-08-16 04:31:51
|
Well, I have got close but I am not sure how to make the Drawn rectangle transparent or how to dispose of the DC after I am through.. Any help would be greatly appreciated. ---------------------------------------------------------------- #!perl -w # Left-Click on the target image, and drag use warnings; use strict; use Win32::GUI; use Win32::API; use Win32::GUI::BitmapInline(); my $mw = Win32::GUI::Window->new( -name => "MainWindow", -title => "Win32::GUI Spy++", -pos => [100,100], -size => [100,100], ); my $cursor = get_cursor(); $mw->AddLabel( -name => "Target", -icon => $cursor, -notify => 1, -onMouseDown => \&mouseDown, -onMouseUp => \&mouseUp, -onMouseMove => \&mouseMove, ); $mw->Show(); Win32::GUI::Dialog(); exit(0); ########################### ########################### sub mouseDown{ my $label = shift; Win32::GUI::SetCursor($cursor); $label->SetCapture(); return; } ################ sub mouseUp{ my $label = shift; $label->ReleaseCapture(); return; } ################# sub mouseMove{ my ($label, $x, $y) = @_; # x,y in client co-ordinates return unless Win32::GUI::GetCapture(); Win32::GUI::SetCursor($cursor); my $hwnd=getWindowXY($x,$y); my $class=getWindowClass($hwnd) || ''; my $text=getWindowText($hwnd) || ''; $text=substr($text,0,30) if length($text) > 30; my $exe=getWindowExe($hwnd) || ''; my ($left,$top,$right,$bottom)=getWindowRect($hwnd); my $hdc=getWindowDC(getDesktopWindow()); my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); #print qq|$hwnd\ ($x,$y) [$exe] {$class} "$text"\n|; return; } ############### sub getWindowDC{ #usage: my $hwnd=getWindowDC($hwnd); #info: returns the handle of a device context for the specified window. my $hwnd=shift || return; my $GetWindowDC = new Win32::API("user32", "GetWindowDC", ['N'], 'N') || return $^E; my $hdc=$GetWindowDC->Call($hwnd); return $hdc; } ############### sub getDesktopWindow{ #usage: my $hwnd=getWindowDC($hwnd); #info: returns the handle of a device context for the specified window. my $GetDesktopWindow = new Win32::API("user32", "GetDesktopWindow", [], 'N') || return $^E; my $hwnd=$GetDesktopWindow->Call(); return $hwnd; } ############### sub drawRectangle{ #usage: my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); #info: returns the handle of a device context for the specified window. my $hdc=shift || return; my $left=shift || 0; my $top=shift || 0; my $right=shift || 0; my $bottom=shift || 0; my $Rectangle = new Win32::API("gdi32", "Rectangle", ['N','I','I','I','I'], 'N') || return $^E; my $ok=$Rectangle->Call($hdc,$left,$top,$right,$bottom); return $hdc; } ############### sub getWindowXY{ #usage: my $hwnd=getWindowXY($x,$y); #info: returns the window handle of window at x,y my $x=shift || return; my $y=shift || return; my $WindowFromPoint = new Win32::API("user32", "WindowFromPoint", ['N','N'], 'N') || return $^E; my $POINT = pack("LL", $x, $y); return $WindowFromPoint->Call($x,$y); } ############### sub getWindowClass{ my $hwnd = shift || return; my $GetClassName = new Win32::API("user32", "GetClassName", ['N', 'P', 'N'], 'N') || return $^E; my $name = " " x 1024; my $nameLen = 1024; my $result = $GetClassName->Call($hwnd, $name, $nameLen); if($result){return substr($name, 0, $result);} } ############### sub getWindowExe { #GetModuleFileName my $hwnd = shift || return; my $GetModuleFileName = new Win32::API("kernel32", "GetModuleFileName", ['N', 'P', 'N'], 'N') || return "unable to create new API"; my $name = " " x 1024; my $Len = 1024; my $result = $GetModuleFileName->Call($hwnd, $name, $Len); if($result) {return substr($name, 0, $result);} return "unknown"; } ############### sub getWindowRect { my $hwnd = shift || return; my $GetWindowRect = new Win32::API("user32", "GetWindowRect", ['N', 'P'], 'N') || return $^E; my $RECT = pack("iiii", 0, 0); $GetWindowRect->Call($hwnd, $RECT); return wantarray ? unpack("iiii", $RECT) : $RECT; } ############### sub getWindowText{ my $hwnd = shift || return; my $GetWindowText = new Win32::API("user32", "GetWindowText", ['N', 'P', 'N'], 'N') || return $^E; my $title = " " x 1024; my $titleLen = 1024; my $result = $GetWindowText->Call($hwnd, $title, $titleLen); my $text=substr($title, 0, $result); if($text){return $text;} #if no result send a WM_GetText message to the window my $WmSendMessage = new Win32::API("user32", "SendMessageA", ['N','N','N','P'],'N') || return $^E; my $WM_GETTEXT=13; my $txt = " " x 2048; my $textLen = 2048; $result = $WmSendMessage->Call($hwnd,$WM_GETTEXT, $textLen, $txt); $text= substr($txt, 0, $result); return $text; } ##################### sub get_cursor{ return Win32::GUI::BitmapInline->newCursor( q( AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj ///AB///4A////g///////////////////////////////////////8= ) ); } ---------------------------------------------------------------- ----- Original Message ----- From: "Robert May" <rm...@po...> To: "Steven Lloyd" <sl...@ti...> Cc: <per...@li...> Sent: Thursday, August 11, 2005 11:57 AM Subject: Re: Draggable 'window' [Was: MDIFrame and background Image] > Steven Lloyd wrote: >> Rob, >> I have got this far but I cannot seem to get SetCapture to allow me to go >> outside my window. Any ideas? > > Steve, > > Please can we keep discussion on-list (unless they are OT) - others may be > able to help, and may like to see the problems being solved. > > Read up about SetCapture at: > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputfunctions/setcapture.asp > > You only continue to get mouse move events outside your window if a mouse > button is depressed, so you'll need to catch a mouse down event, > SetCapture(), process mouse moves and then ReleaseCapture() on the mouse > up event (OK, this last step is not strictly necessary, as the system will > do it for you). > > I was also wrong about the hit-hest idea - I think you'll need to use some > combination of WindowFromPoint() and ChildWindowFromPoint() - I haven't > looked to see if they're in Win32::GUI or not. > > Regards, > Rob. > > #!perl -w > > # Left-Click on the target image, and drag > > use warnings; > use strict; > > use Win32::GUI 1.0; > use Win32::GUI::BitmapInline(); > > my $mw = Win32::GUI::Window->new( > -name => "MainWindow", > -title => "Win32::GUI Spy++", > -pos => [100,100], > -size => [100,100], > ); > > my $cursor = get_cursor(); > > $mw->AddLabel( > -name => "Target", > -icon => $cursor, > -notify => 1, > -onMouseDown => \&mouseDown, > -onMouseUp => \&mouseUp, > -onMouseMove => \&mouseMove, > ); > > $mw->Show(); > Win32::GUI::Dialog(); > exit(0); > > sub mouseDown > { > my $label = shift; > Win32::GUI::SetCursor($cursor); > $label->SetCapture(); > > return; > } > > sub mouseUp > { > my $label = shift; > $label->ReleaseCapture(); > > return; > } > > sub mouseMove > { > my ($label, $x, $y) = @_; # x,y in client co-ordinates > > return unless Win32::GUI::GetCapture(); > > Win32::GUI::SetCursor($cursor); > print "Mouse at: $x,$y\n"; > > return; > } > > sub get_cursor > { > return Win32::GUI::BitmapInline->newCursor( q( > AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA > AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA > AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g > D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj > ///AB///4A////g///////////////////////////////////////8= > ) ); > } > > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.10.7/70 - Release Date: 8/11/2005 > > |
From: Jeremy W. <jez...@ho...> - 2005-08-16 08:59:03
|
>Well, I have got close but I am not sure how to make the Drawn rectangle >transparent or how to dispose of the DC after I am through.. Any help >would be greatly appreciated. You'll be glad to know, that the solution is straightforward:) It's probably worth explaining a few things for the benifit of other readers. In a normal situation you would have a Win32::GUI DC object and you would call methods upon it such as $dc->Rectangle($left,$top,$right,$bottom). You can also call the Rectangle function in procedural form, you just need to pass a DC object or a valid handle: $dc->Rectangle($left,$top,$right,$bottom); Win32::GUI::DC::Rectangle($dc,$left,$top,$right,$bottom); The above two calls are equivalent. But you don't need to pass an object at all: Win32::GUI::DC::Rectangle(18947123,$left,$top,$right,$bottom); If 18947123 is a valid DC, then you'll get a rectangle drawn. So you can use all the DC 'methods', as function calls passing in your handles. As the rectangle function draws with the current pen and fills with the current brush, one way would be: sub drawRectangle{ #usage: my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); #info: returns the handle of a device context for the specified window. my $hdc=shift || return; my $left=shift || 0; my $top=shift || 0; my $right=shift || 0; my $bottom=shift || 0; #my $Rectangle = new Win32::API("gdi32", "Rectangle", ['N','I','I','I','I'], 'N') || return $^E; Win32::GUI::DC::Line($hdc,$left,$top,$right,$top); Win32::GUI::DC::Line($hdc,$right,$top,$right,$bottom); Win32::GUI::DC::Line($hdc,$right,$bottom,$left,$bottom); Win32::GUI::DC::Line($hdc,$left,$bottom,$left,$top); #my $ok=$Rectangle->Call($hdc,$left,$top,$right,$bottom); return $hdc; } Perhaps the better solution in this case would be to use the FrameRect function (notice how you can mix and match real Win32::GUI objects and handles): sub drawRectangle{ #usage: my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); #info: returns the handle of a device context for the specified window. my $hdc=shift || return; my $left=shift || 0; my $top=shift || 0; my $right=shift || 0; my $bottom=shift || 0; #my $Rectangle = new Win32::API("gdi32", "Rectangle", ['N','I','I','I','I'], 'N') || return $^E; my $brush = new Win32::GUI::Brush([255,0,0]); Win32::GUI::DC::FrameRect($hdc,$left,$top,$right,$bottom,$brush); #my $ok=$Rectangle->Call($hdc,$left,$top,$right,$bottom); return $hdc; } As for releasing the DC, you could use the ReleaseDC function - but you'll have to pass the window handle and well as the DC handle: Win32::GUI::DC::ReleaseDC($windowhandle,$hdc); Cheers, jez. |
From: Steven L. <sl...@ti...> - 2005-08-16 12:32:28
|
Thanks Jez. Your suggestions seems to work except for the last thing. As I move the cursor over windows, how do I repaint windows that no longer have the cursor over them? Is there a way to get all the windows to repaint? Disposing of the DC did not seem to do this? Steve http://www.basgetti.com ----- Original Message ----- From: "Jeremy White" <jez...@ho...> To: <sl...@ti...>; <rm...@po...> Cc: <per...@li...> Sent: Tuesday, August 16, 2005 2:58 AM Subject: RE: [perl-win32-gui-users] Re: Draggable 'window' [Was: MDIFrame and background Image] > >>Well, I have got close but I am not sure how to make the Drawn rectangle >>transparent or how to dispose of the DC after I am through.. Any help >>would be greatly appreciated. > > You'll be glad to know, that the solution is straightforward:) It's > probably worth explaining a few things for the benifit of other readers. > > In a normal situation you would have a Win32::GUI DC object and you would > call methods upon it such as $dc->Rectangle($left,$top,$right,$bottom). > > You can also call the Rectangle function in procedural form, you just need > to pass a DC object or a valid handle: > > $dc->Rectangle($left,$top,$right,$bottom); > Win32::GUI::DC::Rectangle($dc,$left,$top,$right,$bottom); > > The above two calls are equivalent. But you don't need to pass an object > at all: > > Win32::GUI::DC::Rectangle(18947123,$left,$top,$right,$bottom); > > If 18947123 is a valid DC, then you'll get a rectangle drawn. So you can > use all the DC 'methods', as function calls passing in your handles. > > As the rectangle function draws with the current pen and fills with the > current brush, one way would be: > > sub drawRectangle{ > #usage: my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); > #info: returns the handle of a device context for the specified window. > my $hdc=shift || return; > my $left=shift || 0; > my $top=shift || 0; > my $right=shift || 0; > my $bottom=shift || 0; > #my $Rectangle = new Win32::API("gdi32", "Rectangle", > ['N','I','I','I','I'], 'N') || return $^E; > Win32::GUI::DC::Line($hdc,$left,$top,$right,$top); > Win32::GUI::DC::Line($hdc,$right,$top,$right,$bottom); > Win32::GUI::DC::Line($hdc,$right,$bottom,$left,$bottom); > Win32::GUI::DC::Line($hdc,$left,$bottom,$left,$top); > #my $ok=$Rectangle->Call($hdc,$left,$top,$right,$bottom); > return $hdc; > } > > Perhaps the better solution in this case would be to use the FrameRect > function (notice how you can mix and match real Win32::GUI objects and > handles): > > sub drawRectangle{ > #usage: my $ok=drawRectangle($hdc,$left,$top,$right,$bottom); > #info: returns the handle of a device context for the specified window. > my $hdc=shift || return; > my $left=shift || 0; > my $top=shift || 0; > my $right=shift || 0; > my $bottom=shift || 0; > #my $Rectangle = new Win32::API("gdi32", "Rectangle", > ['N','I','I','I','I'], 'N') || return $^E; > my $brush = new Win32::GUI::Brush([255,0,0]); > Win32::GUI::DC::FrameRect($hdc,$left,$top,$right,$bottom,$brush); > #my $ok=$Rectangle->Call($hdc,$left,$top,$right,$bottom); > return $hdc; > } > > As for releasing the DC, you could use the ReleaseDC function - but you'll > have to pass the window handle and well as the DC handle: > > Win32::GUI::DC::ReleaseDC($windowhandle,$hdc); > > Cheers, > > jez. > > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.10.10/73 - Release Date: 8/15/2005 > > |
From: Jeremy W. <jez...@ho...> - 2005-08-16 13:05:53
|
>Thanks Jez. Your suggestions seems to work except for the last thing. As I >move the cursor over windows, how do I repaint windows that no longer have >the cursor over them? Is there a way to get all the windows to repaint? >Disposing of the DC did not seem to do this? Releasing the DC wouldn't force a redraw. If you want to redraw a window, a couple of functions in Win32::GUI should help, InvalidateRect and Redraw. Both functions can be called as functions with the first parm being the window handle (behind the scenes, InvalidateRect calls the MS API InvalidateRect while Redraw calls RedrawWindow just in case you wanted to look them up). It should be relatively simple logic to redraw a window once the cursor has left it, although I think in some cases you might have to do a full refresh with: Win32::GUI::InvalidateRect(0,0); Adding this to your example seems to work - although I think your coordinate system with the cursor is slightly out of sync? Cheers, jez. |
From: Steven L. <sl...@ti...> - 2005-08-16 13:12:07
|
Thanks Jez, I will work on the coordinates.. We are close now.. :) ----- Original Message ----- From: "Jeremy White" <jez...@ho...> To: <sl...@ti...>; <rm...@po...> Cc: <per...@li...> Sent: Tuesday, August 16, 2005 7:05 AM Subject: Re: [perl-win32-gui-users] Re: Draggable 'window' [Was: MDIFrame and background Image] > >>Thanks Jez. Your suggestions seems to work except for the last thing. As >>I move the cursor over windows, how do I repaint windows that no longer >>have the cursor over them? Is there a way to get all the windows to >>repaint? Disposing of the DC did not seem to do this? > > Releasing the DC wouldn't force a redraw. If you want to redraw a window, > a couple of functions in Win32::GUI should help, InvalidateRect and > Redraw. Both functions can be called as functions with the first parm > being the window handle (behind the scenes, InvalidateRect calls the MS > API InvalidateRect while Redraw calls RedrawWindow just in case you wanted > to look them up). > > It should be relatively simple logic to redraw a window once the cursor > has left it, although I think in some cases you might have to do a full > refresh with: > > Win32::GUI::InvalidateRect(0,0); > > Adding this to your example seems to work - although I think your > coordinate system with the cursor is slightly out of sync? > > Cheers, > > jez. > > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.10.10/73 - Release Date: 8/15/2005 > > |
From: Steven L. <sl...@ti...> - 2005-08-17 02:53:21
|
MouseMove returns the label, and the x, y coordinates of the mouse, right? ----- Original Message ----- From: "Jeremy White" <jez...@ho...> To: <sl...@ti...>; <rm...@po...> Cc: <per...@li...> Sent: Tuesday, August 16, 2005 7:05 AM Subject: Re: [perl-win32-gui-users] Re: Draggable 'window' [Was: MDIFrame and background Image] > >>Thanks Jez. Your suggestions seems to work except for the last thing. As >>I move the cursor over windows, how do I repaint windows that no longer >>have the cursor over them? Is there a way to get all the windows to >>repaint? Disposing of the DC did not seem to do this? > > Releasing the DC wouldn't force a redraw. If you want to redraw a window, > a couple of functions in Win32::GUI should help, InvalidateRect and > Redraw. Both functions can be called as functions with the first parm > being the window handle (behind the scenes, InvalidateRect calls the MS > API InvalidateRect while Redraw calls RedrawWindow just in case you wanted > to look them up). > > It should be relatively simple logic to redraw a window once the cursor > has left it, although I think in some cases you might have to do a full > refresh with: > > Win32::GUI::InvalidateRect(0,0); > > Adding this to your example seems to work - although I think your > coordinate system with the cursor is slightly out of sync? > > Cheers, > > jez. > > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.10.10/73 - Release Date: 8/15/2005 > > |
From: Robert M. <rm...@po...> - 2005-08-19 15:38:39
|
Steven Lloyd wrote: > MouseMove returns the label, and the x, y coordinates of the mouse, right? Right - but it gives an unsigned value. This is not usually a problem, as you don't normally seem mouse move locations outside the client area, which always has 'small' positive values. The code below contains a work-around for this issue, and I will look at Jeremy's solution from the other related thread. Not wanting to steal your thunder on this one, but I had a few hours on a plane this-morning, and I came up with a way of doing the drawing that doesn't need the Redraw/InvalidateRect calls. It also deals with not drawing over windows that overlap the one you hover the mouse over. I tried to avoid using Win32::API, but in the end needed a couple of extra calls to get the full functionality that I was looking for. Regards, Rob. #!perl -w use warnings; use strict; use Win32::GUI; use Win32::GUI::BitmapInline(); use Win32::API; # Some constants sub CW_USEDEFAULT() {0x80000000} sub R2_NOT() {6} sub PS_INSIDEFRAME() {6} sub NULL_BRUSH() {5} sub GWL_STYLE() {-16} sub CWP_SKIPINVISIBLE() {1} sub CLR_BLUE() {0xFF0000} # Using Win32::API, as GetWindowDC not in Win32::GUI my $GetWindowDC = Win32::API->new("user32", "GetWindowDC", 'N', 'N') or die "Can't load GetWindowDC: $!"; # Note that the prototype of 'NNNN' is a cheat, and relies on the fact # that the point structure (2nd argument) that must be passed by value # can be pushed onto the calling stack as 2 16-bit numbers, rather than # a single 32-bit struct. Doing it this way avoids having to use # Win32::API::Struct to define a POINT struct, and using the prototype # 'NSN'. my $ChildWindowFromPointEx = Win32::API->new("user32", "ChildWindowFromPointEx", 'NNNN', 'N') or die "Can't load ChildWindowFromPointEx: $!"; # Some resources that we'll be using a lot; create them once: my $cursor = get_cursor(); my $blank_cursor = get_cursor2(); my $pen = Win32::GUI::Pen->new( -style => PS_INSIDEFRAME, -width => 3, -color => 0, # pen color is ignored when foreground mix mode is R2_NOT ) or die "Creating Pen"; my $null_brush = Win32::GUI::GetStockObject(NULL_BRUSH); # The window handle of the window that we're over, and have # drawn a rectangle around. Use 0 to indicate no such window. my $curHwnd = 0; # Create out main window my $mw = Win32::GUI::Window->new( -name => "MainWindow", -title => "Win32::GUI Spy++", -left => CW_USEDEFAULT, -size => [215,140], -resizable => 0, ) or die "Creating Main Window failed"; # Instruction label $mw->AddLabel( -name => "Instructions", -text => "Drag the target over the window you want information about", -pos => [5,4], -size => [160, 32], ) or die "Creating Instruction label failed"; # Target bitmap label $mw->AddLabel( -name => "Target", -pos => [170,4], -icon => $cursor, -background => CLR_BLUE, -notify => 1, -onMouseDown => \&mouseDown, -onMouseUp => \&mouseUp, -onMouseMove => \&mouseMove, ) or die "Creating Target Label failed"; # Label and Textfield to report window handle $mw->AddTextfield( -name => 'HWND', -prompt => [ 'Handle', 40 ], -pos => [5,40], -size => [160,20], -readonly => 1, ) or die "Creating HWND Field failed"; # Label and Textfield to report window title/text $mw->AddTextfield( -name => 'TITLE', -prompt => [ 'Title', 40 ], -pos => [5,62], -size => [160,20], -readonly => 1, ) or die "Creating TITLE field failed"; # Label and Textfield to report window class $mw->AddTextfield( -name => 'CLASS', -prompt => [ 'Class', 40 ], -pos => [5,84], -size => [160,20], -readonly => 1, ) or die "Creating CLASS field failed"; # Display the window and enter the dialog phase $mw->Show(); Win32::GUI::Dialog(); # We're done exit(0); ###################################################################### # Event handlers ###################################################################### ###################################################################### # Target Label Mouse Down handler: # - Capture the mouse, set the cursor to the target cursor, and remove # the icon from the label sub mouseDown{ my $label = shift; $label->SetCapture(); Win32::GUI::SetCursor($cursor); $label->SetIcon($blank_cursor); return; } ###################################################################### # Target Label Mouse Up handler: # - If the label has captured the mouse (should have done in the # mouse down handler), then release capture, set the label icon # and set the fact that we're no longer over a window # - Force a redraw of all windows, in case we got any of our # drawing wrong. sub mouseUp{ return unless Win32::GUI::GetCapture(); my $label = shift; $label->ReleaseCapture(); $label->SetIcon($cursor); $curHwnd = 0; # redraw everything to remove any trace that we # were here (in case my drawing is wrong somewhere). Win32::GUI::InvalidateRect(0,1); return; } ###################################################################### # Target Label Mouse Up handler: # - If the label has captured the mouse, then find the window the # mouse is over. If it has changed, then undraw any highlight # rectangle we have already drawn, draw the highlight rectangle # around the new window and update the information fields. sub mouseMove{ return unless Win32::GUI::GetCapture(); my ($label, $cx, $cy) = @_; # x,y in client co-ordinates Win32::GUI::SetCursor($cursor); # Take into account that client co-ordinates can be negative, # convert pos to screen co-ordinates and get handle to window # at that position: $cx -= 65536 if $cx > 32767; $cy -= 65536 if $cy > 32767; my ($sx, $sy) = $label->ClientToScreen($cx, $cy); my $hwnd=GetWindowFromPoint($sx, $sy); # If we moved into a new window, then undraw the rect # from the previous window, draw the rect around the # new window, and update the textfields: if($hwnd != $curHwnd) { DrawInvertedRect($curHwnd) if $curHwnd; # undraw old highlight DrawInvertedRect($hwnd); # draw new highlight $curHwnd = $hwnd; # store the window with the highlight # Update the information fields $mw->HWND->Text(sprintf("0x%08X", $hwnd)); $mw->CLASS->Text(Win32::GUI::GetClassName($hwnd)); $mw->TITLE->Text(Win32::GUI::Text($hwnd)); } return; } ###################################################################### # Helper Functions ###################################################################### ###################################################################### # GetWindowFromPoint # - returns the handle of the window whose location is at the screen # co-ordinates x, y sub GetWindowFromPoint { my ($sx, $sy) = @_; # Firstly get the window handle at the screen # co-ordinates given. This ignores hidden, # disabled and static text controls. my $hwnd=Win32::GUI::WindowFromPoint($sx, $sy); # Convert $x, $y to client co-ordinates of the hwnd # that has been found, and use ChildWindowFromPointEx # to find static text controls and disabled # windows (but ignoring hidden windows, as we can't # draw on them). Only use return value if not NULL(0) # which happens if we're in the non-client region of a window my ($cx, $cy) = Win32::GUI::ScreenToClient($hwnd, $sx, $sy); my $chwnd=$ChildWindowFromPointEx->Call($hwnd, $cx, $cy, CWP_SKIPINVISIBLE); $hwnd = $chwnd if $chwnd; # If We've got a child window, then walk it's siblings to see # if there is a visible window higher in the z-order that we # should be using. This is needed, for example, when a groupbox # contains controls that have the same parent as the groupbox # itself. I.e this copes with multiple controls with the same # parent occupying the same space - GetChildWindowFromPoint only # ever gives the lower z-order window. Why? # # It would be better to use EnumChildWindows, but we don't have # that in Win32::GUI, and I don't trust the Win32::API callback # support. if((Win32::GUI::GetWindowLong($hwnd, GWL_STYLE) & WS_CHILD) == WS_CHILD) { my $shwnd = $hwnd; while($shwnd = Win32::GUI::GetWindow($shwnd, GW_HWNDNEXT)) { my ($l, $t, $r, $b) = Win32::GUI::GetWindowRect($shwnd); if( Win32::GUI::IsVisible($shwnd) and $sx >= $l and $sx <= $r and $sy >= $t and $sy <= $b) { $hwnd = $shwnd; } } } return $hwnd; } ###################################################################### # DrawInvertedRect # - Draws a rectangle around a window. Uses a NULL brush to avoid # painting over the window content; use a pen with style # PS_INSIDEFRAME to adjust the rectangle edge to be drawn entirely # inside the rectangle boundaries; use a foreground mix mode # (SetROP2) of R2_NOT, so that drawing the same rectangle a second # time, undoes the draw. sub DrawInvertedRect { my $hwnd = shift or return 0; # Get window position in screen co-ordinates my($l, $t, $r, $b) = Win32::GUI::GetWindowRect($hwnd); # Get a handle to the WINDOW DC (the whole window, not just # the client area, so that we can draw in the non-client # area for window where we need to) my $hdc = $GetWindowDC->Call($hwnd); # Set the foreground mix mode my $oldROP = Win32::GUI::DC::ROP2($hdc, R2_NOT); # Set the pen and brush my $oldPen = Win32::GUI::DC::SelectObject($hdc, $pen); my $oldBrush = Win32::GUI::DC::SelectObject($hdc, $null_brush); # Draw the rectangle Win32::GUI::DC::Rectangle($hdc, 0, 0, $r-$l, $b-$t); # Restore the forgeround mix mode, pen and brush, and relese # the window DC Win32::GUI::DC::ROP2($hdc, $oldROP); Win32::GUI::DC::SelectObject($hdc, $oldPen); Win32::GUI::DC::SelectObject($hdc, $oldBrush); Win32::GUI::DC::ReleaseDC($hwnd, $hdc); return 1; } ###################################################################### # get_cursor # - returns a Win32::GUI::Cursor object for the target cursor/icon sub get_cursor { return Win32::GUI::BitmapInline->newCursor( q( AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj ///AB///4A////g///////////////////////////////////////8= ) ); } ###################################################################### # get_cursor2 # - returns a Win32::GUI::Cursor object for a blank (transparent) # cursor/icon, used to replae the target icon in the TARGET label # while we're draggin the target around sub get_cursor2 { return Win32::GUI::BitmapInline->newCursor( q( AAABAAEAICAAAAEAAQAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// //////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////8= ) ); } |
From: Steven L. <sl...@ti...> - 2005-08-21 02:03:44
|
Robert, Thanks a bunch! That does work very nice. I have been gone camping with the family so I haven't even looked at a computer in 3 days. Very well done. Steve ----- Original Message ----- From: "Robert May" <rm...@po...> To: "Steven Lloyd" <sl...@ti...> Cc: "Jeremy White" <jez...@ho...>; <per...@li...> Sent: Friday, August 19, 2005 9:37 AM Subject: Re: Draggable 'window' > Steven Lloyd wrote: >> MouseMove returns the label, and the x, y coordinates of the mouse, >> right? > > Right - but it gives an unsigned value. This is not usually a problem, > as you don't normally seem mouse move locations outside the client area, > which always has 'small' positive values. The code below contains a > work-around for this issue, and I will look at Jeremy's solution from > the other related thread. > > Not wanting to steal your thunder on this one, but I had a few hours on > a plane this-morning, and I came up with a way of doing the drawing that > doesn't need the Redraw/InvalidateRect calls. It also deals with not > drawing over windows that overlap the one you hover the mouse over. > > I tried to avoid using Win32::API, but in the end needed a couple of > extra calls to get the full functionality that I was looking for. > > Regards, > Rob. > > #!perl -w > use warnings; > use strict; > > use Win32::GUI; > use Win32::GUI::BitmapInline(); > use Win32::API; > > # Some constants > sub CW_USEDEFAULT() {0x80000000} > sub R2_NOT() {6} > sub PS_INSIDEFRAME() {6} > sub NULL_BRUSH() {5} > sub GWL_STYLE() {-16} > sub CWP_SKIPINVISIBLE() {1} > > sub CLR_BLUE() {0xFF0000} > > # Using Win32::API, as GetWindowDC not in Win32::GUI > my $GetWindowDC = Win32::API->new("user32", "GetWindowDC", 'N', 'N') > or die "Can't load GetWindowDC: $!"; > > # Note that the prototype of 'NNNN' is a cheat, and relies on the fact > # that the point structure (2nd argument) that must be passed by value > # can be pushed onto the calling stack as 2 16-bit numbers, rather than > # a single 32-bit struct. Doing it this way avoids having to use > # Win32::API::Struct to define a POINT struct, and using the prototype > # 'NSN'. > my $ChildWindowFromPointEx = Win32::API->new("user32", > "ChildWindowFromPointEx", 'NNNN', 'N') > or die "Can't load ChildWindowFromPointEx: $!"; > > # Some resources that we'll be using a lot; create them once: > my $cursor = get_cursor(); > my $blank_cursor = get_cursor2(); > my $pen = Win32::GUI::Pen->new( > -style => PS_INSIDEFRAME, > -width => 3, > -color => 0, # pen color is ignored when foreground mix mode is R2_NOT > ) or die "Creating Pen"; > my $null_brush = Win32::GUI::GetStockObject(NULL_BRUSH); > > # The window handle of the window that we're over, and have > # drawn a rectangle around. Use 0 to indicate no such window. > my $curHwnd = 0; > > # Create out main window > my $mw = Win32::GUI::Window->new( > -name => "MainWindow", > -title => "Win32::GUI Spy++", > -left => CW_USEDEFAULT, > -size => [215,140], > -resizable => 0, > ) or die "Creating Main Window failed"; > > # Instruction label > $mw->AddLabel( > -name => "Instructions", > -text => "Drag the target over the window you want information about", > -pos => [5,4], > -size => [160, 32], > ) or die "Creating Instruction label failed"; > > # Target bitmap label > $mw->AddLabel( > -name => "Target", > -pos => [170,4], > -icon => $cursor, > -background => CLR_BLUE, > -notify => 1, > -onMouseDown => \&mouseDown, > -onMouseUp => \&mouseUp, > -onMouseMove => \&mouseMove, > ) or die "Creating Target Label failed"; > > # Label and Textfield to report window handle > $mw->AddTextfield( > -name => 'HWND', > -prompt => [ 'Handle', 40 ], > -pos => [5,40], > -size => [160,20], > -readonly => 1, > ) or die "Creating HWND Field failed"; > > # Label and Textfield to report window title/text > $mw->AddTextfield( > -name => 'TITLE', > -prompt => [ 'Title', 40 ], > -pos => [5,62], > -size => [160,20], > -readonly => 1, > ) or die "Creating TITLE field failed"; > > # Label and Textfield to report window class > $mw->AddTextfield( > -name => 'CLASS', > -prompt => [ 'Class', 40 ], > -pos => [5,84], > -size => [160,20], > -readonly => 1, > ) or die "Creating CLASS field failed"; > > # Display the window and enter the dialog phase > $mw->Show(); > Win32::GUI::Dialog(); > > # We're done > exit(0); > > ###################################################################### > # Event handlers > ###################################################################### > > ###################################################################### > # Target Label Mouse Down handler: > # - Capture the mouse, set the cursor to the target cursor, and remove > # the icon from the label > sub mouseDown{ > my $label = shift; > > $label->SetCapture(); > Win32::GUI::SetCursor($cursor); > $label->SetIcon($blank_cursor); > > return; > } > > ###################################################################### > # Target Label Mouse Up handler: > # - If the label has captured the mouse (should have done in the > # mouse down handler), then release capture, set the label icon > # and set the fact that we're no longer over a window > # - Force a redraw of all windows, in case we got any of our > # drawing wrong. > sub mouseUp{ > return unless Win32::GUI::GetCapture(); > > my $label = shift; > > $label->ReleaseCapture(); > $label->SetIcon($cursor); > $curHwnd = 0; > > # redraw everything to remove any trace that we > # were here (in case my drawing is wrong somewhere). > Win32::GUI::InvalidateRect(0,1); > > return; > } > > ###################################################################### > # Target Label Mouse Up handler: > # - If the label has captured the mouse, then find the window the > # mouse is over. If it has changed, then undraw any highlight > # rectangle we have already drawn, draw the highlight rectangle > # around the new window and update the information fields. > sub mouseMove{ > return unless Win32::GUI::GetCapture(); > > my ($label, $cx, $cy) = @_; # x,y in client co-ordinates > Win32::GUI::SetCursor($cursor); > > # Take into account that client co-ordinates can be negative, > # convert pos to screen co-ordinates and get handle to window > # at that position: > $cx -= 65536 if $cx > 32767; > $cy -= 65536 if $cy > 32767; > my ($sx, $sy) = $label->ClientToScreen($cx, $cy); > > my $hwnd=GetWindowFromPoint($sx, $sy); > > # If we moved into a new window, then undraw the rect > # from the previous window, draw the rect around the > # new window, and update the textfields: > if($hwnd != $curHwnd) { > DrawInvertedRect($curHwnd) if $curHwnd; # undraw old highlight > DrawInvertedRect($hwnd); # draw new highlight > $curHwnd = $hwnd; # store the window with the highlight > > # Update the information fields > $mw->HWND->Text(sprintf("0x%08X", $hwnd)); > $mw->CLASS->Text(Win32::GUI::GetClassName($hwnd)); > $mw->TITLE->Text(Win32::GUI::Text($hwnd)); > } > > return; > } > > ###################################################################### > # Helper Functions > ###################################################################### > > ###################################################################### > # GetWindowFromPoint > # - returns the handle of the window whose location is at the screen > # co-ordinates x, y > sub GetWindowFromPoint > { > my ($sx, $sy) = @_; > > # Firstly get the window handle at the screen > # co-ordinates given. This ignores hidden, > # disabled and static text controls. > my $hwnd=Win32::GUI::WindowFromPoint($sx, $sy); > > # Convert $x, $y to client co-ordinates of the hwnd > # that has been found, and use ChildWindowFromPointEx > # to find static text controls and disabled > # windows (but ignoring hidden windows, as we can't > # draw on them). Only use return value if not NULL(0) > # which happens if we're in the non-client region of a window > my ($cx, $cy) = Win32::GUI::ScreenToClient($hwnd, $sx, $sy); > my $chwnd=$ChildWindowFromPointEx->Call($hwnd, $cx, $cy, > CWP_SKIPINVISIBLE); > $hwnd = $chwnd if $chwnd; > > # If We've got a child window, then walk it's siblings to see > # if there is a visible window higher in the z-order that we > # should be using. This is needed, for example, when a groupbox > # contains controls that have the same parent as the groupbox > # itself. I.e this copes with multiple controls with the same > # parent occupying the same space - GetChildWindowFromPoint only > # ever gives the lower z-order window. Why? > # > # It would be better to use EnumChildWindows, but we don't have > # that in Win32::GUI, and I don't trust the Win32::API callback > # support. > if((Win32::GUI::GetWindowLong($hwnd, GWL_STYLE) & WS_CHILD) == WS_CHILD) { > my $shwnd = $hwnd; > while($shwnd = Win32::GUI::GetWindow($shwnd, GW_HWNDNEXT)) { > my ($l, $t, $r, $b) = Win32::GUI::GetWindowRect($shwnd); > if( Win32::GUI::IsVisible($shwnd) and > $sx >= $l and $sx <= $r and > $sy >= $t and $sy <= $b) { > $hwnd = $shwnd; > } > } > } > > return $hwnd; > } > > ###################################################################### > # DrawInvertedRect > # - Draws a rectangle around a window. Uses a NULL brush to avoid > # painting over the window content; use a pen with style > # PS_INSIDEFRAME to adjust the rectangle edge to be drawn entirely > # inside the rectangle boundaries; use a foreground mix mode > # (SetROP2) of R2_NOT, so that drawing the same rectangle a second > # time, undoes the draw. > sub DrawInvertedRect > { > my $hwnd = shift or return 0; > > # Get window position in screen co-ordinates > my($l, $t, $r, $b) = Win32::GUI::GetWindowRect($hwnd); > > # Get a handle to the WINDOW DC (the whole window, not just > # the client area, so that we can draw in the non-client > # area for window where we need to) > my $hdc = $GetWindowDC->Call($hwnd); > # Set the foreground mix mode > my $oldROP = Win32::GUI::DC::ROP2($hdc, R2_NOT); > # Set the pen and brush > my $oldPen = Win32::GUI::DC::SelectObject($hdc, $pen); > my $oldBrush = Win32::GUI::DC::SelectObject($hdc, $null_brush); > > # Draw the rectangle > Win32::GUI::DC::Rectangle($hdc, 0, 0, $r-$l, $b-$t); > > # Restore the forgeround mix mode, pen and brush, and relese > # the window DC > Win32::GUI::DC::ROP2($hdc, $oldROP); > Win32::GUI::DC::SelectObject($hdc, $oldPen); > Win32::GUI::DC::SelectObject($hdc, $oldBrush); > Win32::GUI::DC::ReleaseDC($hwnd, $hdc); > > return 1; > } > > ###################################################################### > # get_cursor > # - returns a Win32::GUI::Cursor object for the target cursor/icon > sub get_cursor > { > return Win32::GUI::BitmapInline->newCursor( q( > AAACAAEAICAAAA8AEAAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAEAAAAAAAAAAAAAAAAA > AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAGDAAACbIAABQFAAApsoA > AUAFAAECgQACoAqAAqgqgAIBAIACqCqAAqAKgAECgQABQAUAAKbKAABQFAAAJsgAABgwAAAHwAAA > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////g////g > D///wAf//4gj//8YMf/+ODj//nx8//wMYH/8A4B//AOAf/wDgH/8DGB//nx8//44OP//GDH//4gj > ///AB///4A////g///////////////////////////////////////8= > ) ); > } > > ###################################################################### > # get_cursor2 > # - returns a Win32::GUI::Cursor object for a blank (transparent) > # cursor/icon, used to replae the target icon in the TARGET label > # while we're draggin the target around > sub get_cursor2 > { > return Win32::GUI::BitmapInline->newCursor( q( > AAABAAEAICAAAAEAAQAwAQAAFgAAACgAAAAgAAAAQAAAAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAA > AAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////////// > //////////////////////////////////////////////////////////////////////////// > //////////////////////////////////////////////////////8= > ) ); > } > > > > > -- > No virus found in this incoming message. > Checked by AVG Anti-Virus. > Version: 7.0.338 / Virus Database: 267.10.13/78 - Release Date: 8/19/2005 > > |
From: Steven L. <sl...@ti...> - 2005-08-22 04:25:47
|
I know that a horizontal slider can by created but is there a way to create a vertical slider control using Win32::GUI? Does AddSlider have such an option? Steve Lloyd http://www.basgetti.com |