寻求高人将C++代码转换为C#代码
程序中首先应用方法二对图片双向扫描,产生轮廓坐标点数组,然后在图片轮廓内应用方法一将内凹部分抠去,最后才用多边形区域创建函数抠去图片外围部分。程序如下:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
register int x,y;
int l,r;
POINT *a;
bool lb,rb;
HRGN WndRgn,TempRgn,tepRgn;
Width=800;Height=600;
if((a=(POINT *)malloc(800*4*(sizeof(POINT))))==NULL)
{
ShowMessage("申请内存失败!");
exit(0);
}
Image1->Picture->LoadFromFile(".\\face.bmp");
Width=Image1->Width;
Height=Image1->Height;
Repaint();
l=0;r=Image1->Height*2-1;
WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);
< //应用方法二产生轮廓坐标点数组
for(y=0;y<Image1->Height;y++)
{
lb=true;
for(x=0;x<Image1->Width;x++)
if(Image1->Canvas->Pixels[x][y]!=clWhite)
{
a[l].x=x+1;
a[l].y=y;
lb=false;
break;
}
if(lb) a[l]=a[l-1];
l++;
rb=true;
for(x=Image1->Width-1;x>=0;x--)
if(Image1->Canvas->Pixels[x][y]!=clWhite)
{
a[r].x=x;
a[r].y=y;
rb=false;
break;
}
if(rb) a[r]=a[r+1];
r--;
}
//应用方法一抠去图片内凹部分
r=Image1->Height*2-1;
for(y=0;y<Image1->Height;y++){
for(x=a[y].x;x<a[r].x;x++)
if(Image1->Canvas->Pixels[x][y]==clWhite)
{
< tepRgn=CreateRectRgn(x,y,x+1,y+1);
CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR);
DeleteObject(tepRgn);
}
r--;
}
//将图片外围部分抠去
TempRgn=CreatePolygonRgn(a,Image1->Height*2,ALTERNATE);
CombineRgn(WndRgn,WndRgn,TempRgn,RGN_AND);
DeleteObject(TempRgn);
free(a);
//显示不规则窗体
SetWindowRgn(Handle,WndRgn,true);
SetWindowPos(Handle,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
}
原文地址:http://cnprogram.diy.myrice.com/article/cbuilder/cbuilder58.html
没空帮忙的帮忙顶顶,谢谢!
问题点数:30、回复次数:11Top
1 楼qiezic(破晓)回复于 2005-07-19 17:16:25 得分 0
upTop
2 楼shrinerain(圣影雨)回复于 2005-07-19 18:44:03 得分 6
把::和->改.
指针改成相应类型。。。Top
3 楼zhilunchen(他山居士)回复于 2005-07-19 20:22:40 得分 6
两种语言不兼容,对照语法改改Top
4 楼qiezic(破晓)回复于 2005-07-20 09:28:58 得分 0
不知这三句在C#里怎么表达
< tepRgn=CreateRectRgn(x,y,x+1,y+1);
CombineRgn(WndRgn,WndRgn,tepRgn,RGN_XOR);
DeleteObject(tepRgn);Top
5 楼zjh135(aaa)回复于 2005-07-20 09:36:52 得分 6
为什么要改呢,C++是挺好的嘛,有些人写C++也写不好呢?再说,C++中的语法表现在C#是实现不了的或实现很难呢,首先一点就是C++能操作内存而C#是不能的,C++表现丰富C#并不是那样的!!!三思Top
6 楼qiezic(破晓)回复于 2005-07-20 11:27:40 得分 0
哎,我要是会C++就不用在这发帖了!
C++是好但是不会啊!Top
7 楼abiho(迷路的打工者(只有不会做的程序员,没有不讲道理的客户))回复于 2005-07-20 11:36:30 得分 6
你还是搜索一下C#实现不规则窗体的方法吧,我觉得C#实现更简单!Top
8 楼qiezic(破晓)回复于 2005-07-20 11:42:28 得分 0
C#实现不规则窗体的方法是很简单,但缺陷太大,比如背景图透明必须要求系统颜色深度小于24等。
现在我想自画边框,但是还的自己扫描颜色分界点,实在麻烦。
有人能帮我把上面的代码编译成C++的DLL文件让我在C#调用吗。
拜托了!Top
9 楼qiezic(破晓)回复于 2005-07-20 13:46:38 得分 0
upTop
10 楼qiezic(破晓)回复于 2005-07-20 15:25:53 得分 0
upTop
11 楼csdnzm(明飞)回复于 2005-07-21 13:03:05 得分 6
upTop




