Click here to Skip to main content
Licence CPOL
First Posted 1 Apr 2007
Views 44,433
Downloads 1,478
Bookmarked 63 times

Simple Magnifier

By | 1 Apr 2007 | Article
A fun little application: Simple magnifier for your desktop

Introduction

This is a fun little gadget for your desktop: a simple magnifier.

Background

I believe, many of you have already seen at least one magnifier application. I tried a few including the one which is built-in at the OS, however, I didn't like them one way or another. So, I decided to implement a simple one for my own usage.

Well, I've been using it quite sometime by now and it really works great. I thought you may find it interesting as well.

A Few Words About the Code

As I mentioned earlier, the program in fact is a simple application. However, it still demonstrates a few interesting points: First of all, it shows how to capture a screen image, double buffering, moving a Windows form programmatically, and serializing/deserializing configuration information through XmlSerializer. Second of all, the little application is designed to be a fun application in my mind, so it doesn't follow conventional Windows programming steps. Instead, I've used a very small borderless window as the main form. It has only 3 buttons (actually, hot spots) to do all functionality it provides. The first one instantiates a magnifier form, the second one to do the configuration, and finally, the third one is to exit from application.

Here is a screenshot of the application:

Screenshot - magSample1.jpg

The configuration section provides quite a few things to play with:

Screenshot - magConfig1.jpg

Some of the code snippets are also shown below:

// Make the window (the form) elliptical
GraphicsPath gp = new GraphicsPath();
gp.AddEllipse(ClientRectangle);
Region = new Region(gp);
 
//--- Double Buffering --- 

protected override void OnPaintBackground(PaintEventArgs e)
{
    if (mConfiguration.DoubleBuffered)
    {
        // Do not paint background (required for double buffering)!
    }
    else
    {
        base.OnPaintBackground(e);
    }
} 

protected override void  OnPaint(PaintEventArgs e)
{
    if (mBufferImage == null)
    {
        mBufferImage = new Bitmap(Width, Height);
    }
    Graphics bufferGrf = Graphics.FromImage(mBufferImage);

    Graphics g;

    if (mConfiguration.DoubleBuffered)
    {
        g = bufferGrf;
    }
    else
    {
        g = e.Graphics;
    }

    if (mScreenImage != null)
    {
        Rectangle dest = new Rectangle(0, 0, Width, Height);
        int w = (int)(Width / mConfiguration.ZoomFactor);
        int h = (int)(Height / mConfiguration.ZoomFactor);
        int x = Left - w / 2 + Width / 2;
        int y = Top - h / 2 + Height / 2;

        g.DrawImage(
            mScreenImage,
            dest,
            x, y,
            w, h,
            GraphicsUnit.Pixel);
    }

    if (mImageMagnifier != null)
    {
        g.DrawImage(mImageMagnifier, 0, 0, Width, Height);
    }

    if (mConfiguration.DoubleBuffered)
    {
        e.Graphics.DrawImage(mBufferImage, 0, 0, Width, Height);
    }      
} 
//--- XML Serialization --- 
public class XmlUtility
{
    public static void Serialize(Object data, string fileName)
    {
        Type type = data.GetType();
        XmlSerializer xs = new XmlSerializer(type);
        XmlTextWriter xmlWriter = new XmlTextWriter(fileName, System.Text.Encoding.UTF8);
        xmlWriter.Formatting = Formatting.Indented;
        xs.Serialize(xmlWriter, data);
        xmlWriter.Close();
    }

    public static Object Deserialize(Type type, string fileName)
    {
        XmlSerializer xs = new XmlSerializer(type);

        XmlTextReader xmlReader = new XmlTextReader(fileName);
        Object data = xs.Deserialize(xmlReader);

        xmlReader.Close();

        return data;
    }        
} 

Please take a look at the provided code to see the details in the implementation.

Conclusion

It was really fun to code this application. I shared it with my friends and many really liked it. Hope you guys will like it as much as I did.

Have a nice day!

History

  • 2nd April, 2007: Initial post

License

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

About the Author

otigli

Software Developer

United States United States

Member



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. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionFrom Circle to Square Pinmemberh.jaza7:03 2 Jan '10  
GeneralC++ PinmemberSuper Garrison7:19 30 Sep '09  
QuestionSuggestion PinmemberAmin853:20 6 Feb '09  
Generalsuggestion PinmemberRakesh Muraharishetty12:08 23 Apr '07  
GeneralRe: suggestion PinmemberRakesh Muraharishetty12:11 23 Apr '07  
GeneralRe: suggestion Pinmemberotigli21:06 23 Apr '07  
GeneralReally cool PinmemberYury Goltsman1:07 11 Apr '07  
GeneralRe: Really cool Pinmemberotigli9:12 11 Apr '07  
GeneralGood job!!! Pinmemberaporra1:31 10 Apr '07  
GeneralRe: Good job!!! Pinmemberotigli16:26 10 Apr '07  
GeneralCool PinmemberMuammar©23:28 9 Apr '07  
GeneralRe: Cool Pinmemberotigli16:25 10 Apr '07  
Generalgreat app Pinmemberjorgemar14:30 2 Apr '07  
GeneralRe: great app Pinmemberotigli16:56 2 Apr '07  
GeneralGreat Implimentation PinmemberCustec1:46 2 Apr '07  
GeneralRe: Great Implimentation Pinmemberotigli5:21 2 Apr '07  
GeneralVery Nice PinmemberStephan Poirier22:15 1 Apr '07  
GeneralRe: Very Nice Pinmemberotigli22:21 1 Apr '07  

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

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 2 Apr 2007
Article Copyright 2007 by otigli
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid