none
VC 如何给一个扇面填充颜色? RRS feed

  • 问题

  • 扇面是通过圆和直线组合而成的;
    如何填充这个组成的封闭区域?

    我是用的Arc画的圆,用MoveTo和LineTo画的直线,这样组成的区域不知道是不是封闭的?
    其实我是想就像window中操作画图工具一样,点击油漆桶就将这个封闭区域填充上相应颜色。

    2010年6月23日 8:20

答案

全部回复

  • 我采用的是你给的第一种方法,但是 有几个函数不会定义:

    error C2065: 'SelectBrush' : undeclared identifier

    error C2065: 'GetStockBrush' : undeclared identifier

    error C2065: 'DC_BRUSH' : undeclared identifier

    error C2065: 'SetDCBrushColor' : undeclared identifier

    不好意思,我太菜了,你就帮人帮到底吧!谢谢谢谢!

    2010年6月24日 11:51
  • VC6包含的SDK默认是Windows 95, 故要自己在#include <windows.h>前写上
     
    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <windowsx.h>
      


    你上述回答的问题中,我只在#include <windows.h>前添加了

    #define _WIN32_WINNT 0x0500
    #include <windows.h>
    #include <windowsx.h>
    然后编译的时候还是会出现:
    error C2065: 'DC_BRUSH' : undeclared identifier
    error C2065: 'SetDCBrushColor' : undeclared identifier
    这几个是wingdi.h(windows.h已包括)的声明, 但要求Windows 2000以上
    #if (_WIN32_WINNT >= 0x0500)
    #define DC_BRUSH 18
    #define DC_PEN 19
    #endif
    #if (_WIN32_WINNT >= 0x0500)
    WINGDIAPI COLORREF WINAPI SetDCBrushColor(HDC, COLORREF);
    WINGDIAPI COLORREF WINAPI SetDCPenColor(HDC, COLORREF);
    #endif
    这个该怎么加啊?加在哪啊?
    2010年6月25日 0:23
  • 我在#include <windows.h>前加了

    #define _WIN32_WINNT 0x0500
    #include <windowsx.h>
    但是为什么还说:
    > error C2065: 'DC_BRUSH' : undeclared identifier
    > error C2065: 'SetDCBrushColor' : undeclared identifier
    > error C2065: 'SelectBrush' : undeclared identifier
    > error C2065: 'GetStockBrush' : undeclared identifier)这两个错误已经没有了。
    2010年6月25日 1:16
  •  
     
    2010年6月25日 4:50
  • 编译是通过了,没有错误。但是没有出来什么效果,即跟没添加这段程序是一样的效果,并没有填充什么区域。。。

    怎么回事?

    如果你方便的话可以加我QQ 515641320 ('暗号':教你VC)

    2010年6月25日 9:45
  • 这位前辈,看到我的大会能快点回复吗? 我很着急。。。 谢谢你啦!
    2010年6月26日 13:33
  • void CDrawLineView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); OnPrepareDC(&dc); dc.DPtoLP(&point); //获得鼠标相对于窗口的坐标 double Ox=320.00; //┏ ┓ double Oy=320.00; //┗定义的圆心 以它作为坐标原点┛ double yuanhuan=40.00; //这是圆环之间的距离 double length; //鼠标点到圆心的距离 double angle1; //angle1是鼠标点落在第N象限时和x正半轴所成的角度 int length1; //求得的鼠标坐落在哪个圆环中,即代表LED int point1; //求得的鼠标坐落在第N象限中的第几个2.8125角度中 memset(aa,0,sizeof(aa)); //初始化二维数组a length = sqrt((abs((point.x-Ox)*(point.x-Ox))) + (abs((point.y-Oy)*(point.y-Oy))));//求两点之间的距离 length1=(length-80.00)/yuanhuan; //80.00是中间的大空圆心 鼠标落在哪个LED中已经确定 angle1=(atan((320-point.y)/(point.x-320)))*180/PI; //angle1是鼠标点落在第N象限时和x正半轴所成的角度 point1=angle1/2.8125; //角度确定 aa[length1][point1]=aa[length1][point1]^1; if(aa[length1][point1]==1) { //填充相应的区域 CPen pen(PS_SOLID,4,RGB(0,0,0)); CPen *pOldPen = dc.SelectObject(&pen); CRect rc1(320,200,323,240); dc.Arc(320,200,320,235,321,240,322,200); } else { //清掉此区域的颜色 } } //希望别见笑!
    2010年6月26日 16:06
  • 怎么不能修改格式啊 就这样看起来乱糟糟的。。。
    2010年6月26日 16:31
  • 你给的代码不就是填充颜色的嘛?
    2010年6月26日 16:53
  • 我们方便QQ聊吗?
    2010年6月26日 16:54
  • 那怎么办呢?这个网页刷新太慢 你用QQ吗?方便吗? 我在线515641320
    2010年6月26日 17:06
  • 大侠,赶快帮帮忙吧,我都等你2天了。。。
    2010年6月26日 17:21
  • 真的太感谢你了,你这么耐心的给我解决这个问题,真的太感激了!
    2010年6月28日 9:13
  • 你的这个代码我在VC6.0的WIN32应用程序中调试了一下,很OK的!

    但是我想把里边的某些功能移植到MFC中却实现不了这种功能!

    我的程序是建的基于对话框的应用程序,里边要添加一些控件的。。。

    我的疑问:

    1:在win32API中的画圆函数是Ellipse,但是我怎么就是画不成呢?

    2:  "江写生"wrote:

    for (int i = 0; i < 2; i++) {
    hdc = ahdc[i];
    SelectBrush(hdc, hbr);
    BeginPath(hdc);
    MoveToEx(hdc, xStartIn, yStartIn, 0);
    SetArcDirection(hdc, AD_CLOCKWISE);
    ArcTo(hdc, xCenter - radiusIn, yCenter - radiusIn, xCenter + radiusIn,
    yCenter + radiusIn, xStartIn, yStartIn, xEndIn, yEndIn);
    SetArcDirection(hdc, AD_COUNTERCLOCKWISE);
    ArcTo(hdc, xCenter - radiusOut, yCenter - radiusOut, xCenter + radiusOut,
    yCenter + radiusOut, xEndOut, yEndOut, xStartOut, yStartOut);
    EndPath(hdc);
    FillPath(hdc);
    }
    这段代码我单独移植到MFC中为什么总是填充的白色?我试图改变它的画刷颜色也不行?
    3:说实话 你给的代码我大致可以看出什么意思,但是有些是因为不知道为什么要那样写?这个问题以后向你请教(因为这个界面急着要用)。
    请高手进我的邮箱里边看一下我所需要的界面,可以吗?
    密码:6个零
    然后再告诉我那个代码该怎样移植...
    2010年6月28日 9:46
  • 可惜我不会翻墙,没想到这里的消息这么灵通,还以为没有人这么无聊修改密码呢,原来。。。

    我太着急了,没有办法,你也不加我的QQ..

    2010年6月28日 11:43
  • 这么邮箱费了,不能用了。。。

    密码 密保问题都被人改掉了。。。

    2010年6月28日 11:47
  • 或者给我发邮件:lovelovecpp@163.com

    2010年6月28日 12:07
  • 请查阅!

    2010年6月28日 12:12
  •   "江写生"wrote:

    for (int i = 0; i < 2; i++) {
    hdc = ahdc[i];
    SelectBrush(hdc, hbr);
    BeginPath(hdc);
    MoveToEx(hdc, xStartIn, yStartIn, 0);
    SetArcDirection(hdc, AD_CLOCKWISE);
    ArcTo(hdc, xCenter - radiusIn, yCenter - radiusIn, xCenter + radiusIn,
    yCenter + radiusIn, xStartIn, yStartIn, xEndIn, yEndIn);
    SetArcDirection(hdc, AD_COUNTERCLOCKWISE);
    ArcTo(hdc, xCenter - radiusOut, yCenter - radiusOut, xCenter + radiusOut,
    yCenter + radiusOut, xEndOut, yEndOut, xStartOut, yStartOut);
    EndPath(hdc);
    FillPath(hdc);
    }

    我的疑问:

    1:

    这段代码我单独移植到MFC中为什么总是填充的白色?我试图改变它的画刷颜色也不行?

    2:

    点击一次填充上对应颜色,点击第二次的时候怎么清掉对应的填充呢?


    2010年6月29日 12:24