
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