问高手--圆滑边角Panel的显示问题,来者有份

yuanreid 2003-01-21 11:26:51
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);
SetWindowRgn(Panel1->Handle,hRgnR,TRUE);
Form1->Repaint();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
struct tagLOGBRUSH lplb;
lplb.lbColor = clBlack;
lplb.lbStyle = BS_SOLID;
HBRUSH hbr = CreateBrushIndirect(&lplb);

HDC hdc = GetDC(Panel1->Handle);

HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);
if(FrameRgn(hdc, hRgnR, hbr, 1, 1))
Caption = "FrameRgn is OK";
else
Caption = "FrameRgn failed";
//if(PaintRgn(hdc, hRgnR1))
// Caption = "OK";
}
...全文
52 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
TopCat 2003-01-21
  • 打赏
  • 举报
回复
不可能,我测试过的。下面是我的测试代码,BCB6+Win2000:
----------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);
SetWindowRgn(Panel1->Handle,hRgnR,TRUE);
// Form1->Repaint();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormPaint(TObject *Sender)
{
struct tagLOGBRUSH lplb;
lplb.lbColor = clBlack;
lplb.lbStyle = BS_SOLID;
HBRUSH hbr = CreateBrushIndirect(&lplb);

HDC hdc = GetDC(Panel1->Handle);

HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);

//加了这一句
UpdateWindow(Panel1->Handle);

if(FrameRgn(hdc, hRgnR, hbr, 1, 1))
Caption = "FrameRgn is OK";
else
Caption = "FrameRgn failed";
//if(PaintRgn(hdc, hRgnR1))
// Caption = "OK";

}
//---------------------------------------------------------------------------
我不懂电脑 2003-01-21
  • 打赏
  • 举报
回复
在Panel刷新时重画
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
TopCat(令狐虫),还是无效!
weibz0525 2003-01-21
  • 打赏
  • 举报
回复
好象是鼠标放到最大化按钮上然后再离开就可以重画,但不知道为什么?我也试了好办天
fancy_zhh 2003-01-21
  • 打赏
  • 举报
回复
不懂,学
TopCat 2003-01-21
  • 打赏
  • 举报
回复
在FormPaint的最后加上一句:
UpdateWindow(Panel1->Handle);
即可。
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
而且将Paint事件的代码加在Create事件里面,效果也是一样
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
可能是我描述的不清除,以上代码执行后,Panel并没有被画出边界,好像Paint事件执行没有什么效果。需要将界面最大或脱动一下才能把panel的边界画出来!大家可以试试,谢谢。
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
谢谢孙大哥亲自出面,但是试了一下,效果一样啊!
Wingsun 2003-01-21
  • 打赏
  • 举报
回复
HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);
SetWindowRgn(Panel1->Handle,hRgnR,TRUE);
Form1->Repaint();
修改为:

HRGN hRgnR = CreateRoundRectRgn(0, 0, Panel1->Width, Panel1->Height, 30, 30);
SetWindowRgn(Panel1->Handle,hRgnR,TRUE);
Repaint();
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
为什么每次需要人工刷新一下界面(比如最大化后)才能把边界画出来?
yuanreid 2003-01-21
  • 打赏
  • 举报
回复
Libran()和 TopCat(令狐虫)的方法都可以,谢谢
Libran 2003-01-21
  • 打赏
  • 举报
回复
不论是Application->ProcessMessages()或者UpdateWindow(Panel1->Handle)都行,只是一定要放在FrameRgn(。。。)函数之前即可
Libran 2003-01-21
  • 打赏
  • 举报
回复
在OnPaint事件响应代码的最前面加一句:
void __fastcall TForm1::FormPaint(TObject *Sender)
{
Application->ProcessMessages(); //加这句
struct tagLOGBRUSH lplb;
。。。。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧