Environment: C++
Object
This article will show you how to build a translucent menu, as shown in the example. The two interessing files are CImageTarget.h and CImageTarget.cpp, which provide the functionalities of the translucent menu.
Step 1
First, you have to build a Document View application. Then, insert #include “CImageTarget.h” into the header of the CView-derived class. Then, don’t forget to include in your settings the msimg32.lib library; it will be necessary for the AlphaBlend(…) function.
You have also to declare as member variables one or more “CImageTarget *” variables inside the “protected” section. For the example above, I’ve two variables:
CImageTarget * m_itMenuAffichage , * m_itMenuCentral ;
Step 2
Now, you must construct and create your instance of the CImageTarget class. I do it in the “CXXXView::OnInitialUpdate” function:
CRect rect ; AfxGetMainWnd()->GetClientRect( &rect ); int bottom = rect.bottom ; m_itMenuAffichage = new CImageTarget( ); //first, create the master item. bool res = m_itMenuAffichage->Create( this , CRect( 200 , bottom - 150 , 300 , bottom - 50 ) , std::string("affichage.bmp") , true ); //if the master item has been correctly created , you can have some //subItems if( res ) { int item = -1; item = m_itMenuAffichage->AddItem( CRect( 200 , bottom - 510 , 300 , bottom - 410 ) , std::string("symbole.bmp") , false ); /* if the subordinate item has been correctly added, you can * associate to it a message and the ID of a classic item menu. * This will have the effect of sending a WM_LBUTTONDOWN message * to the view that contains the corresponding function. */ if( item != -1 ) res = m_itMenuAffichage->AddToMap( item , WM_LBUTTONDOWN , ID_SYMBOLE ); ... } /* Note that you can never handle the sub-items by their address*/
Step 3
/*Call the master items CImageTarget::MouseMove method into the *CXXXView::OnMouseMove(UINT nFlags, CPoint point)*/ void CProjet1View::OnMouseMove(UINT nFlags, CPoint point) { m_itMenuAffichage->MouseMove( point ) ; m_itMenuCentral->MouseMove( point ) ; . } /*Call the master items CImageTarget:: LButtonDown method into the *CXXXView:: OnLButtonDown (UINT nFlags, CPoint point)*/ void CProjet1View::OnLButtonDown(UINT nFlags, CPoint point) { if( m_itMenuAffichage->LButtonDown( point ) ) return ; /*you immediately return if you have clicked an item*/ . } /*Call the master items CImageTarget::Draw method into the *CXXXView:: OnDraw ( CDC * pDC )*/ void CProjet1View::OnDraw(CDC* pDC) { m_itMenuAffichage->Draw( pDC ); ... } /*Note that this way will cause a little flicking. To avoid it, * you better work on a memory DC.*/
Remarks
- The master item controls all the sub-items (as you will see in the code). It controls the drawing, the repainting, and the events.
- I did not try to insert a master item as a sub-item of another master item, but it’s simple to do. Just make the AddItem function return the address instead of the ID and re-do an AddItem on it.