?? curtainboxdlg.cpp
字號:
// CurtainBoxDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CurtainBox.h"
#include "CurtainBoxDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCurtainBoxDlg dialog
CCurtainBoxDlg::CCurtainBoxDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCurtainBoxDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCurtainBoxDlg)
m_Edit = _T("作者:風林");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCurtainBoxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCurtainBoxDlg)
DDX_Control(pDX, IDC_TITLE3, m_Title3);
DDX_Control(pDX, IDC_TITLE2, m_Title2);
DDX_Control(pDX, IDC_TITLE1, m_Title1);
DDX_Text(pDX, IDC_CONTROL32, m_Edit);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCurtainBoxDlg, CDialog)
//{{AFX_MSG_MAP(CCurtainBoxDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_TITLE1, OnTitle1)
ON_BN_CLICKED(IDC_TITLE2, OnTitle2)
ON_BN_CLICKED(IDC_TITLE3, OnTitle3)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCurtainBoxDlg message handlers
BOOL CCurtainBoxDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
InitBox(); //初始化面板組
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCurtainBoxDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
CRect rect;
GetClientRect(&rect);
dc.FillSolidRect(&rect,RGB(192,248,202)); //繪制對話框背景色
CBrush Brush; //畫邊框
Brush.CreateSolidBrush( RGB(97,120,140) );
dc.SelectObject( &Brush );
dc.RoundRect( m_BoxRext.left-9, m_BoxRext.top-9,
m_BoxRext.right+9, m_BoxRext.bottom+9, 10, 10 ); //外框
dc.FillSolidRect( m_BoxRext.left, m_BoxRext.top,
m_BoxRext.Width(), m_BoxRext.Height(), GetSysColor( COLOR_BTNFACE ) ); //內框
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCurtainBoxDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/////////////////////////////////////////////////////////////////////
//初始化面板組
void CCurtainBoxDlg::InitBox()
{
m_BoxRext.SetRect( 44, 29, 232, 247); //面板組位置
m_Box1ID[0] = IDC_CONTROL11; //面板1中控件ID號
m_Box1ID[1] = IDC_CONTROL12;
m_Box1ID[2] = IDC_CONTROL13;
m_Box1ID[3] = IDC_CONTROL14;
m_Box2ID[0] = IDC_CONTROL21; //面板2中控件ID號
m_Box3ID[0] = IDC_CONTROL31; //面板3中控件ID號
m_Box3ID[1] = IDC_CONTROL32;
m_Box3ID[2] = IDC_CONTROL33;
b_Mark1 = true; //面板1初態-展開
b_Mark2 = true; //面板2初態-展開
b_Mark3 = false; //面板3初態-收縮
m_Title3.SetButStatus(BUT_STATUS_RIGHT);
ShowBox3( SW_HIDE ); //隱藏面板3中控件
CRect rect;
CWnd *pWnd = GetDlgItem( IDC_TITLE1 );
pWnd->GetWindowRect( &rect ); //求標題條尺寸
m_TitleHeight = rect.Height(); //標題條高度
m_BoxHeight[0] = m_TitleHeight+60; //面板1的高度(包括標題條)
m_BoxHeight[1] = m_TitleHeight+88; //面板2的高度(包括標題條)
m_BoxHeight[2] = m_TitleHeight+40; //面板3的高度(此值在增加面板時才有用)
CalculateControlPos1(); //顯示面板組
SetBox1Pos();
CalculateControlPos2();
SetBox2Pos();
CalculateControlPos3();
SetBox3Pos();
}
//刷新面板組
void CCurtainBoxDlg::InvalidateBox()
{
CalculateControlPos1();
SetBox1Pos();
CalculateControlPos2();
SetBox2Pos();
CalculateControlPos3();
SetBox3Pos();
InvalidateRect( &m_BoxRext );
}
////////////////////////////////////////////////////////////////////////////
//面板1
//計算各控件位置
void CCurtainBoxDlg::CalculateControlPos1()
{
m_TitlePt[0].x = m_BoxRext.left; //標題條位置(左上角坐標)
m_TitlePt[0].y = m_BoxRext.top;
m_ControlPt1[0] = CPoint( m_TitlePt[0].x+5, m_TitlePt[0].y+m_TitleHeight+10 );//控件位置(相對于標題條)
m_ControlPt1[1] = CPoint( m_TitlePt[0].x+31, m_TitlePt[0].y+m_TitleHeight+7 );
m_ControlPt1[2] = CPoint( m_TitlePt[0].x+7, m_TitlePt[0].y+m_TitleHeight+38 );
m_ControlPt1[3] = CPoint( m_TitlePt[0].x+75, m_TitlePt[0].y+m_TitleHeight+38 );
}
//設置各控件位置
void CCurtainBoxDlg::SetBox1Pos()
{
CWnd *pWnd = GetDlgItem( IDC_TITLE1 );
pWnd->SetWindowPos( NULL, m_TitlePt[0].x, m_TitlePt[0].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整標題欄位置
int i;
for( i=0; i<BOX1_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box1ID[i] );
pWnd->SetWindowPos( NULL, m_ControlPt1[i].x, m_ControlPt1[i].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整控件位置
}
}
//顯示/隱藏面板(SW_SHOW-顯示、SW_HIDE-隱藏)
void CCurtainBoxDlg::ShowBox1(int nShow)
{
CWnd *pWnd;
for( int i=0; i<BOX1_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box1ID[i] );
pWnd->ShowWindow( nShow );
}
}
////////////////////////////////////////////////////////////////////////////
//面板2
//計算各控件位置
void CCurtainBoxDlg::CalculateControlPos2()
{
m_TitlePt[1].x = m_BoxRext.left; //標題條位置(左上角坐標)
if( b_Mark1 ) //面板1是展開的
m_TitlePt[1].y = m_TitlePt[0].y+m_BoxHeight[0];
else //面板1是收起的
m_TitlePt[1].y = m_TitlePt[0].y+m_TitleHeight;
m_ControlPt2[0] = CPoint( m_TitlePt[1].x+5, m_TitlePt[1].y+m_TitleHeight+7 ); //控件位置
}
//設置各控件位置
void CCurtainBoxDlg::SetBox2Pos()
{
CWnd *pWnd = GetDlgItem( IDC_TITLE2 );
pWnd->SetWindowPos( NULL, m_TitlePt[1].x, m_TitlePt[1].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整標題欄位置
int i;
for( i=0; i<BOX2_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box2ID[i] );
pWnd->SetWindowPos( NULL, m_ControlPt2[i].x, m_ControlPt2[i].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整控件位置
}
}
//顯示/隱藏面板
void CCurtainBoxDlg::ShowBox2(int nShow)
{
CWnd *pWnd;
for( int i=0; i<BOX2_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box2ID[i] );
pWnd->ShowWindow( nShow );
}
}
////////////////////////////////////////////////////////////////////////////
//面板3
//計算各控件位置
void CCurtainBoxDlg::CalculateControlPos3()
{
m_TitlePt[2].x = m_BoxRext.left; //標題條位置(左上角坐標)
if( b_Mark2 ) //面板2是展開的
m_TitlePt[2].y = m_TitlePt[1].y+m_BoxHeight[1];
else //面板2是收起的
m_TitlePt[2].y = m_TitlePt[1].y+m_TitleHeight;
m_ControlPt3[0] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+7 ); //控件位置
m_ControlPt3[1] = CPoint( m_TitlePt[2].x+85, m_TitlePt[2].y+m_TitleHeight+7 );
m_ControlPt3[2] = CPoint( m_TitlePt[2].x+5, m_TitlePt[2].y+m_TitleHeight+35 );
}
//設置各控件位置
void CCurtainBoxDlg::SetBox3Pos()
{
CWnd *pWnd = GetDlgItem( IDC_TITLE3 );
pWnd->SetWindowPos( NULL, m_TitlePt[2].x, m_TitlePt[2].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整標題欄位置
int i;
for( i=0; i<BOX3_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box3ID[i] );
pWnd->SetWindowPos( NULL, m_ControlPt3[i].x, m_ControlPt3[i].y,
0, 0, SWP_NOSIZE | SWP_NOZORDER ); //調整控件位置
}
}
//顯示/隱藏面板
void CCurtainBoxDlg::ShowBox3(int nShow)
{
CWnd *pWnd;
for( int i=0; i<BOX3_NUMBER; i++ )
{
pWnd = GetDlgItem( m_Box3ID[i] );
pWnd->ShowWindow( nShow );
}
}
//////////////////////////////////////////////////////////////////////////////////
//單擊標題響應函數
//單擊面板1標題(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle1()
{
if( m_Title1.ClickBut() ) //單擊有效區
{
b_Mark1 = !b_Mark1; //修改狀態
if( b_Mark1 && b_Mark2 && b_Mark3 ) //保證最多同時展開兩個面板
{
b_Mark3 = false;
m_Title3.SetButStatus(BUT_STATUS_RIGHT);
ShowBox3( SW_HIDE);
}
if( b_Mark1 ) //展開/隱藏面板1
ShowBox1( SW_SHOW );
else
ShowBox1( SW_HIDE );
InvalidateBox(); //刷新面板組
}
}
//單擊面板2標題(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle2()
{
if( m_Title2.ClickBut() )
{
b_Mark2 = !b_Mark2;
if( b_Mark1 && b_Mark2 && b_Mark3 )
{
b_Mark3 = false;
m_Title3.SetButStatus(BUT_STATUS_RIGHT);
ShowBox3( SW_HIDE);
}
if( b_Mark2 )
ShowBox2( SW_SHOW );
else
ShowBox2( SW_HIDE );
InvalidateBox(); //刷新面板組
}
}
//單擊面板3標題(由ClassWizard添加)
void CCurtainBoxDlg::OnTitle3()
{
if( m_Title3.ClickBut() )
{
b_Mark3 = !b_Mark3;
if( b_Mark1 && b_Mark2 && b_Mark3 )
{
b_Mark1 = false;
m_Title1.SetButStatus(BUT_STATUS_RIGHT);
ShowBox1( SW_HIDE);
}
if( b_Mark3 )
ShowBox3( SW_SHOW );
else
ShowBox3( SW_HIDE );
InvalidateBox(); //刷新面板組
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -