Windows程序设计——Ellipse函数画圆及不用Windows自带的画椭圆函数画椭圆

简介: Windows程序设计——Ellipse函数画圆及不用Windows自带的画椭圆函数画椭圆

Ellipse函数的用法


函数功能:该函数用于画一个椭圆,椭圆的中心是限定矩形的中心,使用当前画笔画椭圆,用当前的画刷填充椭圆。


函数原型:BOOL Ellipse(HDC hdc, int nLeftRect, int nTopRect, nRightRect, int nBottomRect);


参数:


  • hdc:设备环境句柄。


  • nLeftRect:指定限定矩形左上角的X坐标。


  • nTopRect:指定限定矩形左上角的Y坐标。


  • nRightRect:指定限定矩形右下角的X坐标。


  • nBottomRect:指定限定矩形右下角的Y坐标。


返回值:如果函数调用成功,返回值非零;如果函数调用失败,返回值是0。


Windows NT:若想获得更多错误信息,请调用GetLastError函数。


备注:椭圆既不使用也不改变当前位置。


Windows 95和Windows 98:限定矩形的坐标值之和不能超过32767。nLeftRect与nRigthRect或nTopRectn与BottomRect之和不能超过32767


注意:


Ellipse(x1,y1,x2,y2),你必须确保x2-x1==y2-y1,这样你画出的就是正圆,而不是椭圆了.


不用Windows自带的画椭圆函数画椭圆方法参考


代码如下:

//画一个椭圆中点算法
void CGraphicsView::midleEllipse(int xCenter, int yCenter, int Rx, int Ry, HDC dc)
{
  int Rx2 = Rx*Rx;
  int Ry2 = Ry*Ry;
  int twoRx2 = 2*Rx2;
  int twoRy2 = 2*Ry2;
  int p;
  int x=0;
  int y=Ry;
  int px = 0;
  int py = twoRx2*y;
  SetPixel(dc,xCenter+x,yCenter+y,RGB(255,0,0));
  SetPixel(dc,xCenter-x,yCenter+y,RGB(255,0,0));
  SetPixel(dc,xCenter+x,yCenter-y,RGB(255,0,0));
  SetPixel(dc,xCenter-x,yCenter-y,RGB(255,0,0));
  //Region 1
  p = (int)(Ry2-Rx2*Ry+0.25*Rx2);
  while(px<py)
  {
    x++;
    px+=twoRy2;
    if(p<0)
      p+=Ry2+px;
    else
    {
      y--;
      py-=twoRx2;
      p+=Ry2+px-py;
    }
    SetPixel(dc,xCenter+x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter+x,yCenter-y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter-y,RGB(255,0,0));
  }
  //Region 2
  p = (int)(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);
  while(y>0)
  {
    y--;
    py-=twoRx2;
    if(p>0)
      p+=Rx2-py;
    else
    {
      x++;
      px+=twoRy2;
      p+=Rx2-py+px;
    }
    SetPixel(dc,xCenter+x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter+x,yCenter-y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter-y,RGB(255,0,0));
  }
}
// 画圆
void circleMidpoint(int xCenter,int yCenter,int radius,HDC dc)
{
  int x = 0;
  int y = radius;
  int p=1-radius;
  while(x<y)
  {
    x++;
    if(p<0)
    {
      p+=2*x+1;
    }
    else
    {
      y--;
      p+=2*(x-y)+1;
    }
    SetPixel(dc,xCenter+x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter+y,RGB(255,0,0));
    SetPixel(dc,xCenter+x,yCenter-y,RGB(255,0,0));
    SetPixel(dc,xCenter-x,yCenter-y,RGB(255,0,0));
    SetPixel(dc,xCenter+y,yCenter+x,RGB(255,0,0));
    SetPixel(dc,xCenter-y,yCenter+x,RGB(255,0,0));
    SetPixel(dc,xCenter+y,yCenter-x,RGB(255,0,0));
    SetPixel(dc,xCenter-y,yCenter-x,RGB(255,0,0));
  }
}


相关文章
|
6月前
|
安全 开发者 C++
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
Windows10安装modelscope后import这个模块报错:OSError: [WinError 1] 函数不正确。: 'D:\Anaconda\envs\MDS\lib\site-packages\modelscope\utils\ast_utils.py'
223 1
|
JavaScript Java Windows
函数和windows对象 有惊喜✔
函数和windows对象 有惊喜✔
|
3月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
2月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
5月前
|
Windows
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
【Windows内核驱动函数(1)】IoCreateSymbolicLink()-----创建符号链接函数
|
5月前
|
Windows
逆向学习Windows篇:通过编写函数处理菜单消息
逆向学习Windows篇:通过编写函数处理菜单消息
35 0
|
5月前
|
监控 安全 Windows
逆向学习Windows篇:lab的使用和生成过程,以及“dell”的导出函数和作用
逆向学习Windows篇:lab的使用和生成过程,以及“dell”的导出函数和作用
70 0
|
11月前
|
Linux 编译器 C语言
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
94 0
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
|
11月前
|
存储 API Windows
8.1 Windows驱动开发:内核文件读写系列函数
在应用层下的文件操作只需要调用微软应用层下的`API`函数及`C库`标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用,例如本章要讲解的文件与目录操作相关函数,多数ARK反内核工具都具有对文件的管理功能,实现对文件或目录的基本操作功能也是非常有必要的。
96 0
8.1 Windows驱动开发:内核文件读写系列函数
|
C++
C++ <windows.h>库函数探究初步续一:键鼠操作
C++ <windows.h>库函数探究初步续一:键鼠操作
299 0