Solved

Custom buttons in CFrameWnd caption?

Posted on 2000-04-30
5
415 Views
Last Modified: 2013-11-20
Does anyone know how I can draw my own buttons in a FrameWnd caption?  Maybe the answer lies in ::DrawCaption()?   But if so, I can't get it to work.
0
Comment
Question by:Bill Nolan
[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
  • 3
5 Comments
 
LVL 12

Expert Comment

by:migel
ID: 2772382
Hi!
look at www.codeguru.com
here is example how to draw custom window caption
0
 
LVL 7

Author Comment

by:Bill Nolan
ID: 2774016
*Where?* This seems to be a local favorite here.  Several times I've been referred to codeguru.com, yet given absolutely no idea on how to find the article in question,  just "here is an example". In this case, there is nothing in their cute database that comes up under anything related to this topic.  And I can't find anything in the highlighted sections, either.
0
 
LVL 12

Expert Comment

by:migel
ID: 2783800
0
 
LVL 12

Expert Comment

by:migel
ID: 2784060
also look at dialog section (same site) there is article about adding controls to the dialog caption/ The technique is the same for any non dialog window.
0
 
LVL 2

Accepted Solution

by:
JunHaan earned 75 total points
ID: 2821991
Slimfinger,

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! Hope this answers your question! :)

0

Featured Post

[Webinar] How Hackers Steal Your Credentials

Do You Know How Hackers Steal Your Credentials? Join us and Skyport Systems to learn how hackers steal your credentials and why Active Directory must be secure to stop them. Thursday, July 13, 2017 10:00 A.M. PDT

Question has a verified solution.

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

Introduction: Load and Save to file, Document-View interaction inside the SDI. Continuing from the second article about sudoku.   Open the project in visual studio. From the class view select CSudokuDoc and double click to open the header …
Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
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.
Come and listen to Percona CEO Peter Zaitsev discuss what’s new in Percona open source software, including Percona Server for MySQL (https://www.percona.com/software/mysql-database/percona-server) and MongoDB (https://www.percona.com/software/mongo-…

695 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