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

📄 ptctrl_fill.cpp

📁 wince下的画图程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "PtCtrl_Fill.h"

#include "CEPaint.h"

#include "PtBmpFun.h"

#include <afx.h>

PtCtrl_Fill g_ptctl_fill;

extern BYTE gBmp_Bits[];

//

BYTE gFill_Bits[(PT_PIC_MAX_SIZE_X+2)*(PT_PIC_MAX_SIZE_Y+2)];

INT gFill_Loc = 0;
INT gFill_Stack[2*PT_PIC_MAX_SIZE_X];
INT gFill_Stack_Count = 0;

INT gFill_Wid = 0;
INT gFill_Hei = 0;

typedef VOID (*Fill_By_Dir)();

VOID Fill_By_Dir_r();

VOID Fill_By_Dir_d();

VOID Fill_By_Dir_l();

VOID Fill_By_Dir_u();

//
VOID Move_Prev();

BYTE gDir_Turn = 0;

INT  gDir_Loc_Beyond[] = 
{
	1,
	0,
	-1,
	0,

	1,
	0,
	-1,
	0,
};


INT  gDir_Loc_Prev[] = 
{
	-1,
	0,
	1,
	0,
};

Fill_By_Dir gDirFun_Next = NULL;

//INT gDirFun_Idx = 0;

Fill_By_Dir gDirFun_Table[] = 
{
	Fill_By_Dir_r,
	
	Fill_By_Dir_d,
	
	Fill_By_Dir_l,
	
	Fill_By_Dir_u,

};

Fill_By_Dir gDirFun_Ref[4] = 
{ 
	Fill_By_Dir_r,
		
	Fill_By_Dir_d,

	Fill_By_Dir_l,

	Fill_By_Dir_u,
	
};


//////////////////////////////////////////////////////////////////////////

INT InitPbCtrl_Fill(PtCtrl_Fill *pPtCtrl_Fill)
{
    InitPbCtrlBase((PtCtrlBase*)pPtCtrl_Fill);
	
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_Init = PtCtrl_Fill_Init;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_Destroy = PtCtrl_Fill_Destroy;
	
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnPaintStart = PtCtrl_Fill_OnPaintStart;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnPaintEnd = PtCtrl_Fill_OnPaintEnd;
	
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnStyleChange = PtCtrl_Fill_OnStyleChange;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnColorChange = PtCtrl_Fill_OnColorChange;
	
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnMouseDown = PtCtrl_Fill_OnMouseDown;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnMouseMove = PtCtrl_Fill_OnMouseMove;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnMouseRelease = PtCtrl_Fill_OnMouseRelease;

	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnDrawBoard = PtCtrl_Fill_OnDrawBoard;
	pPtCtrl_Fill->m_ptctrl_base.PtCtrl_OnDrawStyle = PtCtrl_Fill_OnDrawStyle;
		
	return 0;
}

INT PtCtrl_Fill_Init(PtCtrlBase* pPtCtrl,INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_Init(pPtCtrl);

	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
	
	pPtCtrl_Fill->m_ptctrl_base.m_ctrl_id = PtCtrlType_Fill;

	pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_Nothing;
	
	pPtCtrl_Fill->cx = -1;
	pPtCtrl_Fill->cy = -1;

	pPtCtrl_Fill->m_pen = NULL;
	
	pPtCtrl_Fill->m_bit_ptr = NULL;
	pPtCtrl_Fill->m_buf_dc = NULL;
	pPtCtrl_Fill->m_buf_bitmap = NULL;

	pPtCtrl_Fill->m_init_draw_flag = FALSE;
	
	return 0;
}

INT PtCtrl_Fill_Destroy(PtCtrlBase* pPtCtrl, INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_Destroy(pPtCtrl);
   
    PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;

	if(pPtCtrl_Fill->m_pen != NULL)
		DeleteObject(pPtCtrl_Fill->m_pen);

	return 0;
}

INT PtCtrl_Fill_OnPaintStart(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnPaintStart(pPtCtrl);

	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
	
	pPtCtrl->PtCtrl_OnColorChange(pPtCtrl,m_pt_app_info.m_color_cur,m_pt_app_info.m_color_bk_cur);
	

	if(pPtCtrl_Fill->m_buf_dc)
	{
		DeleteDC(pPtCtrl_Fill->m_buf_dc);
        pPtCtrl_Fill->m_buf_dc = NULL;
	}

	if(pPtCtrl_Fill->m_buf_bitmap)
	{
		DeleteObject(pPtCtrl_Fill->m_buf_bitmap);
        pPtCtrl_Fill->m_buf_bitmap = NULL;
	}

	pPtCtrl_Fill->m_init_draw_flag = FALSE;

	return 0;
}

INT PtCtrl_Fill_OnPaintEnd(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnPaintEnd(pPtCtrl);

	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
    
    pPtCtrl_Fill->cx = -1;
	pPtCtrl_Fill->cy = -1;

	pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_Nothing;
	

	return 0;
}

INT PtCtrl_Fill_OnStyleChange(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnStyleChange(pPtCtrl,tx);
	
	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
	
	
	return 0;
}

INT PtCtrl_Fill_OnColorChange(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnColorChange(pPtCtrl,tx,ty);
	
	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
	
	if(pPtCtrl_Fill->m_pen != NULL)
		DeleteObject(pPtCtrl_Fill->m_pen);

	pPtCtrl_Fill->m_pen = CreatePen(PS_SOLID,0,m_pt_app_info.m_color_cur);
	
	
	return 0;
}


INT PtCtrl_Fill_OnMouseDown(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnMouseDown(pPtCtrl);
    
	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;

	if(tx < 0 && ty < 0)
		pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_SetBkPixel;
	else
		pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_SetPixel;
    
	tx = abs(tx);
	ty = abs(ty);

	pPtCtrl_Fill->m_ptctrl_base.m_cx = tx;
	pPtCtrl_Fill->m_ptctrl_base.m_cy = ty;

	pPtCtrl_Fill->cx = tx;
    pPtCtrl_Fill->cy = ty;

	PtCtrl_Fill_OnFill(pPtCtrl,tx,ty);

	m_pt_app_info.m_pt_board_flag |= PT_BOARD_FLAG_RELOAD;//|PT_BOARD_FLAG_PTCTRL;
	//InvalidateRect(m_pt_app_info.m_pt_board_hwnd, &m_pt_app_info.m_pt_board_rect,FALSE);
    RECT rt;
	
	GetWindowRect(GetDlgItem(m_pt_app_info.m_main_win_hwnd,IDC_SC_BOARD),&rt);
	OffsetRect(&rt,-rt.left,-rt.top);
	RedrawWindow(m_pt_app_info.m_pt_board_hwnd,&rt,NULL,RDW_INVALIDATE);


	TRACE(L"On Mouse Down\n");
	
	return 0;
}

INT PtCtrl_Fill_OnMouseMove(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnMouseMove(pPtCtrl);

	if(pPtCtrl->m_mouse_state & PT_MOUSE_DOWN)
	{
		TRACE(L"OnMouseMove\n");

		PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
		pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_LinkLine;
		
		pPtCtrl_Fill->cx = tx;
		pPtCtrl_Fill->cy = ty;
		
				
		InvalidateRect(m_pt_app_info.m_pt_board_hwnd, &m_pt_app_info.m_pt_board_rect,FALSE);
		
	}
	

	return 0;
}

INT PtCtrl_Fill_OnMouseRelease(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnMouseRelease(pPtCtrl);


	return 0;
}


INT PtCtrl_Fill_OnDrawBoard(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	TRACE(L"PtCtrl_Fill_OnDrawBoard Start\n");

	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;
	
	if(pPtCtrl_Fill->m_opt_flag != PtCtrl_Fill_SetPixel && pPtCtrl_Fill->m_opt_flag != PtCtrl_Fill_SetBkPixel)
		return 1;
	
    
	StretchBlt(pPtCtrl->m_pdc,
		0,0,
		m_pt_app_info.m_pt_draw_rect.right,m_pt_app_info.m_pt_draw_rect.bottom,
		m_pt_app_info.m_pt_backup_hdc,
		m_pt_app_info.m_pt_bakup_pos.x,m_pt_app_info.m_pt_bakup_pos.y,
		m_pt_app_info.m_pt_draw_rect.right>>m_pt_app_info.m_pt_zoom_size,m_pt_app_info.m_pt_draw_rect.bottom>>m_pt_app_info.m_pt_zoom_size,
		SRCCOPY);
	
	pPtCtrl_Fill->m_opt_flag = PtCtrl_Fill_Nothing;
	return 0;
}

INT PtCtrl_Fill_OnDrawStyle(PtCtrlBase* pPtCtrl,  INT tx /* = -1 */, INT ty /* = -1 */)
{
	PtCtrlBase_OnDrawStyle(pPtCtrl,tx);
	PtCtrl_Fill *pPtCtrl_Fill = (PtCtrl_Fill*)pPtCtrl;

	
	return 0;
}

/*

*/

VOID Fill_By_Dir_r()
{
	
	//TRACE("Fill_By_Dir_r start x = %d ,y = %d \n", gFill_Loc % gFill_Wid ,gFill_Loc / gFill_Wid);
	
	INT step = 1;
	
	INT loc = gFill_Loc + 1;
	
	while(1)
	{
		
		gFill_Bits[gFill_Loc] = 0x04; //0000 01 00 B
		
		if(gFill_Bits[loc])
			break;
		
		gFill_Loc = loc;
		loc += step;
			
	}
	
	if(gFill_Stack[gFill_Stack_Count-1] != gFill_Loc)
	{
		gFill_Stack[gFill_Stack_Count] = gFill_Loc;
	    gFill_Stack_Count ++;
	}

	
	if(gDir_Turn)
	{
		if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[3]])
			gDirFun_Next = gDirFun_Table[3];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[1]])
		{
			gDir_Turn = 0;
			gDirFun_Next = gDirFun_Table[1];
		}
		else 
			gDirFun_Next = NULL;
	}
	else
	{
		if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[1]])
			gDirFun_Next = gDirFun_Table[1];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[3]])
		{
			gDir_Turn = 1;
			gDirFun_Next = gDirFun_Table[3];
		}
		else 
			gDirFun_Next = NULL;
	}

	
	//TRACE("Fill_By_Dir_r end x = %d ,y = %d , idx= %d\n", gFill_Loc%gFill_Wid,gFill_Loc/gFill_Wid,gFill_Bits[gFill_Loc]);
}


VOID Fill_By_Dir_d()
{
    //TRACE("Fill_By_Dir_d start x = %d ,y = %d \n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid);
	
	INT step = gFill_Wid;
	
    INT	loc = gFill_Loc + gFill_Wid;
	
	while(1)
	{
		
		gFill_Bits[gFill_Loc] = 0x05; //0000 01 01 B
		
		if(gFill_Bits[loc]) //1100 0000
			break;
		
		gFill_Loc = loc;
		loc += step;
	}

	if(gFill_Stack[gFill_Stack_Count-1] != gFill_Loc)
	{
		gFill_Stack[gFill_Stack_Count] = gFill_Loc;
		gFill_Stack_Count ++;
	}

	
	if(gDir_Turn)
	{
		if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
			gDirFun_Next = gDirFun_Table[0];

⌨️ 快捷键说明

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