Riyadh
Riyadh

Reputation: 21

How do I handle WM_NCCALCSIZE and make chrome-like interface?

I'm currently using Google Chrome as my main browser. I wondered how the developers put the custom titlebar, because I wanted to incorporate into one of my own applications.

If you guys don't know what I'm talking about, here's a picture:

Screenshot

I found an article about the interface, which is here:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/33870516-9868-48d3-ab53-6269d9979598

However, I don't know how to do this. I'm currently using VC++ Express. Can anyone give me step by step instructions and how to get an interface like that? Except I don't want tabs on top.

I'm writing this in Win32.

Upvotes: 2

Views: 2254

Answers (2)

Elmue
Elmue

Reputation: 8168

OK, the answer is simple:

Chomre simply does not use the Windows built in functionality for drawing a frame border, titlebar, titlebar buttons, etc..

When you call GetWindowRect(hChromeWindow) and GetClientRect(hChromeWindow) you will notice that the rectangles are identical. This means that Chrome turns off all Windows functionality for drawing a border (simply return 0 in WM_NCCALSIZE without doing anything else) and then they draw EVERYTHING into the client area.

So in WM_PAINT they draw the titlebar and the upper part of the window (URL bar, tabs, etc..) together. In WM_NCPAINT they do nothing.

This is not the common way to do it, but the easiest, and it is bullet-proof.

By the way: Java applications do the same.

Upvotes: 4

Jerry Coffin
Jerry Coffin

Reputation: 490428

If memory serves, the main things you need to handle aren't WM_NCCALCSIZE, but WM_NCHITTEST and WM_NCPAINT.

WM_NCHITTEST is what tells the system when the cursor is over the title bar, so you need to take a cursor position and decide whether it's over the area you consider "title bar". In particular, if the user clicks and drags with the cursor in this area, the whole window gets dragged.

WM_NCPAINT is just like WM_PAINT except for the non-client area -- i.e., this is when you need to actually draw whatever you're going to for the title bar (and window borders, if memory serves).

I should add that I haven't played with this in quite a while. There's almost certainly more I'm not remembering right now.

Upvotes: 3

Related Questions