(求助)BitBlt函数中HDC的声明和IsEmpty()的调用
void __fastcall TForm1::Button5Click(TObject *Sender) // 从上下到中间{PaintBox1 -> Refresh();hdc1 = Image1 -> Canvas -> Handle; //获得源设备环境句柄hdc2 = PaintBox1 -> Canvas -> Handle; // 获得目标设备环境句柄for(int i = 0; i <= Image1 -> Height/2 + 1; i++) { BitBlt(hdc2, 0, i, Image1 -> Width, i, hdc1, 0, i, SRCCOPY); //将源图像上半部分从上往下用SRCCOPY函数复制到目标图像的上半部分 BitBlt(hdc2, 0, Image1 -> Height-i, Image1 -> Width, Image1 -> Height, hdc1, 0, Image1 -> Height-i, SRCCOPY); //将源图像的下半部分从下往上用 SRCCOPY函数复制到目标图像的下半部分 Sleep(10); //relay 10 milisecs }}void __fastcall TForm1::N3Click(TObject *Sender) //save the image{if(!CurrentFile.IsEmpty())Image1 -> Picture -> SaveToFile(CurrentFile); //save if already nameedelse A1Click(Sender); //otherwise get a name}HDC hdc1 = Image1 -> Canvas -> Handle; //获得源设备环境句柄HDC hdc2 = PaintBox1 -> Canvas -> Handle; // 获得目标设备环境句柄
[解决办法]
以后遇到这样的情况,从网上复制来的代码片段不完整时,教你一个猜对象类型的方法:
hdc = Image1 -> Canvas -> Handle;
这一行来说,反查即可,Image1明显是一个TImage对象,TImage的Canvas属性是一个TCanvas对象,而TCanvas的Handler属性,是一个HDC类型的,所以,hdc就是一个HDC类型的对象。