📄 填充view.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 + -