TCanvas是对HDC的封装
Delphi的VCL一般为TCOntrol/TWinControl(ActiveX不讨论)
TCanvas->HDC 所以肯定是和句柄联系在一起的,而在Delphi的TControl是可以没有自己的句柄的,但这时候仍然可以拥有Canvas (TControlCanvas) Delphi的TCanvas这个巧妙的封装可以节省系统资源,其秘密就在于纯Control的Parent(TWinCOntrol)必定不为空,这样对纯TControl.Canvas的操作,实际上是对TControl.Parent.Canvas的映射操作(详细的清参考TControlCanvas的实现)
因为TCanvas->HDC->HWND 所以TWinControl的TCanvas只有在拥有句柄之后才有效。也就是
Create->CreateParam->CreateWnd 之后才有效(对TControl就是Parent.HWND有效之后)