A: 

You need to use a partially opaque color when drawing:

Updated line from linked article, in the MyDrawReversibleRectangle method:

ControlPaint.DrawReversibleFrame( rc, Color.FromArgb(80, 120, 120, 120), FrameStyle.Dashed );
Oded
sorry but that is not working. i don't know why but here is a screen shoot http://screencast.com/t/NjM1NjBkZTc . The grayed color is from my .4 opacity full screen form and the dashed rectangle is the DrawReversibleFrame method that completely ignores the backcolor parameter. Thank you and excuse my English.
andySF
A: 

Just use an additional form, without showing it in the taskbar, or other Form-options. Set the region of the form that it only shows the rubber band. And make sure both windows behave as if it was one window (moving, closing,...). I know it's not an elegant way, but with a little work it can produce good results. You can make sure that the form is on top in the form-hierarchy and still doen't receive focus.

By setting the region good, all events will go to the other form.

That's the way I worked out an equivalent problem (I don't say it's a good solution, but it works)

CommuSoft
I don't think this will work for a reversible frame.
SLaks
If i will not success with anything this probably will be my solution to. Thank you
andySF
+2  A: 

Is this the droid you were looking for?

    public Form1()
    {
        InitializeComponent();
        DoubleBuffered = true;
    }

    bool mouseDown = false;
    Point mouseDownPoint = Point.Empty;
    Point mousePoint = Point.Empty;

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        mouseDown = true;
        mousePoint = mouseDownPoint = e.Location;
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        base.OnMouseUp(e);
        mouseDown = false;
    }

    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        mousePoint = e.Location;
        Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        if (mouseDown)
        {
            Region r = new Region(this.ClientRectangle);
            Rectangle window = new Rectangle(
                Math.Min(mouseDownPoint.X, mousePoint.X),
                Math.Min(mouseDownPoint.Y, mousePoint.Y),
                Math.Abs(mouseDownPoint.X - mousePoint.X),
                Math.Abs(mouseDownPoint.Y - mousePoint.Y));
            r.Xor(window);
            e.Graphics.FillRegion(Brushes.Red, r);
            Console.WriteLine("Painted: " + window);
        }
    }
Dearmash
Nice, Thank you!
andySF
Horray, now I can comment. Thanks for marking the answer
Dearmash
this was totally the droid i was looking for
Allen
+1  A: 

I used the code that @Dearmash supplied in the screen capture utility that comes with my open source app BugTracker.NET. The app isn't very big, so if you are doing screen capture stuff, it might be a good starting point. More info here:

http://ifdefined.com/blog/post/Screen-capture-utility-in-C-NET.aspx

Corey Trager
A: 

Thanks a lot. It is really helpful.

Shibu Mathew