:: Home

  login:         
  passwords:  

Winforms Interview Questions

Windows Forms Deployment
Windows Forms Controls
Windows Forms Data Binding
Windows Forms Datagrid
Windows Forms Docking
Windows Forms Keyboard Handling
Windows Forms Layout
Windows Forms Licensing
Windows Forms Menus
Windows Forms Mouse Handling
Windows Forms from MFC
Windows Forms from VB6
Windows Forms Patterns
Windows Forms Printing
Windows Forms Resources
Windows Form Scrolling
Windows Forms Tips
Windows Forms Common Dialogs
Windows Forms Listbox
Windows Forms ComboBox
Windows Forms Rich TextBox
Windows Forms ListView
Windows Forms TreeView
Windows Forms Button
Windows Forms TabControl
Windows Forms TextBox
Windows Forms MDI
Windows Forms Cursors
Windows Forms WebBrowser
Windows Forms PictureBox
Windows Forms Form
Windows Forms MDI
Windows Forms In IE
GDI+Bitmaps&Images
GDI+Font
GDI+Color
GDI+Brushes
GDI Drawing Tips
GDI+ from GDI
GDI Paths Regions
GDI+Pens
Interioerability WIn32
Tools Metadata Viewers
Design Time Serialization
Design Time Custom Designers
Design Time Tips
Design Time Type Editors
Vs.Net Tips
Vs.Net Debugging
Vs.Net Macros
Framework Tips General
Framework Tips Events
Framework Tips General IO
Framework Tips Strings
Framework Tips Threading
Tool Resource Editor
Design Time UI
Framework Tips CGI
Framework Tips XML

WPF Interview Qs

SilverLight Interview Qs

SAP Interview Questions

Oracle Interview Questions

PHP Interview Questions

Ajax Interview Questions

IIS 7.0

OOP Interview Questions

Ruby Interview Questions

Sql Server Interview Questions

SharePoint 2007 Questions

Microsoft Crm Questions

GDI+ Brushes

The General Winforms Interview Questions consists the most frequently asked questions in Winforms. This list of 100+ questions guage your familiarity with the Winforms platform. The q&a have been collected over a period of time from various blogs, forums and other similar Winforms sites

37. GDI Drawing Tips

    37.1 Where can I see a basic tutorial on GDI+?
    37.2 What are some things to remember when drawing in Window Forms?
    37.3 When can I not use AutoScrolling? In other words why would I ever need any other form of autoscrolling?
    37.4 Are AutoScrolling bounds setup in World or Device coordinates?
    37.5 Why am I not being able to set a Color.Transparent color as a background to my control?
    37.6 Why does a Control not draw transparent even after setting it's BackColor to Transparent?
    37.7 How can I get the screen resolution of my display?
    37.8 How do I draw rotated text?
    37.9 Why does my transparent Panel whose parent has a gradient background flicker a lot when resized?
    37.10 How do I get a count of the gdi handles currently in use in my application?
    37.11 How can I minimize flickering when drawing a control?
    37.12 How do I draw circles, rectangles, lines and text?
    37.13 How do I get a snapshot of my desktop?
    37.14 How can I draw without handling a paint message?

37.1 Where can I see a basic tutorial on GDI+?

Take a look at Mahash Chand's GDI+ Tutorial for Beginners found on C# Corner.


37.2 What are some things to remember when drawing in Window Forms?

Check out the Painting techniques using Windows Forms by Fred Balsigerat gotnetdot.com. It is a good basic discussion of how to get the best performance from Windows Forms drawing. His hints include leveraging the power of the .Net Framework by using the proper controls and control styles as well as consolidating painting code in the OnPaint and OnPaintBackground methods.

37.3 When can I not use AutoScrolling? In other words why would I ever need any other form of autoscrolling?

AutoScrolling does not allow you to dynamically control the scrolling interval. If you are drawing a complex control such as grid then you want to be able to scroll based on the current row height, column width etc. With AutoScrolling you cannot do this. You have to implement Scrolling yourself in such cases.
Autoscrolling is also not very useful if you want multiple views to share a scrollbar. The most common place where you see this is with a workbook. There is no direct way in Winforms to hook up your own scrollbars with the AutoScrolling implementation.


37.4 Are AutoScrolling bounds setup in World or Device coordinates?

AutoScrollingMinSize is setup in device coordinates. If you are using a world coordinate system other than pixels this means that you have to translate between world and device coordinates before you set these value. You can use the Graphics.TransformPoints API to do this as shown below.

g.TransformPoints(CoordinateSpace.Device, CoordinateSpace.World, ptScrollSize);
All this does is go from the GraphicsUnit that you are using to pixels. For example if your GraphicsUnit is Inch, then with a Graphics object that represents a monitor screen you will have translated values that come to about 100 pixels for every logical inch. Using this API ensures that you are insulated from the underlying device. The values will be much higher for printers. Another important point to remember is that your Transform in the painting code (please refer earlier FAQ in this section on AutoScrolling implementation) will have to be in logical coordinates and will hence have to translate between logical and device coordinates.
{
Graphics g = args.Graphics;
g.PageUnit = GraphicsUnit.Inch;
// this will always be in pixels
Point[] ptAutoScrollPos = new Point[]{this.AutoScrollPosition};
// We have to convert the pixel value (device) to inches (logical..world)
g.TransformPoints(CoordinateSpace.World, CoordinateSpace.Device, ptAutoScrollPos);
// set up a simple translation so that we draw with respect to the doc bounds
// and not the physical bounds
g.TranslateTransform(ptAutoScrollPos[0].X, ptAutoScrollPos[0].Y);
g.DrawEllipse(_pen, _rectEllipse);
}

37.5 Why am I not being able to set a Color.Transparent color as a background to my control?

Sometimes the framework will throw an exception if you try to set the bg color to be transparent. This is because the Control doesn't support transparent colors. To work around this you should call this method from within the Control:

[C#]
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
[VB.Net]
Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True)


37.6 Why does a Control not draw transparent even after setting it's BackColor to Transparent?

This is possible if the Control is drawn by the system, rather than by the framework. This is the case for example with the Label control when it's set to FlatStyle.System. You should then set to to something else other than System for your transparent drawing to work.


37.7 How can I get the screen resolution of my display?

Use this property: System.Windows.Forms.Screen.PrimaryScreen.Bounds


37.8 How do I draw rotated text?

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
g.TranslateTransform(100.0f, 100.0f);
g.RotateTransform(-90.0f);
g.DrawString("Vertical Text", Font, Brushes.Blue, 0.0f, 0.0f);
g.ResetTransform();
g.TranslateTransform(100.0f, 100.0f);
g.RotateTransform(-45.0f);
g.DrawString("Slanted Text", new Font(Font, FontStyle.Bold), Brushes.Red, 0.0f, 0.0f);
g.ResetTransform();
}

37.9 Why does my transparent Panel whose parent has a gradient background flicker a lot when resized?

class NonFlickerPanel : Panel
{
public NonFlickerPanel()
{
SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint,true);
UpdateStyles();
}
}

37.10 How do I get a count of the gdi handles currently in use in my application?

You can do so using the native GetGuiResources api. Here is a sample:

///
/// uiFlags: 0 - Count of GDI objects
/// uiFlags: 1 - Count of USER objects
/// - Win32 GDI objects (pens, brushes, fonts, palettes, regions, device contexts, bitmap headers)
/// - Win32 USER objects:
/// - WIN32 resources (accelerator tables, bitmap resources, dialog box templates, font resources, menu resources, raw data resources, string table entries, message table entries, cursors/icons)
/// - Other USER objects (windows, menus)
///
[DllImport("User32")]
extern public static int GetGuiResources(IntPtr hProcess, int uiFlags);
public static int GetGuiResourcesGDICount()
{
return GetGuiResources(Process.GetCurrentProcess().Handle, 0);
}
public static int GetGuiResourcesUserCount()
{
return GetGuiResources(Process.GetCurrentProcess().Handle, 1);
}
 
'
' uiFlags: 0 - Count of GDI objects
' uiFlags: 1 - Count of USER objects
' - Win32 GDI objects (pens, brushes, fonts, palettes, regions, device contexts, bitmap headers)
' - Win32 USER objects:
' - WIN32 resources (accelerator tables, bitmap resources, dialog box templates, font resources, menu resources, raw data resources, string table entries, message table entries, cursors/icons)
' - Other USER objects (windows, menus)
' _
extern Public static Integer GetGuiResources(IntPtr hProcess, Integer uiFlags)
Public Shared Function GetGuiResourcesGDICount() As Integer
Return GetGuiResources(Process.GetCurrentProcess().Handle,0)
End Function
Public Shared Function GetGuiResourcesUserCount() As Integer
Return GetGuiResources(Process.GetCurrentProcess().Handle,1)
End Function

37.11 How can I minimize flickering when drawing a control?

public UserPictureBox() //derived from System.Windows.Forms.Control
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// Activates double buffering
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
// TODO: Add any initialization after the InitForm call
}

37.12 How do I draw circles, rectangles, lines and text?

Handle the Paint event for your control or form.

private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Graphics g = e.Graphics;
Pen pen = new Pen(Color.White, 2);
SolidBrush redBrush = new SolidBrush(Color.Red);
g.DrawEllipse(pen, 100,150,100,100);
g.DrawString("Circle", this.Font, redBrush, 80, 150);
g.FillRectangle(redBrush, 140, 35, 20, 40);

g.DrawString("Rectangle", this.Font, redBrush, 80, 50);
g.DrawLine(pen, 114, 110, 150, 110);
g.DrawString("Line", this.Font, redBrush, 80, 104);
}

37.13 How do I get a snapshot of my desktop?

Here is some code that will do it.

[C#]
internal class NativeMethods
{
[DllImport("user32.dll")]
public extern static IntPtr GetDesktopWindow();
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr GetWindowDC(IntPtr hwnd);
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern UInt64 BitBlt
(IntPtr hDestDC,
int x,
int y,
int nWidth,
int nHeight,
IntPtr hSrcDC,
int xSrc,
int ySrc,
System.Int32 dwRop);
}
// Save the screen capture into a jpg
public void SaveScreen()
{
Image myImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
Graphics gr1 = Graphics.FromImage(myImage);
IntPtr dc1 = gr1.GetHdc();
IntPtr dc2 = NativeMethods.GetWindowDC(NativeMethods.GetDesktopWindow());
NativeMethods.BitBlt(dc1, 0, 0, Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height, dc2, 0, 0, 13369376);
gr1.ReleaseHdc(dc1);
myImage.Save("screenshot.jpg", ImageFormat.Jpeg);
}
[VB.Net]
Friend Class NativeMethods
_
Public Shared Function GetDesktopWindow() As IntPtr
End Function
_
Public Shared Function GetWindowDC(ByVal hwnd As IntPtr) As IntPtr
End Function
_
Public Shared Function BitBlt(ByVal hDestDC As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDC As IntPtr, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal dwRop As System.Int32) As UInt64
End Function
End Class 'NativeMethods
'Save the screen capture into a jpg
Private Sub SaveScreen()
Dim myImage = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
Dim gr1 As Graphics = Graphics.FromImage(myImage)
Dim dc1 As IntPtr = gr1.GetHdc()
Dim dc2 As IntPtr = NativeMethods.GetWindowDC(NativeMethods.GetDesktopWindow())
NativeMethods.BitBlt(dc1, 0, 0, Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, dc2, 0, 0, 13369376)
gr1.ReleaseHdc(dc1)
myImage.Save("screenshot.jpg", ImageFormat.Jpeg)
End Sub 'SaveScreen

37.14 How can I draw without handling a paint message?

o draw on any hwnd, you need to get a Graphics object from that hwnd. Once you have the Graphics object, you can then use its methods to draw. Of course, since this drawing is not done in the Paint handler, it will not be automatically refreshed when the control is redrawn for any reason.

Graphics g = Graphics.FromHwnd(this.Handle);
SolidBrush brush = new SolidBrush(Color.Red);
Rectangle rectangle = new Rectangle(25, 25, 100, 100);
g.FillRectangle(brush, rectangle);

Copyright 2007, Megasolutions Ltd