Solved

How to add buttons to title bar of CFrameWnd?

Posted on 2000-04-22
5
1,696 Views
Last Modified: 2013-11-20
I would like to add buttons to the title bar of a CFrameWnd.  Anyone know how to do this?  If there is nothing straightforward, how can I change the client area of the frame in order to draw on the title bar?  Thanks.
0
Comment
Question by:Mournblade
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
5 Comments
 
LVL 9

Expert Comment

by:cdesigner
ID: 2740217
you can paint frame and caption by self.
need sample for CDialog ?
0
 

Expert Comment

by:Shabeer
ID: 2754314
Add the code to create button in OnNcCreate function in CMainFrame Class.
In the function check nHitTest = HTCAPTION before adding the code.
Try with this.
0
 
LVL 2

Expert Comment

by:JunHaan
ID: 2783787
Mourneblade, I have a complete answer to your question, but its quite long and I was hoping you could increase the points... 50 is too little :)
0
 

Expert Comment

by:GregMM
ID: 2802375
http://www.codeguru.com/dialog/custom_dialog_caption.shtml
This source code demonstrates how you can add buttons to dialog caption bar and also how you can paint the caption.

A lot of peoples asked me to show how they can add buttons to the caption. Of course, first the question is:
Is it possible to add buttons to the non-client area?
The answer is NO.
So what is this article about? Well, this demo shows how to add buttons to the non-client area.
0
 
LVL 2

Accepted Solution

by:
JunHaan earned 50 total points
ID: 2821943
Mournblade,
I'll answer your question anyway...

To have a button in the title bar, you'd need to create a 'pseudo' button. We would have to process the mouse messages and draw the button ourselves...

First of all, since we're drawing our own button, we'd need two bitmaps... One for the button-up state amd the other for the button-down state. Give the bitmaps a dimension of 16x16(I assume you're app is a regular window, not a tool window). I'll use IDB_BUTTONUP and IDB_BUTTONDOWN for this example.

First, declare a few variables in your header file, as public :

//Start of code

class CYourDlg : public CDialog
{
// Construction
public:
   CYourDlg(CWnd* pParent = NULL);      // standard constructor

   //Add these
   void DrawCapButton();
   void GetButtonRect( CRect &rect );  
   
   bool m_bPressed;
   CBitmap m_bitmapPressed;
   CBitmap m_bitmapUnpressed;

}  

//End of code

In the constructor of your dialog class, load the two bitmaps :

//Start of code

CYourDlg::CYourDlg(CWnd *pParent ) : CDialog( CYourDlg::IDD, pParent )
{
   //{{AFX_DATA_INIT(CYourDlg)
   //}}AFX_DATA_INIT
   //Add these
   m_bPressed = FALSE;
   m_bitmapPressed.LoadBitmap( IDB_BUTTONDOWN );
   m_bitmapUnpressed.LoadBitmap( IDB_BUTTONUP );
   
}  

//End of code

Then, using the ClassWizard, add the WM_NCPAINT and the WM_ACTIVATE message handlers to your class. Modify them and add the DrawCapButton and GetButtonRect functions as well :

//Start of code
void CYourDlg::OnNcPaint()
{
   //Add this
   DrawCapButton();
}

void CYourDlg::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
{
   //Add this
   DrawCapButton();
}  


void CYourDlg::DrawCapButton()
{

   //Skip if window is not visible or minimized
   if( !IsWindowVisible() || IsIconic() ) return;
   
   //Get the bitmap
   CDC memDC;
   CDC* pDC = GetWindowDC();
   memDC.CreateCompatibleDC( pDC );
   memDC.SelectObject( m_bPressed ? &m_bitmapPressed : &m_bitmapUnpressed );
   
   //Convert button rect into non-client area coordinates
   CRect rect, rectWnd;
   GetButtonRect(rect);
   GetWindowRect(rectWnd);
   rect.OffsetRect( -rectWnd.left, -rectWnd.top );
   
   //Draw
   pDC->StretchBlt( rect.left, rect.top, rect.Width(),
                    rect.Height(). &memDC, 0, 0, 16, 16, SRCCOPY );
   
   //Clean up
   memDC.DeleteDC();
   ReleaseDC( pDC );
}

void CWinsysDlg::GetButtonRect(CRect& rect)
{
      GetWindowRect(&rect);

      rect.top += GetSystemMetrics(SM_CYFRAME)+1;            
      rect.bottom = rect.top + GetSystemMetrics(SM_CYSIZE)-4;      
                rect.left = rect.right - GetSystemMetrics(SM_CXFRAME) -             ( 4 * GetSystemMetrics(SM_CXSIZE))-1;
                //Replace 4 with the current number of buttons in your caption + 1

      rect.right = rect.left + GetSystemMetrics(SM_CXSIZE)-3;      
}

Okay, now you'd want to activate your button :

//Start of Code
//In .h file

// Generated message map functions
//{{AFX_MSG(CYourDlg)
afx_msg void OnNcLButtonDown( UINT nHitTest, CPoint point ); //Add this
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

//In .cpp file
//Add to message map

BEGIN_MESSAGE_MAP(CYourDlg, CDialog)
      //{{AFX_MSG_MAP(CYourDlg)
      ON_WM_NCLBUTTONDOWN()
      //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CWinsysDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
      if( nHitTest == HTCAPTION )
      {
            
            //see if in button area
            CRect rect;
            GetButtonRect( rect );
            if( rect.PtInRect( point ) )
            {
                  m_bPressed = !m_bPressed;
                  DrawCapButton();
            }
      }
      CDialog::OnNcLButtonDown( nHitTest, point);
}
   
//End of Code

Phew! Finished! :)
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article, I'll describe -- and show pictures of -- some of the significant additions that have been made available to programmers in the MFC Feature Pack for Visual C++ 2008.  These same feature are in the MFC libraries that come with Visual …
Introduction: The undo support, implementing a stack. Continuing from the eigth article about sudoku.   We need a mechanism to keep track of the digits entered so as to implement an undo mechanism.  This should be a ‘Last In First Out’ collec…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
In this video, viewers will be given step by step instructions on adjusting mouse, pointer and cursor visibility in Microsoft Windows 10. The video seeks to educate those who are struggling with the new Windows 10 Graphical User Interface. Change Cu…

734 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question