From: Jason P. <ma...@cc...> - 2005-08-22 21:08:56
Attachments:
stupid.ico
|
Submitting these values to Show in regards to a window does not always work appropriately???? "$win->Show(SW_SHOWNA);" Herein lies an example sccript, along with an attached .ico file for use with said script. Sometimes it fires the Activate, sometimes it doesnt...odd, and annoying to have it grab the cursor away, if only for brief moments, It can stop you typing at just the right time.. WinXP Pro SP2 AS perl 5.8.4 build 810 Win32::GUI 1.02 Any help in sorting out why its pissy/not working properly would be appreciated! #-snip-# use warnings; use strict; use Win32::GUI; # winuser.h constants. #-- both are supposed to make it so the window is shown, but not activated. use constant SW_SHOWNOACTIVATE => 4; use constant SW_SHOWNA => 8; # collapsing length (milliseconds) use constant COLLAPSE_TIME => 100; # shell window handle my ($DOS) = Win32::GUI::GetPerlWindow(); # Functional States my $isActive = 1; my $isPopable = 1; # Collapsing Controls my $lapseTime = 0; my $lapsePart = 0; use constant LAPSE_TIME => 100; use constant LAPSE_PARTS => 10; # This window is created and never shown/activated/enabled, as a means to NOT show the notification on the taskbar. (needs a parent != desktop) my $winDiscard = new Win32::GUI::Window( -name=>'winGarbage', -height => 0, -width => 0, -remstyle => 0xFFFFFFFF, #make borderless -addstyle => 0x80000000 | 0, #make borderless -minimizebox=>0, -maximizebox=>0, -sizeable=>1, -resizable=>0, -menubox=>0, -sysmenu=>1, -dialogui=>0, ); # the better part of these options are purely here because I copied them from below. my $win = new Win32::GUI::Window( -parent=>$winDiscard, -name =>'winPopNotify', -height => 20, -width => 200, -topmost => 1, -remstyle => 0xFFFFFFFF, #make borderless -addstyle => 0x80000000 | 0, #make borderless -minimizebox=>0, -maximizebox=>0, -sizeable=>1, -resizable=>0, -menubox=>0, -sysmenu=>1, -dialogui=>0, ); # add Show Timer my $stimer = $win->AddTimer('tShow',30*1000); #30 seconds # add Collapsing Timer my $ctimer = $win->AddTimer('tCollapse',COLLAPSE_TIME); # Create NotifyIcon my $icon = new Win32::GUI::Icon('stupid.ico'); my $ni = $win->AddNotifyIcon(-name => 'NI', -id=>1, -tip=>'PopNotifyContol', -icon=>$icon); # Create richedit (content) my $re = $win->AddRichEdit( -name => 'rePNContent', -height => ($win->GetClientRect)[3], -width => ($win->GetClientRect)[2], ); # Create NI Menu my $NI_NO_MENU = 0; my $Menus = $winDiscard->AddMenu( -name => 'MMMenus', ); my $MTray = $Menus->AddMenuButton( -name => 'MTray', ); my $MTShowStatus = $MTray->AddMenuItem( -name => 'MTShowStatus', -text => 'Show Status', -id => 3, -onClick => \&MTShowStatus_Toggle, ); my $MTPopup = $MTray->AddMenuItem( -name => 'MTPopup', -text => 'Popup', -id => 2, -onClick => \&MTPopup_Toggle, ); $MTray->AddMenuItem( -seperator => 1, -id => 1, ); my $MTExit = $MTray->AddMenuItem( -name => 'MTExit', -text => 'Exit', -id => 0, -onClick => \&MTExit, ); # Prep content $win->rePNContent->BackColor('#000000'); $win->rePNContent->SetCharFormat(-color=>'#FFFF00'); $win->rePNContent->Select(-1,-1); $win->rePNContent->ReplaceSel("Notification\nPopup\n"); # Prep NI menu $MTShowStatus->Checked($isActive); $MTPopup->Checked($isPopable); $MTPopup->Enabled($isActive); # Hide the shell window #- disabled for debug # Win32::GUI::Hide($DOS); # Adjust the position of the Popup ResizeWindow(); # Show the popup without activation. $win->Show(SW_SHOWNA); $win->Enable(0); # Begin GUI Event Loop Win32::GUI::Dialog(); # Show the shell window Win32::GUI::Show($DOS); #########################################################################3 # routines sub AdjustWindow{ my ($edge, $need) = FindTrayEdge(); #- Debug # print "On edge [b/r/t/l]:$edge\nEdge is: $need\n"; if($edge == 1){ $win->Left(Win32::GUI::GetSystemMetrics(SM_CXSCREEN) - $win->Width); $win->Top( $need - $win->Height); } if($edge == 2){ $win->Left($need - $win->Width); $win->Top( Win32::GUI::GetSystemMetrics(SM_CYSCREEN) - $win->Height); } if($edge == 3){ $win->Left(Win32::GUI::GetSystemMetrics(SM_CXSCREEN) - $win->Width); $win->Top( $need); } if($edge == 4){ $win->Left($need); $win->Top( Win32::GUI::GetSystemMetrics(SM_CYSCREEN) - $win->Height); } return undef; } sub ResizeWindow{ my $lines = $win->rePNContent->LineFromChar($win->rePNContent->TextLength()); my $lsize = 14; # derive formula for proper size. Anyone have this? $win->Height( ($lines * $lsize) + 4); $win->rePNContent->Height($win->Height); AdjustWindow(); return undef; } ##++ # Show Timer events sub tShow_Timer{ $lapseTime=0; if($isActive){ ResizeWindow(); $win->Show(SW_SHOWNA); } } #-- ##++ # Collapse Timer events sub tCollapse_Timer{ if($win->IsVisible && $isPopable){ if($lapseTime < LAPSE_TIME){ #wait to shrink $lapseTime++; if($lapseTime == LAPSE_TIME){ $lapsePart= int($win->Height() / LAPSE_PARTS); #- Debug # print $win->Height(), ':',LAPSE_PARTS(),":$lapsePart\n"; } }elsif($lapseTime < LAPSE_TIME+LAPSE_PARTS){ # window shrank towards hiding. $win->Height($lapsePart * (( LAPSE_TIME + LAPSE_PARTS ) - $lapseTime) ); AdjustWindow(); $lapseTime++; }elsif($lapseTime == LAPSE_TIME + LAPSE_PARTS){ #window to be closed completely $win->Hide(); $lapseTime=0; } } } ##-- ##++ # Window events sub winPopNotify_Activate{ print "Why am I activating!\n"; return 1; } sub winPopNotify_Terminate{ $win->rePNContent->DESTROY; $win->NI->Delete(-id => 1); return -1; } ##-- ##++ # Menu Actions. sub MTShowStatus_Toggle{ $isActive^=1; if($isActive){ $MTShowStatus->Checked(1); $MTPopup->Enabled(1); $win->Show(SW_SHOWNA); ResizeWindow(); $lapseTime=0; }else{ $MTShowStatus->Checked(0); $MTPopup->Enabled(0); $win->Hide(); } } sub MTPopup_Toggle{ $isPopable^=1; if($isPopable){ $MTPopup->Checked(1); }else{ $MTPopup->Checked(0); if($isActive){ $win->Show(SW_SHOWNA); ResizeWindow(); $lapseTime=0; } } } sub MTExit{ winPopNotify_Terminate(); } ##-- ##++ # NotifyIcon Events sub NI_RightClick{ #Display menu my($x, $y) = Win32::GUI::GetCursorPos(); if(!$NI_NO_MENU){ $win->TrackPopupMenu($MTray, $x, $y); }else{ $NI_NO_MENU = 0; } return 1; } sub NI_Click{ #- Debug print "toggle\n"; MTShowStatus_Toggle; return 1; } ##-- ##++ # TaskBar location function sub FindTrayEdge{ # Get the window of the windows Taskbar my $tray = Win32::GUI::FindWindow("Shell_TrayWnd",""); # Get the Absolute dimensions of the Taskbar my ($al,$at,$ar,$ab) = Win32::GUI::GetAbsClientRect($tray); # Get the screen dimentions. my $CX = Win32::GUI::GetSystemMetrics(SM_CXSCREEN); my $CY = Win32::GUI::GetSystemMetrics(SM_CYSCREEN); #- Purely informational debug # print "Screen Res: $CX x $CY\n"; # print "Taskbar Dims: absolute($al,$at,$ar,$ab)\n"; my $retval1=-1; if($ar+2 >= $CX && $ab+2 >= $CY){ #bottom $retval1 = 1; } if($al-2 > 0){ #right $retval1 = 2; } if($ar+2 >= $CX && $ab+2 < $CY){ #top $retval1 = 3; } if($al-2 <= 0 && $ar+2 < $CX){ #left $retval1 = 4; } my $retval2=-1; if($retval1 == 1){ #bottom $retval2 = $at-2; }elsif($retval1 == 2){ #right $retval2 = $al-2; }elsif($retval1 == 3){ #top $retval2 = $ab+2; }elsif($retval1 == 4){ #left $retval2 = $ar+2; } # return edge[-1,1..4],postion[-1,pixel of appropriate edge.(approx)] return $retval1,$retval2; } ##-- ############################################################ # end 1; #-snip-# |
From: Jeremy W. <jez...@ho...> - 2005-08-23 08:10:27
|
>Sometimes it fires the Activate, sometimes it doesnt...odd, and annoying to >have it grab the cursor away, if only for brief moments, It can stop you >typing at just the right time.. > >WinXP Pro SP2 >AS perl 5.8.4 build 810 >Win32::GUI 1.02 > >Any help in sorting out why its pissy/not working properly would be >appreciated! Very interesting example. I checked that the win32-gui show method is passing the correct parameters to the MS API function ShowWindow - and it is, so the problem is not there. The only thing I can think of is when you are manipulating the window one of the methods is somehow performing an implicit activate? While looking at the MS doco for ShowWindow: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/showwindow.asp I came accross the AnimateWindow function: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/animatewindow.asp Now, this function doesn't exist in win32-gui, but you should be able to call it by win32-API - if you (or anyone else for that matter) thinks it should be in the core, I'll add it before the next release. Cheers, jez. |
From: Jason P. <ma...@cc...> - 2005-08-23 14:32:08
|
Jeremy White wrote: > >> Sometimes it fires the Activate, sometimes it doesnt...odd, and >> annoying to have it grab the cursor away, if only for brief moments, >> It can stop you typing at just the right time.. >> >> WinXP Pro SP2 >> AS perl 5.8.4 build 810 >> Win32::GUI 1.02 >> >> Any help in sorting out why its pissy/not working properly would be >> appreciated! > > > Very interesting example. I checked that the win32-gui show method is > passing the correct parameters to the MS API function ShowWindow - and > it is, so the problem is not there. The only thing I can think of is > when you are manipulating the window one of the methods is somehow > performing an implicit activate? > > While looking at the MS doco for ShowWindow: > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/showwindow.asp > > > I came accross the AnimateWindow function: > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/animatewindow.asp > > > Now, this function doesn't exist in win32-gui, but you should be able > to call it by win32-API - if you (or anyone else for that matter) > thinks it should be in the core, I'll add it before the next release. > > Cheers, > > jez. > I've done a little digging since I submitted this. It appears that it is being called when I reset the size and position after hiding, and then again when the forced animation begins collapsing it down. Activate is not called again while it is collapsing, but then it already has active and focus while its doing this operation at high speed. My thoughts are that it is somewhere doing this in the size and or location algorithms. I'll do some more debuging this afternoon (EST) to see if i can find th eexact point at which this occurs. ~ I'll do some fiddling with the API call although I admit I'm not the most comfortable with making the directed calls to the API, but if it works, it will be nice :) ~ While I have your ear regarding fancy features... Do you know of the method to display those little Tooltip messages that windows uses? This program isn't designed to emulate them so much as the MSN/Aim/Etc notification popups (once I have it working properly I'll even modularize them like I have done for identical (e.g. property windows)) I know the this one is a stretch, and I suppose I could do the research myself if I had spare time recently, but what property/style/method is needed for me to graphics laden my program to the likes of Trillian/AdAware/etc? Thanks for the great work. Jason |
From: Jeremy W. <jez...@ho...> - 2005-08-23 15:00:11
|
>I'll do some fiddling with the API call although I admit I'm not the most >comfortable with making the directed calls to the API, but if it works, it >will be nice :) >While I have your ear regarding fancy features... Do you know of the method >to display those little Tooltip messages that windows uses? Yeah, if you add -tip when you create the control, the tip will display automatically: $newwindow->AddButton ( -name => 'Name', -pos => [333, 1], -size => [20, 20], -tip => 'This button.....', ); >This program isn't designed to emulate them so much as the MSN/Aim/Etc >notification popups (once I have it working properly I'll even modularize >them like I have done for identical (e.g. property windows)) I had a play with AnimateWindow earlier and this is definitely what you want (I played with it in XS, not via the API - but the API way should have no problems). I think this is what MSN/yahoo/Skype use to get the notifications showing on the desktop. I did notice issues with using a richtext control in the window that rolls up and down, but you should be able to use a combination of other controls to achieve the same effect. Using AnimateWindow doesn't give the window focus either:) >I know the this one is a stretch, and I suppose I could do the research >myself if I had spare time recently, but what property/style/method is >needed for me to graphics laden my program to the likes of >Trillian/AdAware/etc? From a quick look of Trillian it looks like it is using a generic 3rd party widget control set. Some of these control sets are open source and simply need to be 'called'. A lot of the are ActiveX based, so quite a bit of glue would be needed. If you are happy with XP-styles, then that is easy enough to do - simply save the manifest file below in your Perl bin folder (for me it's C:\Perl\bin) - the file must be called "perl.exe.manifest" (or wperl.exe.manifest if you are using the consoleless version of perl). Every time you run perl, all your controls will now be using XP styles. Cheers, jez. <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity processorArchitecture="x86" version="5.1.0.0" type="win32" name="Your application" /> <description>Win32::GUI Application</description> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="x86" /> </dependentAssembly> </dependency> </assembly> |
From: Jason P. <ma...@cc...> - 2005-08-23 15:15:01
|
Jeremy White wrote: > >> I'll do some fiddling with the API call although I admit I'm not the >> most comfortable with making the directed calls to the API, but if it >> works, it will be nice :) > > >> While I have your ear regarding fancy features... Do you know of the >> method to display those little Tooltip messages that windows uses? > > > Yeah, if you add -tip when you create the control, the tip will > display automatically: > > $newwindow->AddButton ( > -name => 'Name', > -pos => [333, 1], > -size => [20, 20], > -tip => 'This button.....', > ); > > >> This program isn't designed to emulate them so much as the >> MSN/Aim/Etc notification popups (once I have it working properly I'll >> even modularize them like I have done for identical (e.g. property >> windows)) > > > I had a play with AnimateWindow earlier and this is definitely what > you want (I played with it in XS, not via the API - but the API way > should have no problems). I think this is what MSN/yahoo/Skype use to > get the notifications showing on the desktop. I did notice issues with > using a richtext control in the window that rolls up and down, but you > should be able to use a combination of other controls to achieve the > same effect. Using AnimateWindow doesn't give the window focus either:) > >> I know the this one is a stretch, and I suppose I could do the >> research myself if I had spare time recently, but what >> property/style/method is needed for me to graphics laden my program >> to the likes of Trillian/AdAware/etc? > > From a quick look of Trillian it looks like it is using a generic 3rd > party widget control set. Some of these control sets are open source > and simply need to be 'called'. A lot of the are ActiveX based, so > quite a bit of glue would be needed. > > If you are happy with XP-styles, then that is easy enough to do - > simply save the manifest file below in your Perl bin folder (for me > it's C:\Perl\bin) - the file must be called "perl.exe.manifest" (or > wperl.exe.manifest if you are using the consoleless version of perl). > Every time you run perl, all your controls will now be using XP styles. > > Cheers, > > jez. > --clip-- By the tooltips I meant the taskbar leaden ones taht perlTray uses, and the ones you always get when your AV hasn't updated in the "proper" time. Thanks for the tip on the XP styles, I will try that for sure. I know some of my users can't understand why it's not "pretty". I was really after the frist part of the answer though, which will obviously be a fair amount of research. Jason |
From: Robert M. <rm...@po...> - 2005-08-23 21:38:47
|
Jason P. wrote: > Jeremy White wrote: >>> Sometimes it fires the Activate, sometimes it doesnt...odd, and >>> annoying to have it grab the cursor away, if only for brief moments, >>> It can stop you typing at just the right time.. >> >> Very interesting example. I checked that the win32-gui show method is >> passing the correct parameters to the MS API function ShowWindow - and >> it is, so the problem is not there. The only thing I can think of is >> when you are manipulating the window one of the methods is somehow >> performing an implicit activate? From looking at the code both Move() and Resize() use SetWindowPos without setting SWP_NOACTIVATE, so both calls will result in the window being activated. (If I understand the interaction between not using SWP_NOACTIVATE and using SWP_NOZORDER, which isn't exactly clear) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp >> I came accross the AnimateWindow function: That's definitely the way to go from what I have read (although I have never used it) > It appears that it is being called when I reset the size and position > after hiding, and then again when the forced animation begins collapsing > it down. Activate is not called again while it is collapsing, but then > it already has active and focus while its doing this operation at high > speed. > > My thoughts are that it is somewhere doing this in the size and or > location algorithms. Both I believe. > While I have your ear regarding fancy features... Do you know of the > method to display those little Tooltip messages that windows uses? I'm not aware of perlTray (that you refer to in your other mail) - do you mean balloon tooltips? The ones that pop up looking like a speech balloon above the taskbar, sometimes with an icon in them? I seem to remember stumbling across some threads discussing this on the list - a search of the list archives might be in order? Regards, Rob. |