关于从BMP图片绘制不规则窗体的一段代码的解释问题

正在研究Delphi写点小东西,做不规则的窗体,看到如下代码,大部分都能读懂,只有在两个for循环里的第二个if里面的那三个LineTo看不懂如下:LineTo(dc,p... 正在研究Delphi写点小东西,做不规则的窗体,看到如下代码,大部分都能读懂,只有在两个for循环里的第二个if里面的那三个LineTo看不懂
如下:
LineTo(dc, p.X, y);
LineTo(dc, p.X + 1, y);
LineTo(dc, p.X + 1, p.Y);
我的理解是第一个LineTo是把这一列中有像素的点画出来,但第二第三个LineTo是干嘛用的?
我试着把第二第三个LineTo注释掉,结果图案能画出来,但窗体就跟不存在似的,一点就点到后面的窗口去了。而我留下第一第三个把第二个去掉,结果好像跟三句都有差不多。
我就想问问这三个LineTo分别是做什么用的,合起来有什么效果?

代码如下
procedure CreateRgnForm(Bmap: TBitMap; WColor: TColor; hand: THandle);
// 貌似以[0,0]处像素的颜色作为基准色了...
var
rgn: HRgn;
dc, cdc: HDC;
x, y: integer;
p: Tpoint;
line: boolean;
color: Tcolor;
begin
dc := GetWindowDc(hand);
cdc := CreateCompatibleDc(dc);
SelectObject(cdc, Bmap.Handle);
//WColor := Img.Picture.Bitmap.Canvas.Pixels[0, 0];
//WColor := GetPixel( cdc, 0, 0 );
BeginPath(dc);
for x := 0 to Bmap.Width - 1 do
begin
line := false;
for y := 0 to Bmap.Height - 1 do
begin
color := GetPixel(cdc, x, y);
if not (color = WColor) then
begin
if not line then
begin
line := true;
p.X := x;
p.Y := y;
end;
end;

if (color = WColor) OR (y=Bmap.Height - 1) then
begin
if line then
begin
line := false;
MoveToEx(dc, p.X, p.Y, nil);
LineTo(dc, p.X, y);
LineTo(dc, p.X + 1, y);
LineTo(dc, p.X + 1, p.Y);
// LineTo(dc, x, y);
CloseFigure(dc);
end;
end;
end;
end;
EndPath(dc);
Rgn := PathToRegion(dc);
ReleaseDc(hand, dc);
SetWindowRgn(hand , rgn, true);
end;
展开
 我来答
大白胖胖33
2011-02-02 · TA获得超过147个赞
知道小有建树答主
回答量:237
采纳率:50%
帮助的人:87.6万
展开全部
好像就为了画出满足if的那个像素点,画线不能只在一个点上画,故多取了下一个点。这也是第二句无作用的缘故。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式