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

📄 vcimageview.cpp

📁 CONAXCA的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         max=maxn=0;
         for (i=0;i<256;i++) {
            pdib2->getpalette(i,&r,&g,&b);
            gray=(int) (0.30*r+0.59*g+0.11*b+0.5);
            if (gray>max) {
               maxn=i;
               max=gray;
	    }
            pdib1->setpalette(i,r,g,b);
         }
         cp=(BYTE*) &maxn;
      }
      else {
         dd=BGR(236,236,236);
         cp=(BYTE*) &dd;
      }
      if (area_na==0) {
         for (i=R0.y;i<R1.y;i++) {
            for (j=0,k=0;j<R1.x-R0.x;j++,k+=bpp) {
               memcpy(&buf2[k],cp,bpp);
            }
            pdib1->setimage(R0.x,i,R1.x-R0.x,1,buf2);
         }
	  }
      else {
         for (i=0;i<area_na;i+=2) {
            s=area_pa[i+1].x-area_pa[i].x+1;
            for (j=0,k=0;j<s;j++,k+=bpp) {
               memcpy(&buf2[k],cp,bpp);
            }
            pdib1->setimage(area_pa[i].x,area_pa[i].y,s,1,buf2);
         }
	  }
      delete pdib1;
      delete pdib2;
   }
   Invalidate();
}

void CVCImageView::OnMove(void) 
{
   CVCImageDoc* pDoc = GetDocument();
   if (pDoc->m_Process.GetPDib(0)==NULL)  return;
   rect_flag=0;
   area_flag=0;
   move_flag=1;
}

void CVCImageView::MoveImage(int X,int Y,int f)
{
   int   i,j,k,s,x,y,x1,y1,d;
   int   xx,yy,dd,pal[256][3];
   int   wid,hei,bpp,bpl;
   CDIB  *pdib2,*pdib1;
   BYTE  *buf,*p0,*p1;
   CClientDC dc(this);
  
   CVCImageDoc* pDoc = GetDocument();
   x =X-moveX0;
   y =Y-moveY0;
   if (f==0) {
      x1=x;     y1=y;      d=2;
   }
   else {
      x1=y1=d=0;
   }

   p0=pDoc->m_Process.GetPDib(0);
   p1=pDoc->m_Process.GetPDib(1);
   if (p1!=NULL) {
      pdib2= new CDIB(p1);
      pdib1= new CDIB(p0);
	  wid=pdib2->wid;
	  hei=pdib2->hei;
      bpl=pdib2->bpl;
      bpp=pdib2->bpp;
	  buf=(BYTE*) malloc(bpl);
      if (bpp==1) {
		  for (i=0;i<256;i++) 
             pdib2->getpalette(i,&pal[i][0],
			             &pal[i][1],&pal[i][2]);
	  }
      if (area_na>0) {
         k=0;
		 for (i=0;i<area_na;i+=2) {
	        s=area_pa[i+1].x-area_pa[i].x+1+2*d;
	        pdib2->getimage(x1+area_pa[i].x-d,
				             y1+area_pa[i].y,s,1,buf);
 	        pdib1->setimage(x +area_pa[i].x-d,
				             y +area_pa[i].y,s,1,buf);
            xx=x +area_pa[i].x-d;
			yy=y +area_pa[i].y;
            if ((xx>=wid)||(yy>=hei)) s=0;
			else if (xx+s>=wid) s=wid-xx;
            for (j=0,k=0;j<s;j++,k+=bpp) {
               if (bpp==1)
			      dd=RGB(pal[buf[k]][0],pal[buf[k]][1],
				                         pal[buf[k]][2]);
			   else
			      dd=RGB(buf[k+2],buf[k+1],buf[k]);
               dc.SetPixel(xx+j,yy,dd); 
			}
		 }
	  }
      if (area_na==0) {
	     for (i=R0.y-d;i<R1.y+d;i++) {
	        pdib2->getimage(x1+R0.x-d,y1+i,R1.x-R0.x+d+d,1,buf);
	        pdib1->setimage(x +R0.x-d,y +i,R1.x-R0.x+d+d,1,buf);
            xx=x +R0.x-d;		yy=y +i;
		    s=R1.x-R0.x+d+d;
            if ((xx>=wid)||(yy>=hei)) s=0;
			else if (xx+s>=wid) s=wid-xx;
            for (j=0,k=0;j<s;j++,k+=bpp) {
               if (bpp==1)
			      dd=RGB(pal[buf[k]][0],pal[buf[k]][1],pal[buf[k]][2]);
			   else
			      dd=RGB(buf[k+2],buf[k+1],buf[k]);
               dc.SetPixel(xx+j,yy,dd); 
			}
		 }
      }
	  free(buf);
      delete pdib1;
      delete pdib2;
   }
}

void CVCImageView::OnSize(UINT nFlags, CPoint point) 
{
	// TODO: add construction code here
	CVCImageDoc* pDoc = GetDocument();
    pDoc->m_Process.SetHWnd(m_hWnd);
}

void CVCImageView::OnLButtonDown(UINT nFlags, CPoint point) 
{
   if ((rect_flag+area_flag+move_flag==1)&&
	   (PointInDib(point.x,point.y)==NULL)) return;
   if (move_flag==1) {
      moveX0=point.x;         moveY0=point.y;
      moveX=point.x;          moveY=point.y;
      move_flag=2;
      return;
   }
   if ((rect_flag==1)&&(rect_n==0)) {
      rect_p[0].x=point.x;
      rect_p[0].y=point.y;
	  rect_n=1;
   }
   if ((area_flag==1)&&(area_n==0)) {
      area_p[0].x=point.x;
      area_p[0].y=point.y;
	  area_n=1;
   }
   CScrollView::OnLButtonDown(nFlags, point);
}

void CVCImageView::OnMouseMove(UINT nFlags, CPoint point) 
{
   CClientDC dc(this);
   int  nOldRop;
   	
   if ((rect_flag+area_flag+move_flag==1)&&
	   (PointInDib(point.x,point.y)==NULL)) return;
   if (move_flag==2) {
      if (abs(moveX-point.x)+abs(moveY-point.y)<3) return;
	  MoveImage(moveX,moveY,0);
      MoveImage(point.x,point.y,1);
      moveX=point.x;       moveY=point.y;
      return;
   }
   nOldRop=dc.SetROP2(R2_NOTXORPEN);
   if ((rect_flag==1)&&(rect_n>0)) {
      if (rect_n==2) {
         dc.MoveTo(rect_p[0].x,rect_p[0].y);
         dc.LineTo(rect_p[1].x,rect_p[0].y);
         dc.LineTo(rect_p[1].x,rect_p[1].y);
         dc.LineTo(rect_p[0].x,rect_p[1].y);
         dc.LineTo(rect_p[0].x,rect_p[0].y);
	  }
      rect_p[1].x=point.x;
      rect_p[1].y=point.y;
	  rect_n=2;
      dc.MoveTo(rect_p[0].x,rect_p[0].y);
      dc.LineTo(rect_p[1].x,rect_p[0].y);
      dc.LineTo(rect_p[1].x,rect_p[1].y);
      dc.LineTo(rect_p[0].x,rect_p[1].y);
      dc.LineTo(rect_p[0].x,rect_p[0].y);
   }
   if ((area_flag==1)&&(area_n>0)) {
	  if (abs(area_p[area_n-1].x-point.x)+
		  abs(area_p[area_n-1].y-point.y)>2) {
         area_p[area_n].x=point.x;
         area_p[area_n].y=point.y;
	     area_n++;
         dc.MoveTo(area_p[area_n-2].x,area_p[area_n-2].y);
         dc.LineTo(area_p[area_n-1].x,area_p[area_n-1].y);
	  }
   }
   dc.SetROP2(nOldRop);
   CScrollView::OnMouseMove(nFlags, point);
}

void CVCImageView::OnLButtonUp(UINT nFlags, CPoint point) 
{
   CClientDC dc(this);
   int  nOldRop;
   int  t;

   if ((rect_flag+area_flag+move_flag==1)&&
	   (PointInDib(point.x,point.y)==NULL)) return;
   if (move_flag==2) {
      MoveImage(moveX,moveY,0);
      MoveImage(point.x,point.y,1);
      moveX=point.x;      moveY=point.y;
      move_flag=0;
      Invalidate();
      return;
   }
   nOldRop=dc.SetROP2(R2_NOTXORPEN);
   if (rect_flag==1) {
      R0.x=rect_p[0].x;
      R0.y=rect_p[0].y;
      R1.x=rect_p[1].x;
      R1.y=rect_p[1].y;
      if (R0.x>R1.x) {
         t=R0.x;  R0.x=R1.x;  R1.x=t;
      }
      if (R0.y>R1.y) {
         t=R0.y;  R0.y=R1.y;  R1.y=t;
      }
      area_na=0;
      rect_flag=0;
   }
   if (area_flag==1) {
	  if (abs(area_p[0].x-point.x)+
		  abs(area_p[0].y-point.y)!=0) {
         area_p[area_n].x=area_p[0].x;
         area_p[area_n].y=area_p[0].y;
	     area_n++;
         dc.MoveTo(area_p[area_n-2].x,area_p[area_n-2].y);
         dc.LineTo(area_p[area_n-1].x,area_p[area_n-1].y);
	  }
      dot_n=LineToCode(area_p,dot);
      if (dot_n!=-1) {
         area_na=CodeToTable(dot,area_pa);
      }
      else area_na=0;
      area_flag=0;
   }
   dc.SetROP2(nOldRop);
   CScrollView::OnLButtonUp(nFlags, point);
}

int CVCImageView::LineCoor(int x,int y,int x1,int y1,POINT *dot)
{
  int t,dis,dx,dy,xerr=1,yerr=1,incx,incy;

  dx=x1-x;         dy=y1-y;
  if (dx>0)        incx=1;
  else if (dx==0)  incx=0;
  else             incx=-1;
  if (dy>0)        incy=1;
  else if (dy==0)  incy=0;
  else             incy=-1;
  dx=abs(dx);      dy=abs(dy);
  if (dx>dy)       dis=dx;
  else             dis=dy;
  for (t=0;t<dis+1;t++) {
    dot->x=x;      dot->y=y;
    dot++;
    xerr+=dx;      yerr+=dy;
    if (xerr>dis) {
      xerr-=dis;   x+=incx;
    }
    if (yerr>dis) {
      yerr-=dis;   y+=incy;
    }
  }
  return(dis+1);
}

int CVCImageView::LineToCode(POINT *area_p,int *dot)
{
   POINT *ddot;
   int  i,k,x,y,dx,dy,ddot_n;
   int  tab[3][3]={{5,6,7},{4,0,0},{3,2,1}};

   ddot=(POINT *) new char[MAX_NUM*sizeof(POINT)];
   if (ddot==NULL)  MessageBeep(0);
   ddot_n=0;
   for (i=0;i<area_n-1;i++) {
      x=area_p[i].x;     y=area_p[i].y;
      k=LineCoor(x,y,area_p[i+1].x,area_p[i+1].y,&ddot[ddot_n]);
      ddot_n+=(k-1);
      if (ddot_n>MAX_NUM-5) {
         return(-1);
      }
   }
   ddot[ddot_n].x=ddot[0].x;
   ddot[ddot_n].y=ddot[0].y;
   dot[0]=ddot[0].x;
   dot[1]=ddot[0].y;
   for (i=0,k=3;i<ddot_n;i++) {
      dx=ddot[i+1].x-ddot[i].x+1;
      dy=ddot[i+1].y-ddot[i].y+1;
      dot[k++]=tab[dy][dx];
   }
   dot[2]=k-3;
   delete ddot;
   return(ddot_n);
}

int CVCImageView::CodeToTable(int *dot,POINT *area_p)
{
   int  inc[8][2] = {
	 {+1, 0},{+1,+1},{ 0,+1},{-1,+1},
	 {-1, 0},{-1,-1},{ 0,-1},{+1,-1}  };
   int  nn[8][8]={
	/* 0 1 2 3 4 5 6 7            */
   	  {0,2,2,2,2,0,0,0},     /* 0 */
	  {0,2,2,2,2,3,0,0},     /* 1 */
	  {0,2,2,2,2,3,3,0},     /* 2 */
	  {0,2,2,2,2,3,3,3},     /* 3 */
	  {1,0,0,0,0,1,1,1},     /* 4 */
	  {1,3,0,0,0,1,1,1},     /* 5 */
	  {1,3,3,0,0,1,1,1},     /* 6 */
	  {1,3,3,3,0,1,1,1}  };  /* 7 */

   int  i,j,n,k,k1,ki,kj,d,dot_n1,max,min;
   int  *buff0,*buff1,nb;

   buff0=(int*) new int[MAX_NUM*sizeof(int)];
   buff1=(int*) new int[MAX_NUM*sizeof(int)];
   nb=0;
   n =dot[2];
   if (n == -1)  return -1;
   dot[n+3]=dot[3];
   ki=dot[0];   kj=dot[1];
   for (i=3;i<n+3;i++) {
      k=dot[i];          k1=dot[i+1];
      d=nn[k][k1];
      ki+=inc[k][0];     kj+=inc[k][1];
      if (d!=0) {
         buff0[nb]=ki;   buff1[nb++]=kj;
	 if (d==3) {
	    buff0[nb]=ki;        buff1[nb++]=kj;
	 }
      }
   }

   max=0;     min=1200;
   for (i=0;i<nb;i++) {
      if (buff1[i]>max)  max=buff1[i];
      if (buff1[i]<min)  min=buff1[i];
   }
   dot_n1=0;
   for (i=min;i<=max;i++) {
      for (j=0;j<nb;j++) {
         if (buff1[j]!=i)  continue;
         area_p[dot_n1].x   = buff0[j];
         area_p[dot_n1++].y = i;
      }
   }

   area_p[dot_n1].x=0;
   area_p[dot_n1].y=0;
   for (i=0;i<dot_n1;i++) {
      kj=area_p[i].y;
      for (n=i+1;kj==area_p[n].y;n++) {}
      n--;
      for (j=i;j<n;j++) {
         for (k=n-1;k>=j;k--) {
	    if (area_p[k].x>area_p[k+1].x) {
	       ki=area_p[k].x;
               area_p[k].x=area_p[k+1].x;
	       area_p[k+1].x=ki;
            }
         }
      }
      i=n;
   }
   delete buff0;
   delete buff1;
   if (dot_n1%2)  dot_n1--;
   return(dot_n1);
}

⌨️ 快捷键说明

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