注册 登录
编程论坛 VC++/MFC

新手求助:如何在对话框中创建直角坐标系

yanzixiaohui 发布于 2011-06-30 08:48, 2868 次点击
新手求助:如何在对话框中创建直角坐标系,详细的步骤,本人是新手。
8 回复
#2
zhoufeng19882011-06-30 09:02
用GDI画就可以。
#3
zhoufeng19882011-06-30 13:24
程序代码:

/*
* 绘制坐标轴(x,y) MM_TEXT
*/
void CSpaceDlg::DrawAXis(CDC& dc)
{
    CRect rectClient;
    GetClientRect(rectClient);

    // 坐标轴长度
    INT nXLength = rectClient.Width() - 20;
    INT nYLength = rectClient.Height() - 20;
    INT nxUnit = 10;                                // 单位
    INT nyUnitHeidht = 5;

    /* 绘制横轴    */
    dc.MoveTo(0, 0);
    dc.LineTo(nXLength, 0);
   
    /* 绘制X箭头 */
    dc.MoveTo(nXLength, 0);
    dc.LineTo(nXLength - 5, - 5);
    dc.MoveTo(nXLength, 0);
    dc.LineTo(nXLength - 5, 5);
   
    /* 绘制X轴刻度 */
    for (int i = 0; i < nXLength / nxUnit; ++i)
    {
        dc.MoveTo(i * nxUnit, 0);
        dc.LineTo(i * nxUnit, -nyUnitHeidht);
    }

    /* 绘制纵轴 */
    dc.MoveTo(0, 0);
    dc.LineTo(0, -nYLength);

    /* 绘制Y箭头 */
    dc.MoveTo(0, -nYLength);
    dc.LineTo(-5, -nYLength + 5);
    dc.MoveTo(0, -nYLength);
    dc.LineTo(5, -nYLength + 5);

    /* 绘制Y轴刻度 */
    for (i = 0; i < nYLength / nxUnit; ++i)
    {
        dc.MoveTo(0, -i * nxUnit);
        dc.LineTo(nyUnitHeidht, -i * nxUnit);
    }
}
#4
yanzixiaohui2011-06-30 15:31
回复 3楼 zhoufeng1988
能不能说点具体点,这段代码写到哪?
#5
zhoufeng19882011-07-01 09:17
这是一个画坐标系的函数,放在OnPaint消息响应里。
注意在使用的时候,用SetViewportOrg设置坐标原点。
#6
yanzixiaohui2011-07-01 09:27
回复 5楼 zhoufeng1988
void CMy222Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        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();
    }
}
这是原始的OnPaint,怎么改呢?
#7
zhoufeng19882011-07-01 13:27
程序代码:

void CSpaceDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
    }
    else
    {
        CRect rect;
        GetClientRect(&rect);
        CPaintDC dc(this);
        
        /*--------------------------------------*/
        /* 绘制坐标系 */
        /*--------------------------------------*/
        // 设置坐标系原点
        POINT pntOrg = {15, rect.Height() - 15};
        dc.SetViewportOrg(pntOrg);
        
        DrawAXis(dc);
        
        CDialog::OnPaint();
    }
}

只有本站会员才能查看附件,请 登录
#8
喜鹊王子2013-01-17 13:24
回复 3楼 zhoufeng1988
这样画的话,只要窗口被覆盖或者调整大小,画的这些线就会立马消失吧?
#9
三顾毛庐2013-12-03 22:37
1