TMyWavePaintBox是继承TPaintBox的一个VCL。procedure TWYWavePaintBox.MyPaint;
var
tempHDC:HDC;
tempOldBitmap:HGDIOBJ;
tempNewBitmap:HGDIOBJ;
begin
tempHDC:=CreateCompatibleDC(self.Canvas.Handle);
tempNewBitmap:=CreateCompatibleBitmap(tempHDC,self.Width,self.Height);
tempOldBitmap:=SelectObject(tempHDC,tempNewBitmap);
BitBlt(tempHDC,0,0,self.Width,self.Height,self.Canvas.Handle,self.Width,self.Height,SRCCOPY);
//此时的tempNewBitmap应该是对self.canvas抓屏的的结果了吧。但什么也没有???
BitBlt(self.Canvas.Handle,tempCopyX,0,tempCopyWidth,tempCopyHeight,self.m_Canvas2.Handle,0,0,SRCCOPY);
self.Canvas.MoveTo(tempX,tempUpY);
self.Canvas.LineTo(tempX,tempDownY);
SelectObject(tempHDC,tempOldBitmap);
DeleteObject(tempNewBitmap);
DeleteObject(tempHDC);
end;
var
tempHDC:HDC;
tempOldBitmap:HGDIOBJ;
tempNewBitmap:HGDIOBJ;
begin
tempHDC:=CreateCompatibleDC(self.Canvas.Handle);
tempNewBitmap:=CreateCompatibleBitmap(tempHDC,self.Width,self.Height);
tempOldBitmap:=SelectObject(tempHDC,tempNewBitmap);
BitBlt(tempHDC,0,0,self.Width,self.Height,self.Canvas.Handle,self.Width,self.Height,SRCCOPY);
//此时的tempNewBitmap应该是对self.canvas抓屏的的结果了吧。但什么也没有???
BitBlt(self.Canvas.Handle,tempCopyX,0,tempCopyWidth,tempCopyHeight,self.m_Canvas2.Handle,0,0,SRCCOPY);
self.Canvas.MoveTo(tempX,tempUpY);
self.Canvas.LineTo(tempX,tempDownY);
SelectObject(tempHDC,tempOldBitmap);
DeleteObject(tempNewBitmap);
DeleteObject(tempHDC);
end;
第一步:得到某Window的HDC
第二步:创建新Canvas,同步Handle到HDC
第三步:Canvas都得到了,你该干嘛干嘛!