Click here to Skip to main content
14,210,491 members
Click here to Skip to main content
Article
Posted 20 Jun 2007

Stats

117K views
60 bookmarked

Let Your Form Drop a Shadow

,
Rate this:
4.69 (29 votes)
Please Sign up or sign in to vote.
4.69 (29 votes)
15 Dec 2007     CPOL    
This article describes how to let your Form drop a shadow, the Windows way

Introduction

I found many articles here on The Code Project and elsewhere that deal with Windows.Forms dropping shadows. Most of them solved the problem by implementing a second "shadowing" Form behind the real Form. This might be useful in some cases, as this approach keeps absolute control over the to-be-drawn shadow. In other cases (e.g. customized Tooltips) it seems to involve too much overhead. Fortunately, there is a simple solution if you can live with handing control over to Windows.

I have to admit that the solution described can be found elsewhere, e.g. Windows Forms Drop Shadow. The subject of this article is not actually enough to warrant a stand-alone piece, but it might be helpful for some in this community. So, I have decided to publish this small piece of code as an article.

What It Looks Like

Screenshot - shadowform.gif

Note: This is a "real" shadow, since it overlays the underlying text with some opacity. It's the shadow style of Menus, which are created in the same way.

This effect works with shaped Forms, as well. The shadow outlines the Form's shape exactly.

The Code

The "trick" is to add the CS_DROPSHADOW value to the ClassStyle property of the Form's CreateParams property.

C#

public class ShadowForm : Form
{
    // Define the CS_DROPSHADOW constant
    private const int CS_DROPSHADOW = 0x00020000;

    // Override the CreateParams property
    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ClassStyle |= CS_DROPSHADOW;
            return cp;
        }
    }
}

Visual Basic

Public Class ShadowForm

  ' Define the CS_DROPSHADOW constant
  Private Const CS_DROPSHADOW As Integer = 131072

  ' Override the CreateParams property
  Protected Overrides ReadOnly Property CreateParams()
      As System.Windows.Forms.CreateParams

    Get
        Dim cp As CreateParams = MyBase.CreateParams
        cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
        Return cp
    End Get

  End Property

End Class

That's all you have to do.

Limitation

For the described solution, Windows XP or above is required. Adding CS_DROPSHADOW may result in an exception if executed under a lower Windows version. You can use the Environment.OSVersion property to determine the running OS version (Angelo Cresta gave a VB.NET example in a message of this article). Further on determining the actual OS is described in many CodeProject articles (e.g. XWinVer - Simple Class to get Windows OS Version, OS Name, Version & Product Type, Easily Get and Compare OS Version Information).

The thread "Moving Form bug?" in the messages of this article uncovered a strange behaviour. If the application has more than one open Window and you move the shadowed Form or it looses the focus, the shadow disappears. If the application is not maximized and you move the Forms, you will see that the shadow is still present. But it is positioned behind all Windows of the application. I guess this behaviour is connected to the way menus react: open menus (and their shadows) disappear if another object of the application is activated.
Due to this behaviour, the solution described in this article has limited use.

Points of Interest

As mentioned above, this is the way in which Menus are created. However, Windows allows you to disable Menu shadows. If this feature is disabled, your Form will be painted without a shadow.

Screenshot - display_properties.gif

At this point, you are losing control over whether your shadows will be painted or not. On the other hand, if the user dislikes shadows, why should you try to override his preferences?

History

  • 19-06-2007: First published
  • 22-06-2007: Article updated (OS version)
  • 10-12-2007: Article updated (disappearing shadows)

License

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

Share

About the Author

Marcus Deecke
Software Developer (Senior)
Germany Germany
I am working for a small software company in Hamburg, Germany, and my day-to-day distress is Java development.

Comments and Discussions

 
QuestionDoubt about the corners Pin
Jeffrey Matheus3-Feb-13 9:29
memberJeffrey Matheus3-Feb-13 9:29 
GeneralI didn't understand the limitations of this approach. Pin
M N Sarofem29-Jul-12 0:14
memberM N Sarofem29-Jul-12 0:14 
QuestionProlem with MDI form Pin
shriram201219-Apr-12 16:00
membershriram201219-Apr-12 16:00 
GeneralDie Schatten in Vista oder Win7 sind anders... Pin
dherrmann5-Dec-09 6:27
memberdherrmann5-Dec-09 6:27 
GeneralThat was great! Pin
k0zaw9-Jun-09 19:19
memberk0zaw9-Jun-09 19:19 
GeneralRe: That was great! Pin
Marcus Deecke16-Oct-09 11:01
memberMarcus Deecke16-Oct-09 11:01 
GeneralRe: That was great! Pin
Gee.4-Feb-10 6:19
memberGee.4-Feb-10 6:19 
QuestionHow to set shadow for child window of the MDI form Pin
Harsha T3-Jul-08 9:18
memberHarsha T3-Jul-08 9:18 
GeneralShadow tweaks Pin
jberenguer2-Jul-08 11:18
memberjberenguer2-Jul-08 11:18 
GeneralRe: Shadow tweaks Pin
Paul Sanders (the other one)7-Sep-08 7:56
memberPaul Sanders (the other one)7-Sep-08 7:56 
GeneralKeeping dropshadows Pin
jberenguer2-Jul-08 11:13
memberjberenguer2-Jul-08 11:13 
Questionhow to stop the drop shadow from disappearing when you lose focus Pin
paperclippy2-Apr-08 10:45
memberpaperclippy2-Apr-08 10:45 
AnswerRe: how to stop the drop shadow from disappearing when you lose focus Pin
jberenguer25-Nov-08 4:51
memberjberenguer25-Nov-08 4:51 
GeneralGood Job Pin
merlin98117-Dec-07 4:41
professionalmerlin98117-Dec-07 4:41 
GeneralThanks Pin
JaseNet26-Jun-07 6:23
memberJaseNet26-Jun-07 6:23 
GeneralCheck for SystemParameter.DropShadow Pin
Laurent Muller25-Jun-07 19:40
professionalLaurent Muller25-Jun-07 19:40 
GeneralRe: Check for SystemParameter.DropShadow Pin
Jamie Nordmeyer26-Jun-07 4:54
memberJamie Nordmeyer26-Jun-07 4:54 
GeneralRe: Check for SystemParameter.DropShadow Pin
The_Mega_ZZTer26-Jun-07 15:48
memberThe_Mega_ZZTer26-Jun-07 15:48 
QuestionRe: Check for SystemParameter.DropShadow Pin
Basnta Padhi18-Aug-11 2:42
memberBasnta Padhi18-Aug-11 2:42 
QuestionMoving Form bug? Pin
Steve J Randall21-Jun-07 0:18
memberSteve J Randall21-Jun-07 0:18 
AnswerRe: Moving Form bug? Pin
Marcus Deecke21-Jun-07 22:58
memberMarcus Deecke21-Jun-07 22:58 
GeneralRe: Moving Form bug? Pin
Marcus_228-Jun-07 1:15
memberMarcus_228-Jun-07 1:15 
GeneralRe: Moving Form bug? Pin
Markus Eßmayr3-Jul-07 5:15
memberMarkus Eßmayr3-Jul-07 5:15 
GeneralNice job Pin
Nickolay Karnaukhov20-Jun-07 23:03
memberNickolay Karnaukhov20-Jun-07 23:03 
GeneralRe: Nice job Pin
Angelo Cresta21-Jun-07 4:51
professionalAngelo Cresta21-Jun-07 4:51 
I agree!

But for lazy vb.net programmers ...

' Define the CS_DROPSHADOW constant
Private Const CS_DROPSHADOW As Integer = 131072

' Override the CreateParams property
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
' Check OS Before using XP drop shadow
Dim OSVer As Version = System.Environment.OSVersion.Version()
Select Case OSVer.Major
Case Is <= 5
Case 5
If OSVer.Minor > 0 Then
cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
End If
Case Is > 5
cp.ClassStyle = cp.ClassStyle Or CS_DROPSHADOW
Case Else
End Select
Return cp

End Get
End Property


Angel

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.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web06 | 2.8.190618.1 | Last Updated 16 Dec 2007
Article Copyright 2007 by Marcus Deecke
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid