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));
  }
}


相关文章
|
7月前
|
JavaScript Java Windows
函数和windows对象 有惊喜✔
函数和windows对象 有惊喜✔
|
5月前
|
存储 API Windows
8.1 Windows驱动开发:内核文件读写系列函数
在应用层下的文件操作只需要调用微软应用层下的`API`函数及`C库`标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头即可在内核中使用,例如本章要讲解的文件与目录操作相关函数,多数ARK反内核工具都具有对文件的管理功能,实现对文件或目录的基本操作功能也是非常有必要的。
58 0
8.1 Windows驱动开发:内核文件读写系列函数
|
5月前
|
Linux 编译器 C语言
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
58 0
C++ | 探究函数重载的原理:函数名修饰【基于Windows + Linux双系统】
|
12月前
|
C++ Windows
C++ 调用windows系统DOS命令的函数 system(char* command)
C++ 调用windows系统DOS命令的函数 system(char* command)
165 0
|
Oracle 关系型数据库 数据安全/隐私保护
【已解决】身份验证错误,要求的函数不正确或登录windows2008服务器提示账号密码错误的解决方案
【已解决】身份验证错误,要求的函数不正确或登录windows2008服务器提示账号密码错误的解决方案
524 0
|
C# Windows 容器
C#面向对象程序设计课程实验二: 实验名称:Windows 窗体程序
C#面向对象程序设计课程实验二: 实验名称:Windows 窗体程序
C#面向对象程序设计课程实验二: 实验名称:Windows 窗体程序
Windows进程创建函数
Windows进程创建函数
|
Java Linux iOS开发
JNI用C加载JDK产生JVM虚拟机,并运行JAVA类main函数(MACOS/LINUX/WINDOWS)
JNI用C加载JDK产生JVM虚拟机,并运行JAVA类main函数(MACOS/LINUX/WINDOWS)
118 0
|
Java Windows
JDK windows加载字体文件的函数
JDK windows加载字体文件的函数
87 0
|
Windows
Windows下实现gettimeofday()函数
Windows下实现gettimeofday()函数
333 0