关于从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; 展开
如下:
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; 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询