在再使用TrackRubberBand函数画虚线框的时候 ,使用的是主体Form的hWnd,在VC中的显示与BC中的显示效果不一致,
分析了窗口风格后,原来 Window Styles中的2个属性引起的:
WS_CLIPCHILDREN
0x02000000L
在父窗口中进行绘制时,排除子窗口占用的区域。创建父窗口时使用此样式。
WS_CLIPSIBLINGS
0x04000000L
当特定子窗口收到 WM_PAINT消息时,WS_CLIPSIBLINGS样式会剪切要更新的子窗口区域之外的所有其他重叠子窗口。如果未指定WS_CLIPSIBLINGS并且子窗口重叠,则在子窗口的客户区域内绘制时,可以在相邻子窗口的客户区域内绘制。
(图1)不使用这个2个属性的交易,虚线框画在Button上面

(图2) 使用了这个风格的窗体,虚线框在按钮button的下面

so,要怎么在Bcb中修改默认的窗口属性,暂时没有看到可以编辑的地,不如VC自由度高,所以要使用重载函数来处理:
重载virutal 函数,取消这2个style
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
TForm::CreateParams(Params);
Params.Style &=~WS_CLIPCHILDREN;
Params.Style &=~WS_CLIPSIBLINGS;
}
找到原因,最后就是我要的效果,虚线框不会画在子控件下面了:
(图3)

认真学习,扎实技术。勿在浮沙筑高台!!!
博客讲述了在使用TrackRubberBand函数画虚线框时,由于Windows风格WS_CLIPCHILDREN和WS_CLIPSIBLINGS的影响,导致在BCB和VC中显示效果不一致。通过分析窗口风格,发现这两个属性是问题所在。为了解决这个问题,作者在BCB中重载了CreateParams函数,清除这俩风格,实现了虚线框正确显示。博客强调了深入理解和扎实技术的重要性。
3653

被折叠的 条评论
为什么被折叠?



