Click here to Skip to main content
15,885,546 members
Articles / Programming Languages / C#
Article

Simple Magnifier

Rate me:
Please Sign up or sign in to vote.
4.80/5 (41 votes)
1 Apr 2007CPOL1 min read 103.1K   5.3K   69   25
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:

C#
// 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)


Written By
Software Developer
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralMy vote of 5 Pin
Юрий GSMNeXus14-Jun-23 18:14
Юрий GSMNeXus14-Jun-23 18:14 
QuestionNot Working if Two Monitors Connected Pin
itsdipak31-Mar-16 4:08
itsdipak31-Mar-16 4:08 
AnswerRe: Not Working if Two Monitors Connected Pin
otigli24-Feb-20 12:54
otigli24-Feb-20 12:54 
QuestionHello, Sir how I can to deploy windows form database application to other computer Pin
hammad zahid ali9-Sep-14 21:18
hammad zahid ali9-Sep-14 21:18 
AnswerRe: Hello, Sir how I can to deploy windows form database application to other computer Pin
otigli24-Feb-20 13:08
otigli24-Feb-20 13:08 
QuestionAbout Multimonitor Pin
magefesa8-Oct-12 22:26
magefesa8-Oct-12 22:26 
AnswerRe: About Multimonitor Pin
otigli24-Feb-20 13:10
otigli24-Feb-20 13:10 
QuestionFrom Circle to Square Pin
jerzi.net2-Jan-10 7:03
jerzi.net2-Jan-10 7:03 
GeneralC++ Pin
Super Garrison30-Sep-09 7:19
Super Garrison30-Sep-09 7:19 
QuestionSuggestion Pin
Amin856-Feb-09 3:20
Amin856-Feb-09 3:20 
Generalsuggestion Pin
Rakesh Muraharishetty23-Apr-07 12:08
Rakesh Muraharishetty23-Apr-07 12:08 
GeneralRe: suggestion Pin
Rakesh Muraharishetty23-Apr-07 12:11
Rakesh Muraharishetty23-Apr-07 12:11 
GeneralRe: suggestion Pin
otigli23-Apr-07 21:06
otigli23-Apr-07 21:06 
GeneralReally cool Pin
Yury Goltsman11-Apr-07 1:07
Yury Goltsman11-Apr-07 1:07 
Excelent tool for reading. I'll recommend it to my father Wink | ;) Thanks.

As addition for GUI programmers I can propose non-anti-alias mode, pixel grid and cursor point marker. And as really great addition - measurement unit. For example pressing Ctrl marks start point and when you move lens, hint shows x and y position relative to start point (and may be color).
GeneralRe: Really cool Pin
otigli11-Apr-07 9:12
otigli11-Apr-07 9:12 
GeneralGood job!!! Pin
aporra10-Apr-07 1:31
aporra10-Apr-07 1:31 
GeneralRe: Good job!!! Pin
otigli10-Apr-07 16:26
otigli10-Apr-07 16:26 
GeneralCool Pin
Muammar©9-Apr-07 23:28
Muammar©9-Apr-07 23:28 
GeneralRe: Cool Pin
otigli10-Apr-07 16:25
otigli10-Apr-07 16:25 
Generalgreat app Pin
jorgemar2-Apr-07 14:30
jorgemar2-Apr-07 14:30 
GeneralRe: great app Pin
otigli2-Apr-07 16:56
otigli2-Apr-07 16:56 
GeneralGreat Implimentation Pin
Custec2-Apr-07 1:46
Custec2-Apr-07 1:46 
GeneralRe: Great Implimentation Pin
otigli2-Apr-07 5:21
otigli2-Apr-07 5:21 
GeneralVery Nice Pin
Stephan Poirier1-Apr-07 22:15
Stephan Poirier1-Apr-07 22:15 
GeneralRe: Very Nice Pin
otigli1-Apr-07 22:21
otigli1-Apr-07 22:21 

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

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