0

好吧,我正在尝试使用 MFC 构建一些小型 Windows 应用程序并尝试了解事物的工作原理,但在绘制国家国旗时我被卡住了。以下代码行在中间矩形的中心绘制三个矩形和一个圆,接下来需要将辐条画成圆形,即8个直径相隔45度角。

void CMainWindow::OnPaint (){
CPaintDC dc(this);
for (int i=0;i <=100;i+=50) {
    dc.SetBkMode(TRANSPARENT);
    CRect rect;
    CPen pen(PS_SOLID, 1, RGB(0,0,0));
    CPen *oldPen = dc.SelectObject(&pen);
    if (i == 0){
         CBrush brush(RGB(255,130,0));
         CBrush *oldBrush = dc.SelectObject(&brush);
         dc.Rectangle(75,(i+50),275,(i+100));
    }
    else if(i == 50) {
         CBrush brush(RGB(255,255,255));
         CBrush *oldBrush = dc.SelectObject(&brush);
         dc.Rectangle(75,(i+50),275,(i+100));
         CPen pen2(PS_SOLID, 1,RGB(0,0,255));
         CPen *oldPen = dc.SelectObject(&pen2);
         dc.Ellipse(150,100,200,150);
    }
    else {
         CBrush brush(RGB(34,139,34));
         CBrush *oldBrush = dc.SelectObject(&brush);
         dc.Rectangle(75,(i+50),275,(i+100));
    }
}

我不知道该怎么做,我试图在 MFC 库中找到它,但没有运气!

4

3 回答 3

1

这是 sin() cos() 方法的示例。我没有看到将整个代码块放在 for 循环中的意义,表明我删除了那部分。

#include "math.h"
#define PI 3.1415926535898
void DrawIndiaFlag(CDC & dc , int x, int y)
{
    dc.SetBkMode(TRANSPARENT); 
    CRect rect; 
    CPen pen(PS_SOLID, 1, RGB(0,0,0)); 
    CPen *oldPen = dc.SelectObject(&pen); 

    {
        CBrush brush(RGB(255,130,0)); 
        CBrush *oldBrush = dc.SelectObject(&brush); 
        dc.Rectangle(x,(y),x+200,(y+50)); 
        dc.SelectObject(oldBrush);
    }

    {
        CBrush brush(RGB(255,255,255)); 
        CBrush *oldBrush = dc.SelectObject(&brush); 
        dc.Rectangle(x,(50+y),x+200,(y+100)); 
        CPen pen2(PS_SOLID, 1,RGB(0,0,255)); 
        CPen *oldPen = dc.SelectObject(&pen2); 
        dc.Ellipse(x+75,y+50,x+125,y+100); 

        // Draw spokes
        int nOriginX = x+100;
        int nOriginY = y+75;
        int nRadius = 25;
        int nSpokes = 24;
        double fAngle = 2*PI/nSpokes;

        for (int i =0; i<nSpokes; i++)
        {
            dc.MoveTo(nOriginX,nOriginY);
            int nX = (int)ceil(cos((fAngle)*i)*(nRadius)+nOriginX);
            int nY = (int)ceil(sin((fAngle)*i)*(nRadius)+nOriginY);
            dc.LineTo(nX,nY);
        }
        dc.SelectObject(oldPen);

    }

    {
        CBrush brush(RGB(34,139,34)); 
        CBrush *oldBrush = dc.SelectObject(&brush); 
        dc.Rectangle(x,(100+y),x+200,(150+y)); 
        dc.SelectObject(oldBrush);
    }

    dc.SelectObject(oldPen);
}
于 2012-08-06T02:27:42.030 回答
0

我认为你所追求的是CDC::LineTo方法(你可以CDC::MoveTo用来到达起点)。更多信息:

"从当前位置画一条线,直到,但不包括,由 x 和 y(或点)指定的点...用选定的笔画线。当前位置设置为 x、y 或点。”

于 2012-08-03T09:07:17.037 回答
0

我不熟悉您正在使用的 API,但您可以;

  • 从一个细长的矩形开始(假设没有线条功能)作为您的线条
  • 从圆的中心画到顶部,这应该是一个容易计算的坐标
  • 从您的第一行获取这些起始位置并围绕圆心旋转它们,如果它们没有 API 功能,您可以按照此处所述手动执行http://www.euclideanspace.com/maths/geometry/affine/ aroundPoint/index.htm
  • 使用这些新的旋转坐标来绘制下一条线,然后重复
于 2012-08-03T07:35:12.387 回答