plane.cpp

来自「winsail v2.0是用于DOS下的图形界面空间系统」· C++ 代码 · 共 205 行

CPP
205
字号
#include <Symbol.h>
#include <MyFrame.h>


class CDialCtrl:public CObject
{
private:
	int m_nBoxColor;
	int m_nTotalDial;
	int m_nDial;
public:
	BOOL DrawArmature(int nNew, int nOld, BOOL bFill);
public:
    int GetDial(){return(m_nDial);}
    void SetDial(int nDial){m_nDial = nDial;};

    int GetTotalDial(){return(m_nTotalDial);}
    void SetTotalDial(int nDial){m_nTotalDial = nDial;};

    void SetBoxColor(int nColor){m_nBoxColor = nColor;}
public:
	BOOL Show();
	BOOL ShowNumber(int nNewDial);
public:
	CDialCtrl(CObject* pParent);
};

CDialCtrl::CDialCtrl(CObject* pParent):CObject(pParent)
{
	m_nTotalDial = 12;
    m_nDial = 0;

    m_nBackColor = WHITE;
    m_nForeColor = BLACK;
    m_nBoxColor =  CYAN;

}

BOOL CDialCtrl::DrawArmature(int nNew, int nOld, BOOL bFill)
{
    int nX,nY;

	RECT rc;
    this->GetScreenRect(&rc);

    int nCircleX = (rc.left + rc.right)/2;
    int nCircleY = (rc.top + rc.bottom)/2;
    int nRadius = (rc.bottom - rc.top + 1)/2;

    if (bFill)
    {
        ::SetColor(m_nBoxColor);
        ::SetFillStyle(1, m_nBackColor);
        ::FillEllipse(nCircleX, nCircleY,nRadius,nRadius);
        ::FillEllipse(nCircleX, nCircleY,nRadius-1,nRadius-1);
        ::FillEllipse(nCircleX, nCircleY,nRadius-2,nRadius-2);

        ::SetColor(m_nForeColor);
        for(int i = 0; i < m_nTotalDial; i++)
        {
            nX =   nCircleX + (int)((nRadius - 2) * cos(2.0 * CONST_DOUBLE_T * i / m_nTotalDial));
            nY =   nCircleY + (int)((nRadius - 2) * sin(2.0 * CONST_DOUBLE_T * i / m_nTotalDial));

            int nX2 =   nCircleX + (int)((nRadius - 6) * cos(2.0 * CONST_DOUBLE_T * i / m_nTotalDial));
            int nY2 =   nCircleY + (int)((nRadius - 6) * sin(2.0 * CONST_DOUBLE_T * i / m_nTotalDial));

            ::Line(nX, nY , nX2, nY2);
        }
    }

    if (nOld != -1)
    {
        ::SetColor(m_nBackColor);
        nX =   (int)((nRadius - 10) * cos(2.0 * CONST_DOUBLE_T * nOld / m_nTotalDial));
        nY =   (int)((nRadius - 10) * sin(2.0 * CONST_DOUBLE_T * nOld / m_nTotalDial));

        ::Line(nCircleX, nCircleY, nCircleX + nX, nCircleY + nY);
    }
    ::SetColor(m_nForeColor);
    nX =   (int)((nRadius - 10) * cos(2.0 * CONST_DOUBLE_T * nNew / m_nTotalDial));
    nY =   (int)((nRadius - 10) * sin(2.0 * CONST_DOUBLE_T * nNew / m_nTotalDial));

    ::Line(nCircleX, nCircleY, nCircleX + nX, nCircleY + nY);

    return(TRUE);
}

BOOL CDialCtrl::Show()
{
    struct viewporttype mView;
	BOOL bMouse = CObject::StartControlView(&mView);

	RECT rc;
    this->GetScreenRect(&rc);

    int nCircleX = (rc.left + rc.right)/2;
    int nCircleY = (rc.top + rc.bottom)/2;
    int nRadus = (rc.bottom - rc.top + 1)/2;

	this->DrawArmature(m_nDial, m_nDial, TRUE);

	CObject::EndControlView(&mView, bMouse);
	return(TRUE);
}

BOOL CDialCtrl::ShowNumber(int nNewDial)
{
	//Close Mouse And Set View = (0, 0 ,GetMaxX(), GetMaxY());
    struct viewporttype mView;
	BOOL bMouse = CObject::StartControlView(&mView);

	RECT rc;
    this->GetScreenRect(&rc);

    int nCircleX = (rc.left + rc.right)/2;
    int nCircleY = (rc.top + rc.bottom)/2;
    int nRadus = (rc.bottom - rc.top + 1)/2;

	this->DrawArmature(nNewDial, m_nDial, FALSE);

    m_nDial = nNewDial;

	CObject::EndControlView(&mView, bMouse);
	return(TRUE);

}
void far ClickDial_DialDemoDialog(CObject* pCurObj)
{
	CDialog* pDialog = (CDialog *)pCurObj->GetParent();
	CDialCtrl* pDialCtrl = (CDialCtrl *)pCurObj;


    AfxMessageBox("表盘", "你单击了表盘!!!");

}

void far OnTime_DialDemoDialog(CObject* pCurObj)
{
	CDialog* pDialog = (CDialog *)pCurObj;
	CDialCtrl* pDialCtrl1 = (CDialCtrl *)pDialog->ObjectFromID(2001);
	CDialCtrl* pDialCtrl2 = (CDialCtrl *)pDialog->ObjectFromID(2002);

    int nTotalDial = pDialCtrl1->GetTotalDial();
    int nDial = pDialCtrl1->GetDial();

    int nNewDial = (nDial + 1) % nTotalDial;
    pDialCtrl1->ShowNumber(nNewDial);

    nTotalDial = pDialCtrl2->GetTotalDial();
    nDial = pDialCtrl2->GetDial();

    nNewDial = (nDial + 1) % nTotalDial;
    pDialCtrl2->ShowNumber(nNewDial);

}

void far OnDraw_DialDemoDialog(CObject* pCurObj)
{
	CDialog* pDialog = (CDialog *)pCurObj;

    ::ChPrintf(10, 10 + 16 * 0, YELLOW, WHITE, 1, 0, "你好,这是一个表盘演示!");
    ::ChPrintf(10, 10 + 16 * 1, YELLOW, WHITE, 1, 0, "该摸块演示了如何使用窗口Draw回调函数!");
    ::ChPrintf(10, 10 + 16 * 2, YELLOW, WHITE, 1, 0, "该摸块演示了如何使用窗口Time回调函数!");
    ::ChPrintf(10, 10 + 16 * 3, YELLOW, WHITE, 1, 0, "该摸块演示了如何定制ActiveX控件!");

}

void far DialDemoDialog()
{
    CDialog* pDialog = new CDialog;
    pDialog->CreateWindow(0, 0 , 320,  380, "表盘演示");
    pDialog->Center();

    pDialog->SetTimeFc(OnTime_DialDemoDialog);
    pDialog->SetDrawFc(OnDraw_DialDemoDialog);

    CCloseButton* pCloseButton = new CCloseButton(pDialog);

    CDialCtrl* pDialCtrl1 = new CDialCtrl(pDialog);
    pDialCtrl1->CreateObject(170, 150, 100, 100, NULL);

    CDialCtrl* pDialCtrl2 = new CDialCtrl(pDialog);
    pDialCtrl2->CreateObject(50, 150, 100, 100, NULL);


    pDialCtrl1->SetShape(SHAPE_CIRCLE);
	pDialCtrl1->SetID(2001);
    pDialCtrl1->SetFc(ClickDial_DialDemoDialog);


    pDialCtrl2->SetBackColor(YELLOW);
    pDialCtrl2->SetBoxColor(BLACK);
    pDialCtrl2->SetTotalDial(48);
    pDialCtrl2->SetShape(SHAPE_CIRCLE);
	pDialCtrl2->SetID(2002);
    pDialCtrl2->SetFc(ClickDial_DialDemoDialog);

    pDialog->ShowWindow();
    pDialog->DoModal();
    delete pDialog;
}


//	::DrawArmature(320,320, 100, 0, 3, 20, TRUE);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?