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

📄 ptctrl_fill.cpp

📁 wince下的画图程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
		{
			gDir_Turn = 0;
			gDirFun_Next = gDirFun_Table[2];
		}
		else 
			gDirFun_Next = NULL;
	}
	else
	{
		if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
			gDirFun_Next = gDirFun_Table[2];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
		{
			gDir_Turn = 1;
			gDirFun_Next = gDirFun_Table[0];
		}
		else 
			gDirFun_Next = NULL;
	}

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


VOID Fill_By_Dir_l()
{
	//TRACE("Fill_By_Dir_l 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] = 0x06; //0000 01 10 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[1]])
			gDirFun_Next = gDirFun_Table[1];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[3]])
		{
			gDir_Turn = 0;
			gDirFun_Next = gDirFun_Table[3];
		}
		else 
			gDirFun_Next = NULL;
	}
	else
	{
		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 = 1;
			gDirFun_Next = gDirFun_Table[1];
		}
		else 
			gDirFun_Next = NULL;
	}

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


VOID Fill_By_Dir_u()
{

	//TRACE("Fill_By_Dir_u 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] = 0x07; //0000 01 11 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[2]])
			gDirFun_Next = gDirFun_Table[2];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
		{
			gDir_Turn = 0;
			gDirFun_Next = gDirFun_Table[0];
		}
		else 
			gDirFun_Next = NULL;
	}
	else
	{
		if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[0]])
			gDirFun_Next = gDirFun_Table[0];
		else if(!gFill_Bits[gFill_Loc + gDir_Loc_Beyond[2]])
		{
			gDir_Turn = 1;
			gDirFun_Next = gDirFun_Table[2];
		}
		else 
			gDirFun_Next = NULL;
	}
		
	//TRACE("Fill_By_Dir_u end x = %d ,y = %d , idx= %d\n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}


VOID Move_Prev()
{
	
	//TRACE("Move_Prev Start x = %d ,y = %d \n", gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid);

	static int cnt;

	INT step;
	
	INT dir;
    
	INT count;
	
	INT loc;
	
	INT loop;

	cnt = 0;
	
	while(gFill_Stack_Count > 1)
	{
// 		if(cnt++ > 1)
// 			break;

	    count = gFill_Stack[gFill_Stack_Count-2];
		
        dir = gFill_Bits[count] & 0x03;

		//TRACE("Move_Prev dir = %d\n", dir);

		step = gDir_Loc_Prev[dir];
		
		loc = gFill_Stack[gFill_Stack_Count-1];// + step;
        
		while(loc != count)
		{
			//TRACE("Move_Prev loc x = %d ,y = %d , idx= %d\n", loc%gFill_Wid ,loc/gFill_Wid , gFill_Bits[loc]);
            
			for(loop = 1; loop < 4; loop ++)
			{
				if(!gFill_Bits[loc + gDir_Loc_Beyond[loop + dir]])
					break;
			}
			
			if(loop < 4)
				break;

			loc += step;
		}
		
		//TRACE("Move_Prev loop = %d ,count = %d\n",loop,count);

		if(loc == count)
		{
			//TRACE("Move_Prev pop stack %d\n",gFill_Stack_Count);
			gFill_Stack_Count --;
		}
		else
		{
			//TRACE("Move_Prev push stack %d\n",loc);

			gFill_Stack[gFill_Stack_Count-1] = loc;
			break;
		}
	
		cnt++;
	}

	
	gFill_Loc = gFill_Stack[gFill_Stack_Count-1];
	
	
	if(gFill_Stack_Count > 1)
	{
       gDirFun_Next = gDirFun_Table[(dir + loop)%4];

	   if(loop < 4)
		   gDirFun_Next = gDirFun_Table[(dir + loop)%4];	
	   else
           gDirFun_Next = NULL;
	}
	else
	{  
		dir = gFill_Bits[gFill_Stack[0]] & 0x03;

		loc = gFill_Stack[0];

		for(loop = 1; loop < 4; loop ++)
		{
			if(!gFill_Bits[loc + gDir_Loc_Beyond[loop + dir]])
				break;
		}
		
		if(loop < 4)
	       gDirFun_Next = gDirFun_Table[(dir + loop)%4];	
		else
           gDirFun_Next = NULL;
	}
 
	//TRACE("Move_Prev end cnt = %d, x = %d ,y = %d , idx= %d\n", cnt, gFill_Loc%gFill_Wid ,gFill_Loc/gFill_Wid , gFill_Bits[gFill_Loc]);
}


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

	INT32 color;
	
	BYTE * pc = NULL;

	if(!pPtCtrl_Fill->m_init_draw_flag)
	{
		pPtCtrl_Fill->m_buf_dc = CreateCompatibleDC(m_pt_app_info.m_pt_backup_hdc);
	
		pPtCtrl_Fill->m_buf_bitmap = CreateDIBSection(pPtCtrl_Fill->m_buf_dc,
			&m_pt_app_info.m_bmp_file_info,
			DIB_RGB_COLORS,
			(void**)&pPtCtrl_Fill->m_bit_ptr,
			 NULL,0);

		SelectObject(pPtCtrl_Fill->m_buf_dc,pPtCtrl_Fill->m_buf_bitmap);

		pPtCtrl_Fill->m_init_draw_flag = TRUE;
	}
	
	
	BitBlt(pPtCtrl_Fill->m_buf_dc,
		0,0,
		m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
	    m_pt_app_info.m_pt_backup_hdc,
        0,0, 
		SRCCOPY);

	pc = pPtCtrl_Fill->m_bit_ptr;

// 	INT ret = GetDIBits(m_pt_app_info.m_pt_backup_hdc,
// 		m_pt_app_info.m_pt_backup_hbmp,
// 		0,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
// 		gBmp_Bits,
// 		&m_pt_app_info.m_bmp_file_info,
// 		DIB_RGB_COLORS);
	
	//memcpy(gBmp_Bits,pc,m_pt_app_info.m_bmp_file_info.bmiHeader.biSizeImage);

	memset(gFill_Bits,0x80,sizeof(gFill_Bits));
	
	color = GetPixel(m_pt_app_info.m_pt_backup_hdc,pPtCtrl_Fill->cx,pPtCtrl_Fill->cy);
	
	color = ((color >> 16) & 0x00ffffff) | (color & 0x0000ff00) | ((color << 16) & 0x00ffffff);
    
	
	gFill_Wid = m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth + 2;
	gFill_Hei = m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight + 2;
	
	INT idx = 0;
	
	INT loc = gFill_Wid;
	
	//BYTE * pc = gBmp_Bits; 
		
	for(INT i = 0 ; i < m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight; i++)
	{   
		loc ++;
		
		for(INT j = 0; j < m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth; j++)
		{
			if( color == (*(INT32*)pc & 0x00ffffff))
				gFill_Bits[loc] = 0x00;
			
			pc += 3;
			loc ++;
		}
		
		loc ++;
	}
	
//////////////////////////////////////////////////////////////////////////
	
	TRACE(L"Mouse %d %d\n",pPtCtrl_Fill->cx,pPtCtrl_Fill->cy);

	gFill_Loc = pPtCtrl_Fill->cx + 1 + gFill_Wid * (gFill_Hei - pPtCtrl_Fill->cy - 2);
	
	gFill_Stack[0] = gFill_Loc;
	gFill_Stack_Count = 1;
	
	gDirFun_Next = gDirFun_Table[0];
   	
	INT cnt1 = 0;
	INT cnt2 = 0;

	gDir_Turn = 0;

	gDir_Loc_Beyond[1] = gFill_Wid;
	gDir_Loc_Beyond[3] = -gFill_Wid;

	gDir_Loc_Beyond[5] = gFill_Wid;
	gDir_Loc_Beyond[7] = -gFill_Wid;
   
	gDir_Loc_Prev[1] = -gFill_Wid;
	gDir_Loc_Prev[3] = gFill_Wid;

	do
	{
		while(gDirFun_Next != NULL)
		{
			cnt1++;
			gDirFun_Next();

		}
		Move_Prev();
        cnt2++;
		
		
   	}while(gDirFun_Next != NULL);
	
    TRACE(L"stack over cnt1 = %d , cnt2 = %d, x = %d, y = %d\n",cnt1,cnt2,gFill_Loc % gFill_Wid , gFill_Loc / gFill_Wid ); 
	
	
//////////////////////////////////////////////////////////////////////////
	
	loc = gFill_Wid;
	
	//pc = gBmp_Bits;
	pc = pPtCtrl_Fill->m_bit_ptr;
	
	if(pPtCtrl_Fill->m_opt_flag == PtCtrl_Fill_SetPixel)
		color = (m_pt_app_info.m_color_cur >> 16) | (m_pt_app_info.m_color_cur &0x00ff00) | (m_pt_app_info.m_color_cur << 16);
	else
        color = (m_pt_app_info.m_color_bk_cur >> 16) | (m_pt_app_info.m_color_bk_cur &0x00ff00) | (m_pt_app_info.m_color_bk_cur << 16);
	
	cnt1 = 0;
	
	for(i = 0 ; i < m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight ; i++)
	{   
		loc ++;
		
		for(INT j = 0; j < m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth; j++)
		{
			if(gFill_Bits[loc] & 0x04 ) // 0000 0100
			{
				*(INT32*)pc &= 0xff000000;
				*(INT32*)pc |= color;
				cnt1++;
			}
			
			pc += 3;
			loc ++;
		}
		
		loc ++;
	}
	
	
	TRACE(L"fill count = %d\n" , cnt1);

//  	i = SetDIBitsToDevice(m_pt_app_info.m_pt_backup_hdc,0,0,
//  		m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
//  		0,0,
//  		0,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
//  		gBmp_Bits,&m_pt_app_info.m_bmp_file_info,
//  		DIB_RGB_COLORS);

	BitBlt(m_pt_app_info.m_pt_backup_hdc,
		   0,0,
		   m_pt_app_info.m_bmp_file_info.bmiHeader.biWidth,m_pt_app_info.m_bmp_file_info.bmiHeader.biHeight,
		   pPtCtrl_Fill->m_buf_dc,
		   0,0,
		   SRCCOPY);  
  		

	return 0;
}

⌨️ 快捷键说明

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