📄 ptctrl_fill.cpp
字号:
#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 + -