When I worked on Unix systems, I thought that the Unix applications were so cool !!
Therefore, I decided to sumbit this article/code that will enable you to
achieve some of the same features regarding the appearance of Windows dialogs that
Unix and LINUX programmers/users have come to know and love. Enjoy!
First of all, create ‘dialog based app’ and insert the following code into your …Dlg.h
class C…Dlg : public CDialog
{
// Construction
public:
CRect m_rcOldRect; // for original window position.void LargeWindow(); // Recovering original window feature
bool IsSmall;
CDC m_dcSmallIcon; // CDC for smallIcon….
// Implementation
protected:…
afx_msg void OnSmallButton();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnNcLButtonDblClk(UINT nHitTest, CPoint point);
afx_msg UINT OnNcHitTest(CPoint point);…
};
Next insert following code into your …Dlg.cpp
////////////////////////////////////////////////////////////
// Declare Information for ICON.. Global variable!
int ICON_X = 100; // Small Icon position.
int ICON_Y = 400;int ICON_WIDTH = 32; //Small Icon Width.
int ICON_HEIGHT = 32;int COUNT = 20;
int TIME = 10;///////////////////////////////////////////////////////////////
// Code for BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP(CSmallDlg, CDialog)
//{{AFX_MSG_MAP(CSmallDlg)
…
ON_BN_CLICKED(IDC_SMALL_BUTTON, OnSmallButton)
ON_WM_NCLBUTTONDBLCLK()
ON_WM_NCHITTEST()
…
//}}AFX_MSG_MAP
END_MESSAGE_MAP()////////////////////////////////////////////////////////////////////////
// Code for OnPaint method..
void C…Dlg::OnPaint()
{
if (IsIconic())
{
…
}
else if ( IsSmall == true)
{
CWindowDC dc(this);
dc.BitBlt(0, 0 ,32, 32, &m_dcSmallIcon, 0,0,SRCCOPY);CDialog::OnPaint();
}….
}
/////////////////////////////////////////////////////////////////////////////////
// code for small button
void C…Dlg::OnSmallButton()
{
CWindowDC dc(NULL);dc.SelectStockObject(WHITE_PEN);
// Declare variable
CRect m_rcClient;GetWindowRect(&m_rcClient);
GetWindowRect(&m_rcOldRect);dc.DPtoLP(&m_rcClient);
dc.DPtoLP(&m_rcOldRect);int differ_x,differ_y;
int differ_x1, differ_y1;dc.BitBlt(ICON_X, ICON_Y, ICON_WIDTH,ICON_HEIGHT, &dc, 0,0,SRCCOPY); // Draw Icon
differ_x = (ICON_X – m_rcClient.left)/COUNT;
differ_y = (ICON_Y – m_rcClient.top)/COUNT;differ_x1 = (ICON_X+ICON_WIDTH – m_rcClient.right) /COUNT;
differ_y1 = (ICON_Y+ICON_HEIGHT – m_rcClient.bottom) /COUNT;CRect rect;
rect = m_rcClient;if( ICON_X > m_rcClient.right )
rect.right = ICON_X;
if( ICON_Y > m_rcClient.top)
rect.top = ICON_Y;for( int i = 0 ; i < COUNT; i++) { dc.MoveTo(m_rcClient.left+differ_x*i, m_rcClient.top + differ_y*i); dc.LineTo(m_rcClient.right+differ_x1*i,m_rcClient.top + differ_y*i); dc.LineTo(m_rcClient.right+differ_x1*i , m_rcClient.bottom + differ_y1*i); dc.LineTo(m_rcClient.left+differ_x*i,m_rcClient.bottom + differ_y1*i); dc.LineTo(m_rcClient.left+differ_x*i, m_rcClient.top + differ_y*i); // dc.Rectangle(m_rcClient.left+differ_x*i, m_rcClient.top + differ_y*i, // m_rcClient.right+differ_x1*i , m_rcClient.bottom + differ_y1*i); // If you want to draw line between icon and app, insert following comment code. /* dc.MoveTo(m_rcClient.left+differ_x*i,m_rcClient.top + differ_y*i); dc.LineTo(ICON_X, ICON_Y); dc.MoveTo(m_rcClient.left , m_rcClient.bottom + differ_y1*i); dc.LineTo(ICON_WIDTH+ICON_X, ICON_Y); dc.MoveTo(m_rcClient.right + differ_x1*i, m_rcClient.top + differ_y*i); dc.LineTo(ICON_X+ICON_WIDTH, ICON_Y); dc.MoveTo(m_rcClient.right + differ_x1*i, m_rcClient.bottom + differ_y1*i); dc.LineTo(ICON_X+ICON_WIDTH, ICON_Y+ ICON_HEIGHT); */ ::Sleep(TIME); } ::InvalidateRect(NULL, &rect, FALSE); IsSmall = true; SetWindowPos(NULL,0,0,ICON_WIDTH, ICON_HEIGHT,SWP_NOMOVE|SWP_NOZORDER); MoveWindow(ICON_X, ICON_Y,ICON_WIDTH, ICON_HEIGHT,TRUE); OnPaint(); } //////////////////////////////////////////////////////////////////////// // Code for OnCreate method. int C...Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // Create small bitmap icon.. CClientDC dc (this); m_dcSmallIcon.CreateCompatibleDC(&dc); CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP); m_dcSmallIcon.SelectObject(&bitmap); bitmap.DeleteObject(); return 0; } ////////////////////////////////////////////////////////////////////////////// // Code for OnNcLButtonDblClk and OnNcHitTest void C...Dlg::OnNcLButtonDblClk(UINT nHitTest, CPoint point) { if( IsSmall == true) LargeWindow(); else CWnd::OnNcLButtonDblClk(nHitTest, point); } UINT C...Dlg::OnNcHitTest(CPoint point) { UINT nHitTest = CWnd::OnNcHitTest(point); if( nHitTest == HTCLIENT) nHitTest = HTCAPTION; return nHitTest; } ///////////////////////////////////////////////////////////////////////////////// // Code for LargeWindow() function. void C...Dlg::LargeWindow() { CWindowDC dc(NULL); dc.SelectStockObject(WHITE_PEN); // Declare variable CRect m_rcClient; GetWindowRect(&m_rcClient); dc.DPtoLP(&m_rcClient); ICON_X = m_rcClient.left; ICON_Y = m_rcClient.top; m_rcClient = m_rcOldRect; int differ_x,differ_y; int differ_x1, differ_y1; dc.BitBlt(ICON_X, ICON_Y, ICON_WIDTH,ICON_HEIGHT, &dc, 0,0,SRCCOPY); differ_x = (ICON_X - m_rcClient.left)/COUNT; differ_y = (ICON_Y - m_rcClient.top)/COUNT; differ_x1 = (ICON_X+ICON_WIDTH - m_rcClient.right) /COUNT; differ_y1 = (ICON_Y+ICON_HEIGHT - m_rcClient.bottom) /COUNT; CRect rect; rect = m_rcClient; if( ICON_X > m_rcClient.right )
rect.right = ICON_X;
if( ICON_Y > m_rcClient.top)
rect.top = ICON_Y;for( int i = COUNT ; i > 0 ; i–)
{
dc.MoveTo(m_rcClient.left+differ_x*i, m_rcClient.top + differ_y*i);
dc.LineTo(m_rcClient.right+differ_x1*i,m_rcClient.top + differ_y*i);
dc.LineTo(m_rcClient.right+differ_x1*i , m_rcClient.bottom + differ_y1*i);
dc.LineTo(m_rcClient.left+differ_x*i,m_rcClient.bottom + differ_y1*i);
dc.LineTo(m_rcClient.left+differ_x*i, m_rcClient.top + differ_y*i);::Sleep(5);
}
::InvalidateRect(NULL, &rect, FALSE);
MoveWindow(m_rcOldRect.left, m_rcOldRect.top, m_rcOldRect.Width(),m_rcOldRect.Height());
IsSmall = false;
InvalidateRect(m_rcOldRect,FALSE);
}
Date Last Updated: May 17, 1999