关于继承自TGraphicControl的控件在位置变动后无法正确显示的问题

alloutoflove alloutoflove 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我写了一个类继承自TGraphicControl, 在运行时动态生成该控件( 没有经过注册, 只是用标准C++的继承 )
控件显示没问题... 但当在运行时更改其Left/Top属性移动其位置, 则显示不完整, 显示区域被限制在0, 0, Width, Height这样的区域里...
想来是因为Paint里给的Canvas的区域被限制了, 但看了一下TWinControl的PaintControls里的处理又是正常的(根据控件的Left/Top/Width/Height来自动限制), 原Paint函数处理如下:

TRect rt( Left, Top, Left + Width, Top + Height );

Canvas->Brush->Color = clWhite;
Canvas->FrameRect( rt );

rt.left++;
rt.top++;
rt.right--;
rt.bottom--;
Canvas->Brush->Color = clBlack;
Canvas->FrameRect( rt );

rt.left++;
rt.top++;
rt.right--;
rt.bottom--;
Canvas->Brush->Color = clWhite;
Canvas->FrameRect( rt );


于是我又尝试用API来画, DC还是用的Canvas的Handle, 问题依旧.... 所以就直接用其父窗口的整个区域DC去绘制, 结果就OK了...代码如下

HDC dc = GetDC( Parent->Handle );
TBrush *pBrush = new TBrush;
pBrush->Style = bsClear;
TPen *pPen = new TPen;

pPen->Color = clWhite;
SelectObject( dc, pBrush->Handle );
SelectObject( dc, pPen->Handle );
Rectangle( dc,
Left,
Top,
Left + Width,
Top + Height );

pPen->Color = clBlack;
SelectObject( dc, pPen->Handle );
Rectangle( dc,
Left + 1,
Top + 1,
Left + Width - 1,
Top + Height - 1 );

pPen->Color = clWhite;
SelectObject( dc, pPen->Handle );
Rectangle( dc,
Left + 2,
Top + 2,
Left + Width - 2,
Top + Height - 2 );

ReleaseDC( Parent->Handle, dc );
delete pBrush;
delete pPen;



希望有朋友帮忙回答下是为什么...
...全文

相关推荐

评论 8
收藏 已收藏
分享
返回顶部