Click here to Skip to main content
Click here to Skip to main content

Locus Effects

By , 15 Feb 2006
 

Example 1:

Example 2:

Example 3:

Introduction

I was first introduced to the term "Locus" almost an year ago, when I attended a fascinating 2-day seminar with Prof. Jim Coplien on the subject of “Humane User Interfaces”. It was quite amazing to know that the design of user interfaces in software really hasn’t got that much attention and has a long way to go. Anyway, one of the key aspects in designing a good user interface is to understand how the human perception works. First of all, we humans have only one conscious (well, perhaps except for some lunatics ;)). In our mind, the thing that gets high conscious attention or most of our conscious attention is called the "Locus of attention".

Locus- Latin for "the place."

So our Locus is the place where our conscious/mind is set. It is the state of our mind. The Locus can change if an external event alarms our mind. For example: when we are reading a book, if a rapid ball of fire moves from right to left in the horizon, it is likely to catch our attention. This biological mechanism is built in us for survival. If a dangerous event happens, our mind pays attention to it since it is something that can kill us, harm us etc.

It is obvious that our Locus can be changed. This can be taken into consideration while designing a user interface that requires user’s attention. But usually it is misused or overly used; causing distracted user interfaces that makes us unproductive and tired. Modal forms attract our locus but since they are so repetitive and since they block our work we tend to click OK automatically and close these nags. Locus changes should be done as and when needed with great care and thought. If the locus changes for a brief time, our productivity is not harmed but after that we loose concentration in our previous task. Switching back to the previous task is quite slow and causes productivity problems.

Why do we need Locus Effects?

It is quite evident from the introduction and from daily experience that to change or attract a user’s attention we need to perform some sort of alarming event. This event can be a sound (clap your hands in a room and everyone will look at you), a visual effect (in the same room wave with a red handkerchief) or a physical sensation (somebody touching your shoulder while you are staring at VS.NET).

I want to provide in this article a means to perform visual Locus Effects (maybe in future I might write a version where the computer touches your shoulder ;)).

We need Locus Effects if we want to draw the user’s attention temporarily to some activity that is being done without harming productivity, while making this change pleasant.

A good example of an application that uses the concept of Locus Effects is shown in DevExpress’ CodeRush. This highly productive commercial VS.NET add-on uses a cool set of effects in order to draw your attention to changes. For example: After setting a bookmark (Alt+Home) if you go somewhere else in the file and click Esc, the cursor returns to the bookmark and shows the original cursor position using an effect that looks like a radar beacon.

Another example for a locus effect (again a beacon) is Microsoft's mouse pointer highlight feature - If you turn it on and press Ctrl a (not so nice..) beacon draws your attention to the current position of the mouse. (Control Panel/Mouse/Pointer Options/Show location of pointer..)

So Locus Effects can be used in different scenarios where setting the attention of the user can help in improving productivity. Sample scenarios:

  • Showing a position in a text editor (after find, find and replace, etc.).
  • Showing bookmarks in a text editor.
  • Showing a certain control that needs to be clicked.
  • Showing a validation error or warning on the form that needs user changes.

Using the framework (or, How do I show a Locus Effect?)

Using the LocusEffects framework is quite straightforward and easy. First, add the LocusEffectsProvider component to VS components toolbox by:

  1. Show tool box.
  2. Add/Remove Items....
  3. Browse and select the assembly BigMansStuff.LocusEffects.dll.
  4. Select the component: LocusEffectsProvider.
  5. Select OK.

Now drag and drop LocusEffectsProvider to your form, user control or component.

Initialization

Assuming we dragged a LocusEffectsProvider component and named it "locusEffectsProvider": In the load event handler, or in another initialization event, initialize the component by calling:

    locusEffectsProvider.Initialize();

Showing a predefined Locus Effect

If a certain predefined effect is good enough for the job and needs no customizations, simple show it by calling locusEffectsProvider.ShowLocusEffect. For example showing the predefined arrow Locus Effect:

    locusEffectsProvider.ShowLocusEffect( this, 
        this.RectangleToScreen( locusArea.Bounds ), 
        LocusEffectsProvider.DefaultLocusEffectArrow );

Customizations: Creating and showing a custom Locus Effect

If customization is needed, create an instance of a predefined Locus Effect class, change some of its properties and register it once (code snippets from test application showing creation of a custom curved arrow Locus Effect):

    private void InitializeLocusEffects()
    {
        locusEffectsProvider.Initialize() ;

        this.CreateCustomLocusEffects();
    }

    private void CreateCustomLocusEffects()
    {
        ResourceManager rm = new ResourceManager( 
            "BigMansStuff.TestLocusEffects.Images.CustomImages", 
            Assembly.GetExecutingAssembly() ) ;

        m_customArrowLocusEffect = new ArrowLocusEffect() ;
        m_customArrowLocusEffect.Name = "CustomArrow_Curved" ;
        m_customArrowLocusEffect.AnimationStartColor = Color.Red ;
        m_customArrowLocusEffect.AnimationEndColor = Color.Yellow ;
        m_customArrowLocusEffect.Bitmap = rm.GetObject( 
            "CustomCurvedArrowBitmap" ) as Bitmap ;
        locusEffectsProvider.AddLocusEffect( m_customArrowLocusEffect ) ;
    . . .
    }

Finally, use it as many times as needed:

locusEffectsProvider.ShowLocusEffect( this, 
    this.RectangleToScreen( locusArea.Bounds ), 
                         "CustomArrow_Curved" );

Extensions: Creating a new Locus Effect type

If none of the predefined Locus Effect classes are satisfactory even after customization of their styles, then a developer can choose to add a new type of effect that inherits from the framework classes. This is more complex (but not too complex) and requires knowledge of the framework internals as described below. But once the new class is ready, the usage pattern is identical to creating and using a predefined Locus Effect as shown above.

Locus Effects framework

Framework Internals

The framework is built from a few core classes. LocusEffectsProvider is the main component and provides a facade for managing and controlling locus effects. When ShowLocusEffect is called LocusEffectsProvider starts showing the Locus Effect by delegating the call to the registered Locus Effect instance:

    private void InternalShowLocusEffect( 
        Form activatorForm, 
        Rectangle locusScreenBounds, string locusEffectName)
    {
      BaseLocusEffect locusEffect = 
        m_registeredEffects[ locusEffectName ] as BaseLocusEffect;
      if ( locusEffect == null )
      {
          throw new ApplicationException( 
             string.Format( 
               "Could not show locus effect, 
                '{0}' is not registered", locusEffectName ));
      }

      this.InternalStopActiveLocusEffect();
      m_activeEffect = locusEffect ;
      locusEffect.ShowEffect(activatorForm, locusScreenBounds);
    }

which starts a new animation thread:

    public virtual void ShowEffect( Form activatorForm, 
        Rectangle locusScreenBounds )
    {
        lock ( this )
        {
            m_runTimeData = new EffectRuntimeData() ;
            this.SetInitialRunTimeData() ;

            m_runTimeData.ActivatorForm = activatorForm ;
            m_runTimeData.LocusScreenBounds = locusScreenBounds ;
    
            // Create and start animation thread
            m_runTimeData.AnimationThread = new System.Threading.Thread( 
                new System.Threading.ThreadStart( DoAnimation ) ) ;
            m_runTimeData.AnimationThread.IsBackground = true ;
            m_runTimeData.AnimationThread.Priority = 
                ThreadPriority.AboveNormal ;
            m_runTimeData.AnimationThread.Name = "ShowEffect_Thread" ;
            m_runTimeData.AnimationThread.Start() ; 
         }
    }
    protected virtual void DoAnimation()
    {
        try
        {
            m_owner.EffectWindow.SetEffect( this ) ;

            m_runTimeData.LastActivatorFormBounds =
                 m_runTimeData.ActivatorForm.Bounds ;
            m_runTimeData.StepMaxDuration = 1000.0f /
                 m_owner.FramesPerSecond ;

            this.SubscribeActivatorFormEvents();

            m_runTimeData.IsAnimating = true ;
            try
            {
                 // Do the actual animation of the effect
                 this.AnimateEffect() ;
            }
            finally
            {
                this.CleanUpEffect() ;
            }
         . . .
     }

So far, nothing exotic, but now we get to the fun stuff. BaseStandardEffect implements a standard effect, which is a normal sequence built up of Lead in, Body and Lead out animation stages. In each stage of the sequence there is a time duration. During the animation an accurate progress (step) is calculated based on the time. This is done in OnLeadInStep, OnAnimationBodyStep and OnLeadOutStep. The effect has paint methods for each stage that take the step progress into account and draw (i.e. render) the effect into an effect bitmap - PaintLeadIn, PaintBodyAnimation and PaintLeadOut.

    protected override void AnimateEffect()
    {
        IntPtr activeWindowHandle = Win32NativeMethods.GetForegroundWindow();

        // Set initial bitmap
        m_animationStep = 0 ;
        using ( Graphics g = 
            Graphics.FromImage( m_runTimeData.EffectBitmap ) )
        {
            PaintLeadIn( g ) ;
        }

        // Move form out of visible area before showing it -
        //  We don't want the last bitmap
        m_owner.EffectWindow.ShowOutOfScreen() ;

        m_owner.EffectWindow.ApplyGraphics() ;
        
        Win32NativeMethods.SetForegroundWindow( activeWindowHandle ) ;
            
        m_startTime = DateTime.Now ;
        
        // Heart of a standard effect: (Lead in, body, lead out sequence)

        // 1. Lead in
        if ( m_leadInTime > 0 )
        {
            this.LeadIn() ;
        }

        // 2. Then, do some animation (body)
        if ( m_animationTime > 0 )
        {
            this.AnimateBody() ;
        }

        // 3. Finally, lead out
        if ( m_leadOutTime > 0 )
        {
            this.LeadOut() ;    
        }
    }

m_owner is an instance of the LocusEffectsProvider component, which owns an EffectWindow window. This special window is what makes the animation rock and roll. It is a per pixel alpha window or a layered window. Layered windows were first introduced in Windows 2000 and provide full support for RGBA bitmaps and transparency. They do not work via the regular WM_PAINT mechanism and are updated by setting a new bitmap to them each time an update is needed. This is in contrast to normal windows which have regions and work through WM_PAINT messages. So EffectWindow is a layered window which has features such as anchoring (i.e. setting the direction of the bitmap in relation to the locus area), bitmap manipulation (rotation, transparency control , shadow, color overlay). Each time a paint is triggered from the animation thread, the ApplyGraphics method of EffectWindow is called. This is how we update the bitmap of the window with the new rendered effect bitmap. CalculateBitmapBounds takes care of moving the effect bitmap to the correct position using anchoring mode rules. SetWindowBitmap does the actual Windows API call that sets the new effect bitmap on the layered window.

        protected virtual void AnimateBody()
        {
            m_startAnimationTime = DateTime.Now ;

            TimeSpan duration ;

            DateTime stepStartTime ;
            while ( m_runTimeData != null && !m_runTimeData.StopRequested )
            {
                stepStartTime = DateTime.Now ;
                
                this.OnAnimationBodyStep() ;

                using ( Graphics g = Graphics.FromImage(
                           m_runTimeData.EffectBitmap ) )
                {
                    PaintBodyAnimation( g ) ;
                }

                m_owner.EffectWindow.ApplyGraphics() ;

                duration = ( DateTime.Now - m_startAnimationTime ) ;
                if ( duration.TotalMilliseconds >= m_animationTime )
                {
                    // Force draw of last position
                    m_animationStep = 100.0f ;
                    using ( Graphics g = Graphics.FromImage( 
                         m_runTimeData.EffectBitmap ) )
                    {
                        PaintBodyAnimation( g ) ;
                    }

                    m_owner.EffectWindow.ApplyGraphics() ;

                    break ;
                }
                else
                {
                    TimeSpan stepDuration = ( DateTime.Now - stepStartTime ) ;

                    // Allow the processor to rest - we don't want the 
                    //   animation thread to work all the time
                    if ( stepDuration.TotalMilliseconds < 
                            m_runTimeData.StepMaxDuration )
                    {
                        System.Threading.Thread.Sleep( 
                             ( int ) ( m_runTimeData.StepMaxDuration - 
                                       stepDuration.TotalMilliseconds ) ) ;
                    }
                }
            }
        }

ApplyGraphics- it's painting time!

        public virtual void ApplyGraphics()
        {
            using ( Bitmap finalBitmap = new Bitmap( m_effect.EffectBitmap ))
            {
                    
                // Calculate bounds of effect bitmap
                this.CalculateBitmapBounds( finalBitmap, 
                     m_effect.LocusScreenBounds ) ;

                // Handle anchoring logic of effect bitmap
                this.HandleEffectBitmapAnchoring( finalBitmap ) ;

                Size backBitmapSize = finalBitmap.Size ;

                // Extend back bitmap size so it has space for the shadow
                if ( m_effect.ShowShadow )
                {
                    backBitmapSize.Width += Math.Abs( 
                        m_effect.ShadowOffset.X ) ;
                    backBitmapSize.Height += Math.Abs( 
                        m_effect.ShadowOffset.Y ) ;
                }

                bool bitmapsRecreated = false ;

                // Re-create back bitmap size
                if ( backBitmapSize != m_backBitmapSize )
                {
                    this.RecreateBitmaps( backBitmapSize ) ;

                    bitmapsRecreated = true ;
                }

                // Note: FromHdc is very important as it hooks to 
                //   the DIB Section (Back bitmap) in the memory DC 
                //   directly, without creating an intermediate buffer
                // Thank you Lou Amadio for helping out here!

                // Draw effect bitmap and its shadow on back bitmap
                using ( Graphics g = Graphics.FromHdc( m_memDC ) )
                {
                    g.SmoothingMode = SmoothingMode.HighQuality ;

                    // Clear the back bitmap
                    if ( !bitmapsRecreated )
                    {
                        g.Clear( Color.Transparent ) ;
                    }

                    // Draw shadow before final bitmap is drawn
                    this.DrawShadow( finalBitmap, g ) ;

                    // Draw final effect bitmap
                    g.DrawImage( finalBitmap, 
                        0, 
                        0,
                        m_bitmapSize.Width, 
                        m_bitmapSize.Height ) ;
                }

                // Render bitmap to window 
                this.SetWindowBitmap( m_effect.RunTimeData.Opacity ) ;
            }
        }

and finally, the bitmap is rendered to the layered window:

        protected virtual void SetWindowBitmap( int opacity ) 
        {    
            // Calculate coordinates
            Win32NativeMethods.Point pointMemory = new 
                Win32NativeMethods.Point( 0, 0 ) ;
            Win32NativeMethods.Point pointScreen = new 
                Win32NativeMethods.Point( 
                    m_bitmapLocation.X, m_bitmapLocation.Y ) ;
            Win32NativeMethods.Size size = new Win32NativeMethods.Size(
                m_backBitmapSize.Width, m_backBitmapSize.Height ) ;

            // Create blending function
            Win32NativeMethods.BLENDFUNCTION blend = new 
                Win32NativeMethods.BLENDFUNCTION() ;
            blend.BlendOp             = Win32Constants.AC_SRC_OVER  ;
            blend.BlendFlags          = 0 ;
            blend.SourceConstantAlpha = ( byte ) ( opacity * 255 / 100 ) ;
            blend.AlphaFormat         = Win32Constants.AC_SRC_ALPHA ;

            // Render the layered window, by supplying it a memory DC 
            //    which contains updated LocusEffect bitmap
            Win32NativeMethods.UpdateLayeredWindow( 
                this.Handle, 
                m_screenDC, ref pointScreen, ref size, 
                m_memDC, ref pointMemory, 0, 
                ref blend, 
                Win32Constants.ULW_ALPHA ) ;
        }

Things to note

  • EffectWindow inherits from a LayeredWindow class which inherits from NativeWindow. Inheritance from System.Windows.Forms.Form class is not a good idea since all sorts of problems occur. In particular a nasty parking window is created per thread(!). Also a native window is faster and has much less footprint and negative side effects caused by default .NET implementation. We do not need all the complexities of full message support.
  • ImageBlender was extended from its original source code so it supports RGBA bitmaps.
  • Concrete effect classes can override AnimateEffect and provide their own concrete implementation.

Documentation

The framework is quite heavily documented, and I used NDoc to generated a compiled HTML file (LocusEffects.chm) which is provided with the project and includes documentation for each class, its methods and properties.

Predefined effects

Arrow effect

(LocusEffectsProvider.DefaultLocusEffectArrow or "DefaultArrow")

Beacon effect

(LocusEffectsProvider.DefaultLocusEffectBeaconor "DefaultBeacon")

Bitmap effect

(LocusEffectsProvider.DefaultLocusEffectBitmap or "DefaultBitmap")

Text effect

(LocusEffectsProvider.DefaultLocusEffectText or "DefaultText")

Things I have learned

Performance

  • Performance in GDI+, .NET and Windows Forms can be very slow. GDI+ itself is slower than GDI, and is (currently) not accelerated by graphics cards. All the processing is done in CPU time. Windows Forms is a very productive wrapper around Win API but it is heavy and has a lot of implementation issues which are slow, because the framework is generic. One specific thing to note is the usage of Bitmaps. Bitmaps in Win Forms are wrappers to GDI+ Bitmaps. This is all OK, however when you try to move from a GDI+ Bitmap to a regular GDI Bitmap you need a handle (HBITMAP). Calling GetHBitmap() is going to work but with a heavy price. The image is copied to a new GDI Bitmap and then the handle is returned to that new GDI bitmap. This is slow. Add to this a call of SelectObject into the Device Context each time, and it is slow too. Finally, UpdateLayeredWindow is also slow by nature. (See MSDN help about it.)

    So what I have done (using Lou Amadio's help) is I have created a DIBSection manually, and selected it into the Device Context once. Now when I render the bitmap in ApplyGraphics I use Graphics.FromHDC(). This API is fast because GDI+ detects that the Device Context is attached to a DIBSection underneath and it uses directly without an intermediate buffer. Using Graphics.FromBitmap() is slow as it creates an intermediate buffer! Beware!

  • Layered Windows - These cool creatures are nice but slow. Empiric tests show that bitmaps over 300x300 start to clog your CPU. So it does not mean that large Locus Effects cannot be used, but there is a small price to it. Until Microsoft does not improve that API to make it much faster, there is nothing that can be done on that subject. Luckily most Locus Effects are smaller than this size, so there is no big problem.

What's next...

Depending on the feedback from users and my spare time, I would like to add the following things in future revisions:

  • More Locus effects - Basic Text (Done), Advanced Text, Moving/Bouncing arrows (Done), Highlighted text markers.
  • A visual properties designer for allowing easy customizations of Locus effects at design time.
  • Animated GIF and PNG.
  • 3D - OpenGL??.
  • Your ideas and improvements.

Conclusion

This is my first article – I’ve been a CodeProject member for a long time, but finally I found the idea, time (and guts...) to write my own article and contribute something back to this really great community. The idea in this article is not new, but when I looked for such an implementation in the web (CodeProject too) there was nothing that was ready, so I decided to write it. There are no limits to imagination and new cool effects and ideas can be added easily to the framework.

The project is written in VS.NET 2003, I have not provided solutions for the older VS.NET format, but it should work on the older VS.NET with minor modifications. VS.NET 2005 (Beta 2) was tested and works fine. Also notice that the APIs used here require Windows 2000 and above. It will not work on Win9X, WinNT! These old operating systems do not support Layered Windows.

If anyone extends the framework and adds new effects, please send me the extension so that I can make it a part of the next version of the framework. Oh, and if you like it, use it, if you have any ideas on how to improve it or just have any comment - please tell me.

Philosophical insights from this article :)

  • Beware: Writing a CodeProject article is addictive! I am not kidding. It's like reading a book. Once you start it you cannot stop it. But it is a lot of fun.
  • It is so addictive that I am already thinking of my next article (Oh, my wife is going to kill me..).

Revisions

  • 1.0.0 - 3/7/2005: Initial
  • 1.0.1 - 7/7/2005
    • Fixed: Effects were not shown on non primary monitors in a multiple monitor configuration.
    • Fixed: Dynamically handle changes in monitor positions and resolutions.
    • Changed: Demo application layout changed.
    • Changed: Search example in demo application uses selected Locus Effect.
    • Changed: Memory allocation - Back bitmap is allocated just-in-time and disposed when the effect stops.
  • 1.0.2 - 18/7/2005
    • Added: Example - Search state in map.
    • Added: Text effects
    • Added: Movement mode (See Robin Hood arrow, Bulb in Demo)
    • Added: FramesPerSecond property
    • Added: Component toolbox bitmap
    • Fixed: Major Performance boost:

      * DIBSection is used as back bitmap instead of a regular Bitmap. This provides much better performance and allows future enhancements (filters, etc.).

      * Variable back bitmap size logic is used instead of a big static back bitmap.

    • Fixed: Behavior - animations are smoother, thread sleep is now calculated dynamically. Animation thread pump is now using the FramesPerSecond logic and allows a variable sleep time.
    • Fixed: LayeredWindow was activated when it was clicked. Now it is transparent to clicks.
    • Fixed: Effect was not stopped when another window was activated.
  • 1.0.3 - 15/02/2006
    • Added: AnimatedImage locus effect.
    • Improved: Documentation.

References and credits

Also, special thanks to my good friends Ofir Oren and Achi Hackmon for their assistance, QA and for being a feedback wall! :)

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Yuval Naveh
Chief Technology Officer Exzac Inc.
United States United States
Member
I've been punching code since the age of 9 when I got my first computer - A Sinclair Spectrum with 48Kb of RAM!
That was a great time, when peek and pokes were the way to do stuff.
Along the way I moved on to PC and never left it (EDIT: Since 2010 a false statement - I fell in love with Android).
I wrote in X86 Assembly, Logo Wink | ;) , Basic, C, C++, Pascal, Delphi, Java and in the last 10 years C#.
 
I am also an amature photographer using Nikon D100, and taking pictures mostly of scenary & nature.
Some of my pictures are presented at:
My photo gallery
(Titles are in Hebrew, but pictures have an international language.. Smile | :) )
 
My linked in profile:
http://www.linkedin.com/in/YuvalNaveh

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
Questiondemanding simple codemembershaikh-adil22 Nov '12 - 6:35 
i found your code simple and usefull but i am facing difficulty in implementing your logic as your code is not for beginers. i am a newbie and not much familiar to c sharp. can you make a simple code which contains a textbox and a arrow animation. you sample project is to heavy to understand.
please sir,
i want your this technique to be used in my project
Smile | :)
AnswerRe: demanding simple codememberYuval Naveh22 Nov '12 - 6:40 
I'm not really sure what you are trying to do and unfortunately I cannot teach the basics of C# over this article.
The demo project has really simple C# code.
Using a locus effect in your projects requires only a few lines of code.
 
For example:
 locusEffectsProvider.Initialize();
 locusEffectsProvider.ShowLocusEffect( this, .RectangleToScreen( locusArea.Bounds ), LocusEffectsProvider.DefaultLocusEffectArrow );
 
Good luck,
Yuval
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: demanding simple codemembershaikh-adil24 Nov '12 - 20:06 
if i want same effect toward a textbox in a windows form what can i do??
can you write the simple guidelines plz?
i just have to write the simple three lines?
GeneralRe: demanding simple codememberYuval Naveh27 Nov '12 - 11:09 
Download the demo, analyze and look at the sources, and it is right there - I have an example of pointing an effect to a text box.
Good luck
Yuval
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

QuestionPossible to show a locus effect without any window?sitebuilderUwe Keim18 Jun '12 - 1:35 
I want to show a locus effect after the last window of my application has closed.
 
Currently, I get no locus effect being show.
 
My question is:
 
Ist it possible to show a locus effect right on the desktop without any active form?
Wollen Sie ganz einfach Ihre eigene Homepage erstellen, ohne HTML-Kenntnisse, einfach, professionell und mit viel Freude? Probieren Sie unser Desktop Content Management System (CMS) Zeta Producer für Windows aus. Komplett mit eigenem Shop, Gästebuch, Weblog, Bildergalerien, Integration von YouTube-Videos. Wir haben eine aktive Anwender-Community, schnellen Support, sympathische Support-Mitarbeiter.

AnswerRe: Possible to show a locus effect without any window?memberYuval Naveh18 Jun '12 - 15:43 
I'm really not sure what you're trying to do.
If the last window of the application has closed, then the application is finished. In that case the process dies - If you need to run 'post mortem' locus effects, then another process is needed (=spawned) before the original app dies, in order handle that.
In principle, Locus Effects can point to any point in the screen - but it does need an activator form.
So you can create a small windows app that has a hidden window and let Locus Effects run of it.
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Possible to show a locus effect without any window?sitebuilderUwe Keim18 Jun '12 - 17:42 
Thanks, Yuval
 
I want to have my app (Zeta Uploader Windows Client [^]) that uploads a file to a server, to show a short notification at the end of the process, after the upload finished (and before the upload window is being destroyed, but after it becomes hidden).
 
Since the app could run for several minutes and might very well be in the background, behind other apps, my idea was to show a locus effect with a text "Upload finished, URL copied to clipboard" as a topmost message.
 
Not sure whether this works, what I remember from looking at your sources (IIRC) is that the locus effect is hidden when the owning window is not in the foreground.
Wollen Sie ganz einfach Ihre eigene Homepage erstellen, ohne HTML-Kenntnisse, einfach, professionell und mit viel Freude? Probieren Sie unser Desktop Content Management System (CMS) Zeta Producer für Windows aus. Komplett mit eigenem Shop, Gästebuch, Weblog, Bildergalerien, Integration von YouTube-Videos. Wir haben eine aktive Anwender-Community, schnellen Support, sympathische Support-Mitarbeiter.

GeneralRe: Possible to show a locus effect without any window?memberYuval Naveh19 Jun '12 - 17:17 
Uwe,
Currently an activator form is needed.
I have no bandwidth to change it now, but will try to see if I can remove that requirement (and make it an option).
It may take a few days until I get to it.
OR - you can try and do it your self.
 
Thanks,
Yuval
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Possible to show a locus effect without any window?sitebuilderUwe Keim19 Jun '12 - 18:23 
Thanks a lot, Yuval
 
This is really a low low low priority for me. If you ever find the time I would be very gladful, or I'll take a look some hours in one of the following weekends.
 
Cheers
Uwe
Wollen Sie ganz einfach Ihre eigene Homepage erstellen, ohne HTML-Kenntnisse, einfach, professionell und mit viel Freude? Probieren Sie unser Desktop Content Management System (CMS) Zeta Producer für Windows aus. Komplett mit eigenem Shop, Gästebuch, Weblog, Bildergalerien, Integration von YouTube-Videos. Wir haben eine aktive Anwender-Community, schnellen Support, sympathische Support-Mitarbeiter.

GeneralRe: Possible to show a locus effect without any window?memberYuval Naveh26 Jun '12 - 17:32 
Please get the latest version from Google Code, and let me know if it works for you or not.
For activatorForm simply pass null.
The test application tests that in the 'Show' with absolute screen coordinates, under Misc tab
 
http://code.google.com/p/locus-effects/[^]
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Possible to show a locus effect without any window?sitebuilderUwe Keim26 Jun '12 - 19:52 
Thank you, Yuval!
 
Since I want to show an effect after the main windows is being closed, I tried to modify your example application with something based on your function
private void showScreenButton_Click( object sender, EventArgs e )
So I ended up with:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    Hide();
 
    var x = 100;
    var y = 100;
    var locusRect = new Rectangle(x, y, 1, 1);
 
    // Show the selected locus effect
    locusEffectsProvider.ShowLocusEffect(null, locusRect, m_activeLocusEffectName);
 
    Thread.Sleep(2000);
}
It seems that this is not working, i.e. nothing is shown on the screen. I also tried to debug into it, but found nothing I could get a reason out.
 
Next I tried to not hook the Closing event but explicitely bind it to a button:
private void button1_Click(object sender, EventArgs e)
{
    Hide();
 
    var x = 100;
    var y = 100;
    var locusRect = new Rectangle(x, y, 1, 1);
 
    // Show the selected locus effect
    locusEffectsProvider.ShowLocusEffect(null, locusRect, m_activeLocusEffectName);
 
    Thread.Sleep(2000);
    Close();
}
This does not show anything, just a short flickering effect, after the 2000 ms timer expires.
 
Any ideas on whether it is possible at all to get an effect with no visible window of my application?
Wollen Sie ganz einfach Ihre eigene Homepage erstellen, ohne HTML-Kenntnisse, einfach, professionell und mit viel Freude? Probieren Sie unser Desktop Content Management System (CMS) Zeta Producer für Windows aus. Komplett mit eigenem Shop, Gästebuch, Weblog, Bildergalerien, Integration von YouTube-Videos. Wir haben eine aktive Anwender-Community, schnellen Support, sympathische Support-Mitarbeiter.

GeneralRe: Possible to show a locus effect without any window? [modified]memberYuval Naveh27 Jun '12 - 17:08 
I just tested this code, works fine:
private void hideButton_Click(object sender, EventArgs e)
{
    Hide();
    int x = Convert.ToInt32(xTextBox.Text);
    int y = Convert.ToInt32(yTextBox.Text);
    System.Drawing.Rectangle locusRect = new Rectangle(x, y, 1, 1);
 
    // Show the selected locus effect
    locusEffectsProvider.ShowLocusEffect(null, locusRect, m_activeLocusEffectName);
 
    for (int i = 0; i < 400; i++)
    {
        System.Threading.Thread.Sleep(5);
        Application.DoEvents();
    }
    this.Close();
}
 
A long sleep is not good as you're are putting the main UI thread to sleep. What I wrote is a busy loop which forces the message pump to work (by calling Application.DoEvents) but still does not make the CPU work 100% of the time. Locus effects is after all a window that needs that message pump to work.
 
I checked-in the revised code to Google Code.
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein


modified 27 Jun '12 - 23:51.

GeneralRe: Possible to show a locus effect without any window?sitebuilderUwe Keim27 Jun '12 - 17:45 
Thanks Yuval, that makes sense, I've overseen that message loop thing.
 
I'll try out immediately Smile | :)
Wollen Sie ganz einfach Ihre eigene Homepage erstellen, ohne HTML-Kenntnisse, einfach, professionell und mit viel Freude? Probieren Sie unser Desktop Content Management System (CMS) Zeta Producer für Windows aus. Komplett mit eigenem Shop, Gästebuch, Weblog, Bildergalerien, Integration von YouTube-Videos. Wir haben eine aktive Anwender-Community, schnellen Support, sympathische Support-Mitarbeiter.

GeneralMy vote of 5membermanoj kumar choubey26 Feb '12 - 21:18 
Nice
QuestionAmazing work - Can you create it in wpf?membershgil4 Aug '11 - 6:03 
Are you planning to create a wpf library as well?
AnswerRe: Amazing work - Can you create it in wpf?memberYuval Naveh4 Aug '11 - 10:38 
Hi,
Thanks - Glad to see you like it.
 
Unfortunately, I do not have spare time to re-create Locus Effects in WPF..sorry.
Maybe one day.
 
Cheers
Yuval
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

Questionwhat code change was required for fixing the effects not showing on non-primary monitor?memberblast22 Dec '09 - 11:19 
Yuval Naveh wrote an article on Locus effects. At the bottom there was a revision list and one revision stated that a fix was made for effects not showing on non-primary monitors in a mutliple monitor configuration.
 
I'm having the same trouble with a project I'm working on and so I was wondering what the code change was in Yuval's project that fixed the problem for him?
 
thanks very much for your contribution!
Fritz
AnswerRe: what code change was required for fixing the effects not showing on non-primary monitor?memberYuval Naveh22 Dec '09 - 14:01 
Fritz,
 
The code changes are in the code already.
I tested it on multi monitors and it worked fine.
What kind of problems are you experiencing?
 
(The latest code is in Google Code)
 
Thanks
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: what code change was required for fixing the effects not showing on non-primary monitor?memberblast22 Dec '09 - 16:27 
Thanks Yuval for your reply. I'm not having trouble with your project, just wondering what changes you made to get it to work on multiple monitors since I have an unrelated project that's experiencing the same kind of problem (drawing an image via gdi and using UpdateLayeredWindow on an XP pro machine with 2 monitors works on the primary monitor but doesn't show up on the secondary one). So I thought if I knew what differences there were for your project to fix that problem I might learn from it.
 
regards,
Fritz
GeneralRe: what code change was required for fixing the effects not showing on non-primary monitor?memberYuval Naveh22 Dec '09 - 17:13 
Hi Fritz,
 
First, I'm glad to share information between projects.
Second, it is a relief to know the Locus Effects does not have a bug Big Grin | :-D
 
As for your question:
I think the way I handled it was to use Screen.FromPoint & SystemInformation.VirtualScreen.
If you look at EffectWindow.CalculateBitmapBounds you will see the framework's calculation of where to position the effect.
 
                // North
                if ( locusScreenBounds.Top - newSize.Height <= SystemInformation.VirtualScreen.Top )
                {
                    newLocation.Y = locusScreenBounds.Bottom;
 
                    south = false;
                }
 
...
 
            else if ( m_effect.AnchoringMode == AnchoringMode.CenterMonitor )
            {
                // Get monitor from point
                Screen screen = Screen.FromPoint( new Point(
                    locusScreenBounds.Left + locusScreenBounds.Width / 2,
                    locusScreenBounds.Top + locusScreenBounds.Height / 2 ) );
 
                // Calculate monitor center
                newLocation.X = screen.WorkingArea.Left + ( screen.WorkingArea.Width - newSize.Width ) / 2;
                newLocation.Y = screen.WorkingArea.Top + ( screen.WorkingArea.Height - newSize.Height ) / 2;
            }
 
Good luck,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: what code change was required for fixing the effects not showing on non-primary monitor?memberblast22 Dec '09 - 18:48 
lol, yeah, I'm glad I didn't find a bug for you either. Actually your project is a bit complicated for me right now but it's a good learning experience because I've not used C# before, so I was just trying to find the piece that hopefully made the difference. I really appreciate you getting back to me so fast as I've been stuck on this for a while now. Hopefully I'll figure this out tonight with this input.
 
Cheers, and happy holidays!
 
By the way, I checked out a few of your photos (I'm a photographer myself on the side with a B&W darkroom at home)--nice!
 
Thanks again for sharing your work.
 
Fritz
AnswerRe: what code change was required for fixing the effects not showing on non-primary monitor?memberblast22 Dec '09 - 19:25 
yeay! found my problem. I was making a call to CreateCompatible bitmap with a size that was too small. I figured it out by playing with values in my project after looking at what values you were passing to UpdateLayeredWindow in the debugger. I'll probably look at your code in more detail when I get around to making it faster.
 
I think this article is great from a human factors perspective too. I went back to get my masters in human factors (finished in early 2008), but there's always more to learn. thanks again for your post--great work!
NewsImportant Announcement: License changed to LGPLmemberYuval Naveh5 Nov '09 - 15:47 
Hello dear users,
 
Following a very good suggestion from one of the users, John Hatton, I have decided to change the license to LGPL.
 
The code with new license can be found in GoogleCode:
http://code.google.com/p/locus-effects/[^]
 
Thanks,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

NewsImportant Announcement: Version 2.0 has been checked in into Google CodememberYuval Naveh19 Apr '09 - 15:18 
The new version is under Trunk.
 
Version 1.0 is under Branches/V1. It contains the original CodeProject code (VS.2003) + an exception fix found by one of the users) .
 
I tested it and it seems to be working just fine, but please let me know if there are any issues.
 
Thanks,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

QuestionRe: Important Announcement: Version 2.0 has been checked in into Google Codememberhattonjohn27 Apr '09 - 20:19 
So very happy to see you do that. Thanks. The lack of an ongoing, version-controlled project is in my opinion the weakest aspect of Code Project. It encourages us all to fork and not give back. It means, in the end, that the .net open source environment is weaker than some other platforms.
 
May I request that you reconsider the license you put on the google code version? By making it GPL, you put your great work off limits from any project which cannot, itself, be GPL. All my work (e.g. wesay.org) is open-source, but we need to stay with more permissive licenses, otherwise we shut the door to ever including a commercial component, ever.
 
Thanks for considering this.
AnswerRe: Important Announcement: Version 2.0 has been checked in into Google Code [modified]memberYuval Naveh28 Apr '09 - 1:36 
I totally agree about Code Project weakness point.
But this combination of Google Code could work out well. Code Project for article, Google Code for code.
 
As for GPL license - sure, I'm all open to that and it could be changed quickly.
 
[Edit] Looking into LGPL right now.
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein
modified on Tuesday, April 28, 2009 8:45 PM

AnswerRe: Important Announcement: Version 2.0 has been checked in into Google CodememberYuval Naveh5 Nov '09 - 15:49 
Hi John,
 
Following your suggestion the license has been changed to LPGL - please see announcement above.
 
Thanks,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Important Announcement: Version 2.0 has been checked in into Google CodememberL Khnh Thnh5 Nov '09 - 14:35 
Hi Yuval,
 
I love your locus effect framework and suggest some new features:
 
- Allow showing (ShowLocusEffect function)the locus only one time at beginning with supporting automatically loop
- Support ShowLocus for Control (not Form in this function), such as ShowLocusEffectControl(Control activatorControl, Rectangle locusScreenBounds). This doesn't require absolute coordinates (screen coordinates), only control's coordinates
- Allow manually setting position for the locus
 
Hopefully, you will consider and add the new features
 
Thanks you so much !
 
Keep up the good workd,
 
modified on Thursday, November 5, 2009 8:42 PM

GeneralRe: Important Announcement: Version 2.0 has been checked in into Google CodememberYuval Naveh5 Nov '09 - 15:38 
Hi,
 
Thanks for the feedback! Thumbs Up | :thumbsup:
 
As for the suggestions you raised:
1. I don't quite understand this suggestion. Could you please elaborate or give an example?
The locus effect shows only one time, how does the loop work with that requirement?
2. This is a very good suggestion - It is already possible to do it today, though it does require some extra work.
So I decided to add this functionality as a helper function which will accept two parameters - the control and the locus effect name. The effect will point to the center of the control (I might add an optional enumeration to allow control on the position inside the control - e.g. TopLeft, Center, etc.)
 
public void ShowLocusEffect(Control locusControl, string locusEffectName);
 
3. Manual positioning of the locus effect was possible since day 1.
If you look at the example tab in the demo application, you will see a test case that shows manual positioning of the locus effects, but here is the code of that sample to make it easier for you to understand:
 
        private void showScreenButton_Click( object sender, EventArgs e )
        {
            int x = Convert.ToInt32( xTextBox.Text );
            int y = Convert.ToInt32( yTextBox.Text );
            System.Drawing.Rectangle locusRect = new Rectangle( x, y, 1, 1 );
 
            // Show the selected locus effect
            locusEffectsProvider.ShowLocusEffect( this, locusRect, m_activeLocusEffectName );
        }
 
Important note: All code changes will be committed to the GoogleCode repository. I am no longer uploading code to CodeProject as it has become too hard to maintain - SVN is much easier and can be done at any time.
Look at: http://code.google.com/p/locus-effects/[^]
 
Thanks!
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Important Announcement: Version 2.0 has been checked in into Google Code [modified]memberL Khnh Thnh5 Nov '09 - 21:57 
Awesome, you have replied me, thanks
 
- In the first 'new feature' i have suggested, i mean,the locus can automatically loop until we stop it.
After we call, locusEffectProvider.ShowLocusEffect(...), then the locus effect will automatically check when animation stops, it will automatically start again (that is my LOOP) until we call the stop function (PLEASE SUUPORT !!!)
 
- In the second 'new feature', i mean, we can display the locus effect with local coordinate of control, such as, a panel with: width = 100, height = 100 then we can display the locus effect at pair of coordinates (x,y with x = 0 to 99 and y = 0 to 99). So I need a function like: ShowLocusEffect(Control activatorControl, int coordX, int coordY, string name);
where coordX and coordY is coordinates on Control
 
in the function you updated:
public void ShowLocusEffect(Control locusControl, string locusEffectName);
 
What happen if locusControl lies on a pane1, panel1 lies on a panel2, panel2 lies on a tab....
 
One more feature: smoothing efect !!! Big Grin | :-D
 
I have a question, i have picture box on form, how can I display the locus effect at pixel coordinates of image in picture box ?
 
Thank you so much for the locus effect !
 
Btw, The locus effect should open a showcase page ?
 
modified on Friday, November 6, 2009 4:04 AM

GeneralRe: Important Announcement: Version 2.0 has been checked in into Google CodememberYuval Naveh6 Nov '09 - 4:25 
OK - I see that you are full of enthusiasm, which is great.
 
So:
1. You don't need to run in a loop like you are doing it today. The easiest way is simply to use the AnimationTime property and set it to what ever you want (Very big number will be infinite practically)
  m_customTimedLocusEffect.AnimationTime = int.Parse(animationLengthTextBox.Text);
  locusEffectsProvider.ShowLocusEffect(demoControl, "CustomTimed");
 
2. Will implement offset, but later. Pretty swamped right now. I'll reply to this thread once I'm done, so you'll get a notification.
 
3. Smoothing effect - what do you mean? Can you give an example? Fade In and Fade Out are implemented already.
 
4. Picture Box or any other control - you need to convert the control coordinates to screen coordinates using the Control.PointToScreen method. This also is the reason why the panel1/panel2 scenario example you gave will work - .NET knows how to take care of this hierarchy properly.
 
Be sure to take the latest version from Google Code.
 
Thanks
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Important Announcement: Version 2.0 has been checked in into Google CodememberL Khnh Thnh6 Nov '09 - 14:43 
" m_customTimedLocusEffect.AnimationTime = int.Parse(animationLengthTextBox.Text)"
 
This is only the time from start to stop of one cycle, the locus effect doesn't automatically start again when it stops !
I mean, we don't need to cal ShowLocusEffect again after we call it yet
NewsImportant Announcement: Google Code project created for Locus EffectsmemberYuval Naveh19 Apr '09 - 1:46 
http://code.google.com/p/locus-effects/
 
The main reason behind this is to have Subversion source control & issue tracking.
The article remains here in Code Project and will be updated from time to time, if needed.
 
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

QuestionHow to showingTextLocusEffect :)membercatlikemice11 Mar '09 - 22:13 
Dim efText As New BigMansStuff.LocusEffects.TextLocusEffect
efText.Text = "Hellow world !"
Me.LocusEffectsProvider.ShowLocusEffect(Me, screenP, efText)
========================================
It didn't work.
AnswerRe: How to showingTextLocusEffect :)memberYuval Naveh12 Mar '09 - 14:18 
Hi,
 
Did you initialize the framework?
 
locusEffectsProvider.Initialize();
 
What exactly doesn't work?
Is there an error? If so what is the error you get?
 
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: How to showingTextLocusEffect :)membercatlikemice25 Mar '09 - 22:55 
Carefully Read your Example ,i get it.
 
by the way ,do the TextEffect surpport multiline text?
GeneralRe: How to showingTextLocusEffect :)memberYuval Naveh17 Apr '09 - 16:18 
Sorry about the late answer - missed the question.
Yes: there is multi-line text support.
If you look at the demo application, there is a radio button 'Full Screen Text'.
Use it and you should see a two line message 'Operation Cancelled!' across the screen.
 
HTH,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralThat's greatest work!membercatlikemice26 Jul '08 - 2:56 
Smile | :) hi ,you make a elegant Artefact
GeneralRe: That's greatest work!memberYuval Naveh26 Jul '08 - 3:04 
Thanks! Blush | :O
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralA great thing for the user interface worldmemberMystcreater8 Nov '07 - 17:47 
I have search for a long time on the Internet for code that mimic the beautiful visual effect of Code Rush like in the example that you talk on the introduction. The visual effect that you have created was a great work... lot of time to program I'm sure and I have no other word to say except: WOW!!!
 
I'll don't ask you when you will enhance this component because I'm sure that it take lot of brain to create this nice result but with your permission, I will print this article and read it with the company of your code to etablish a strategy to integrate this to my application. I'm not sure if it's a good idea to add to much visual effect to an application but I love the concept of "Locus". A term that I have search for a long time ago...
 
Thank you again. Great work.
GeneralRe: A great thing for the user interface worldmemberYuval Naveh9 Nov '07 - 1:26 
Thank you for your appreciation.
You are more than welcome to do whatever comes up to your mind with Locus Effects.
Read the license which is in every source file, on top.
 
My view on usage of this component is simple: It has to be done when appropriate. When overdone (i.e. Locus Effect in every corner of the application) the concept might be missed altogether to produce UI which can be distracting to the user.
 
Yuval
 
P.S. About upgrades - I am really sorry, but I am totally out of time (Work, Family, Studies..) and releasing an untested version is something I will not do. Version 1.0 is stable and working just fine.
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

QuestionLocus Effect 2.0 ?memberJulien Ferraro7 Sep '07 - 0:44 
Hello,
 
This library is great. You're talking about the next version since a few months.
Do you think we'll be able to see it soon ? If yes, when ?
 
I plan to start a project using it and would like to use the version 2 from the start, as I guess it'll be even better !

 
Julien
AnswerRe: Locus Effect 2.0 ?memberYuval Naveh8 Sep '07 - 4:33 
Hi Julien,
 
I will try to do this by the end of this month (September).
 
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

AnswerRe: Locus Effect 2.0 ?memberYuval Naveh4 Oct '07 - 16:35 
Sorry - can't get to publish it yet. Just choked on time.
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

AnswerRe: Locus Effect 2.0 ?memberYuval Naveh20 Apr '09 - 6:46 
Julien,
 
It took me way too much time..but 2.0 is out now.
 
Thanks,
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

QuestionExcepion when showing effect in a loopmemberthisnameisnottakengoddammit-)16 Aug '07 - 12:46 
I get an InvalidOperation "Object is currently in use elsewhere." with the message "Object is currently in use elsewhere." x when attempting to show 100 effects in a loop:
 
for (int i = 0; i < 100; ++i )
locusEffectsProvider1.ShowLocusEffect(this, new Rectangle(200+4*i, 200+4*i, 100, 100), LocusEffectsProvider.DefaultLocusEffectArrow);
 

AnswerRe: Excepion when showing effect in a loopmemberYuval Naveh19 Aug '07 - 8:03 
Hi,
 
Yes, I see this bug too.
This issue needs to be investigated. It seems to do with some assumptions I made thread already running.
As a temporary workaround, try adding a short Sleep in the loop (10 msec works for me):

// Show the selected locus effect
for (int i = 0; i < 100; ++i)
{
locusEffectsProvider.ShowLocusEffect(this, new Rectangle(200 + 4 * i, 200 + 4 * i, 100, 100), LocusEffectsProvider.DefaultLocusEffectArrow);
System.Threading.Thread.Sleep(10);
}

 

Once I have the fix, it will be posted.
 
Yuval
 

 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Excepion when showing effect in a loopmemberD Waterworth20 Aug '07 - 18:36 
Hi,
 
This is a fantastic library - I've encountered the above exception as well though, I'm doing much the same but intead of a loop I'm calling ShowLocusEffect when cells on a grid control change. If the cells change to quickly the exception gets thrown.
 
Regards
 
Dave
GeneralRe: Excepion when showing effect in a loopmemberYuval Naveh22 Aug '07 - 5:13 
Hi Dave,
 
Thanks again for your appreciation.
Your diagnostic seems logical - this exception seems to happen on rapid re-launch of an effect.
Give me a some time (I have no time now..) and you guys will see a fix.
 
Yuval
 
"The true sign of intelligence is not knowledge but imagination." - Albert Einstein

GeneralRe: Excepion when showing effect in a loopmemberD Waterworth23 Aug '07 - 13:27 
Hi Yuval.
 
Thanks, I look forward to the fix. Out of interest, once fixed is it possible to have several animations running simulataneously using a single LocusEffectsProvider?
 
Dave

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web01 | 2.6.130516.1 | Last Updated 15 Feb 2006
Article Copyright 2005 by Yuval Naveh
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid