Click here to Skip to main content
Click here to Skip to main content

Vista Aero ToolStrip on Non-Client Area

By , 8 Feb 2009
 

NCBDemo

Introduction

When trying to figure out how to give the Ribbon an orb and the quick access toolbar, I found myself in trouble. I hope this example works for something you may need.

Background

Take a look to some Office app with a ribbon (Word, Excel, PowerPoint). There are some things that you might notice at first sight:

nonclient_002.jpg

  1. The orb is drawn half on the client area, half on the title bar
  2. The quick access tools are drawn (and sensed) on the title bar
  3. The title of the window is centered between the available space and the start of the caption buttons (minimize, maximize, close)

Using the code

Although it seems like the orb and the tools are drawn on the non-client area, they are not. This trick is done with one of the features of Vista's Desktop Window Manager (DWM).

How? Well, a regular window has a client area and a non-client area:

nonclient_003.jpg

But, a form with the trick done has no client area at all:

nonclient_004.jpg

So, why does the form look like it has a client area? A very well known trick: DwmExtendFrameIntoClientArea.

Turns out that when extending the frame into the client area, caption buttons (minimize, maximize, close) are drawn by default. To give life to these caption buttons, the DwmDefWindowProc function is called.

protected override void WndProc(ref Message m)
{
    ...

    int dwmHandled = Dwm.DwmDefWindowProc(m.HWnd, m.Msg, 
                         m.WParam, m.LParam, out result);

    if (dwmHandled == 1)
    {
        m.Result = result;
        return;
    }

    ... 

Now, we have to provide basic frame features like window moving and resizing. This is solved by handling the WM_NCHITTEST message on the WndProc. The return value for this message can specify which part of the frame the mouse is currently hitting. By a measurement of areas, the code returns the correct result:

  • Caption
  • North
  • South
  • East
  • West
  • NorthWest
  • NorthEast
  • SouthEast
  • SouthWest

Drawing the ToolStrip

To add a ToolStrip to the window, I just placed it as usual:

nonclient_005.jpg

and modified the render process so the ToolStrip gets no background:

public class NonClientAreaRenderer
        : ToolStripProfessionalRenderer
{

    protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e)
    {
        if (e.ToolStrip.IsDropDown)
        {
            base.OnRenderToolStripBackground(e);
        }
        else
        {
            //Clear so Aero glass covers the area
            e.Graphics.Clear(Color.Transparent);
        }
    }
    ...

And, there you go. A nice toolbar just on the non-client area, but you know, it's not the non-client area :)

History

  • 17 Jan. 09 - Original post.
  • 06 Feb. 09 - Focus bug fixed.

License

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

About the Author

Jose Menendez Póo
Team Leader
Mexico Mexico
Member
Jose Manuel Menéndez Poó
 
- I've been programming Windows and Web apps since 1997.
- My greatest concern nowadays is user interface usability.
 
Questions and stuff by twitter: @menendezpoo
 
Jose Runs Goplek in Mexico
www.goplek.com
 
Blog
menendezpoo.com

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

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionDoesn't work without Aero?memberQwertie19 Jun '12 - 7:57 
BugCannot drag window on second monitormemberchinswain7 Jun '12 - 22:55 
GeneralRe: Cannot drag window on second monitormemberOzan Müyesseroğlu18 Nov '12 - 14:25 
GeneralRe: Cannot drag window on second monitormembergogogoggg16 Feb '13 - 10:18 
QuestionThe controls at top position of form move to title bar ,can't been showned. [modified]memberMember 268840730 Dec '11 - 15:48 
GeneralMDI makes it white and undraggablememberAETCoder16 May '11 - 12:12 
GeneralMy vote of 5memberleesong3 Mar '11 - 3:09 
GeneralMy vote of 5memberVB_ Coder22 Feb '11 - 7:12 
GeneralMinimize/Maximize bugmembercode17002 Jan '11 - 8:13 
QuestionHow to reduce distance from top and the left edge??membervirtyaluk16 Oct '10 - 4:42 
QuestionHow to aero on client area but no Non-client area?memberstevenyoung8 Oct '10 - 2:05 
GeneralMy vote of 5memberMukit, Ataul13 Aug '10 - 8:30 
GeneralBlack bar bugmemberscruffyfox6 Aug '10 - 3:45 
GeneralRe: Black bar bug [modified]member3of46 Sep '10 - 20:45 
GeneralMy vote of 5memberMikeDaMan25942 Jul '10 - 16:14 
GeneralMy vote of 5memberAlex Essilfie30 Jun '10 - 2:11 
GeneralArticle excellent! But...memberEvgeniy Stepanow21 May '10 - 11:45 
QuestionHave DWM Draw the Window Icon?membersidneys17 May '10 - 10:47 
Generaldwmapi.dll missingmemberDivyesh Kharade26 Apr '10 - 2:07 
GeneralMDIContainermemberSkippy II14 Apr '10 - 8:13 
QuestionWindow's context menumemberDaHGBR6 Sep '09 - 4:41 
GeneralMinimize/Restore Resize bugmemberplehxp29 May '09 - 6:46 
GeneralRe: Minimize/Restore Resize bugmemberme6553218 Nov '09 - 17:25 
GeneralRe: Minimize/Restore Resize bugmembercode17002 Jan '11 - 8:17 
GeneralRe: Minimize/Restore Resize bugmemberAETCoder16 May '11 - 12:11 

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

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 8 Feb 2009
Article Copyright 2009 by Jose Menendez Póo
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid