⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 填充view.cpp

📁 一个关于wince下的绘图中对不规则图形的种子法填充的源代码
💻 CPP
字号:
// 填充View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "填充.h"

#include "填充Doc.h"
#include "填充View.h"

typedef struct CNewPoint 
{
    //CPoint point;
    int x;
    int y;
    int isflled;
    //bool isfilled;
}CNewPoint;

#include <stack>
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CDC *pDC;
	pDC = GetDC();
	int x,y;
x = point.x;
y = point.y;

    COLORREF fill_color = RGB(0,0,255);


  COLORREF   boundaryvalue;//底板颜色   
  int   x0,xl,xr,y0,xid;   
  bool   flag;//
  stack   <CNewPoint>   s;//操作数栈
  CNewPoint point_fill ;//= new CNewPoint();
  CNewPoint   p;//定义一个点
  point_fill.isflled = 1;//表示点未被画过
  point_fill.x = x;
  point_fill.y = y;

  boundaryvalue = pDC->GetPixel( x - 1, y);   
  s.push(point_fill);//将右键取得点(x,y)入栈   
    
  //********************当栈非空时循环   
  while(!s.empty())   
  {   
  p=s.top(); //将栈顶元素传值给p   
  s.pop(); //弹出栈顶元素   
  x=p.x; //记录点的x值   
  y=p.y; //记录点的y值   
    
  // TRACE("pop   x=%d,y=%d\n",x,y);     //其功能相当与c中的printf,仅在MFC调试中有用   
    
  pDC->SetPixel(x,y,fill_color);//将点(x,y)填充   
  x0=x+1; //向右移一个像素   
    
  while(pDC->GetPixel(x0,y)==boundaryvalue&& pDC->GetPixel(x0,y) != fill_color)//当点(x0,y)的像素值等于底板像素值时,循环   
  {   
  pDC->SetPixel(x0   ,y   ,fill_color);   //将点(x0,y)填充   
  x0++; //向右移一个像素,循环--继续填充,直至到边界点   
  }   
    
    
  xr=x0-1;//xr为右边界点的左边一个点的x值,记录用   
  x0=x-1;   //x0变成原种子点p左一个点的x值   
    
  while(pDC->GetPixel(x0,y)==boundaryvalue && pDC->GetPixel(x0,y) != fill_color)//当点(x0,y)的像素值等于底板像素值时,循环   
  {   
  pDC->SetPixel(x0   ,y   ,fill_color);//将点(x0,y)填充   
  x0--;//向左移一个像素,循环--继续填充,直至到边界点   
  }  
  
  xl=x0+1;   //xl为左边界点的右边一个点的x值,记录用   

  y0=y;   //为y0赋值为y,与种子点的y值相等   
    
  for(int   i=1;i>=-1;i-=2)//做两次循环,之所以这样定义赋值,因为下面有变量要用到i的值   
  {   
  // MessageBox("");   
  x0=xr;   //将右边界左边一点的xr的值传给x0   
  y=y0+i;//y的值先加1,再减1,表示点下移一行,在下次循环时上移一行   
    
  while(x0>=xl)//当x0>=xl时循环   
  {   
  flag=FALSE;   
  while((pDC->GetPixel(x0,y)==boundaryvalue)   
  &&   (pDC->GetPixel(x0,y)!=fill_color)   
  &&   (x0>=xl))         //当点(x0,y)没被填充且不是边界   且   x0>=xl时   ---循环   
  {   
  if(!flag)               //如果flag为false   
  {   
  flag=TRUE;     //将flag改为ture   
  xid=x0;           //xid赋值为x0,xid作为记录x0用   
  }   
  x0--;                       //点(x0,y)   每次循环左移一点   
  }   
    
  if(flag)//当flag为ture时   
  { 
      point_fill.y = y;
      point_fill.x = xid;
  s.push(point_fill);     //将点(xid,y)入栈   
  // TRACE("push   x=%d,y=%d\n",xid,y);     //其功能相当与c中的printf,仅在MFC调试中有用   
  flag=FALSE;                           //然后在将flag置为false   
  }  
  
  while(((pDC->GetPixel(x0,y)!=boundaryvalue)&&(pDC->GetPixel(x0,y)!=fill_color)) ||
         (pDC->GetPixel(x0,y) == fill_color))
  {
      if (x0 < 0)
      {
          break;
      }
      x0--;
  }
     //当点(x0,y)是边界   或者   填充过时,(x0,y)   向左移一点   
  }//end   of   while(x0>=xl)   
    
  }//end   of   for(int   i=1;i>=-1;i-=2)   
    
  }//end   of   while(!s.empty())   
    
  //**********************************   
  
	CView::OnLButtonDown(nFlags, point);
}

void CMyView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
		CClientDC dc(this);
	
		dc.Rectangle(CRect(10,10,100,100));
		dc.Rectangle(CRect(15,15,125,125));
		dc.Rectangle(CRect(30,30,130,130));
	
	CView::OnRButtonDown(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -