请问在Winform中我在代码中添加控件,怎么样才能不让窗体频繁刷新?

7710703 2002-10-31 10:39:07
请问在Winform中我在代码中添加控件,怎么样才能不让窗体频繁刷新,而直到我让他刷新才全出来为止?
...全文
226 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
7710703 2002-11-07
  • 打赏
  • 举报
回复
哦,那我明白了,肯定是背景刷新的结果,谢谢dy_2000_abc(芝麻开门)兄和你的Mail!
dy_2000_abc 2002-11-07
  • 打赏
  • 举报
回复
承蒙夸奖,谢谢。
如果你说的闪烁现象是由窗体背景刷新引起的话,你可以禁止窗体背景刷新
窗体刷新消息是WM_ERASEBKGND(0x0014)
7710703 2002-11-06
  • 打赏
  • 举报
回复
dy_2000_abc(芝麻开门)兄,多次的麻烦你,真的很不好意思。事实上是这样的:我从CodeProject网站上下载了一个图形菜单的控件。他的类是MenuItemEx,我的调用实际上是下面这样:

int ListLength=3;
MenuItemEx[] mm=new MenuItemEx[ListLength];
this.Menu.MenuItems[0].MenuItems[9].Clear();
for (int i=0;i<ListLength;i++)
mm[i]=new MenuItemEx((i+1).ToString());
this.Menu.MenuItems[0].MenuItems[9].MenuItems.AddRange(mm);

我刚刚用MenuItem类试了一下,他不会出现我说的问题。但是我用他的这个类就出现了这样的问题,他的类代码太多,恕我不能贴出来。但是我的意思就是想搞掉他的刷新的问题。
我刚开始说的不是很清楚,还望见谅。

dy_2000_abc(芝麻开门)兄:很敬佩你的技术和帮助他人的责任心,希望能交个朋友,可以得话请留个Mail,谢谢。
dy_2000_abc 2002-11-06
  • 打赏
  • 举报
回复
sorry,I can fix it up.Can you show the whole codes.
7710703 2002-11-04
  • 打赏
  • 举报
回复
dy_2000_abc(芝麻开门)兄:绘制菜单的时候,窗体确实没有执行OnPaint,但是当你把鼠标放上去的时候,明显得能看到整个菜单和窗体标题刷新了几次。我将这个菜单的Visible设为false也是这样,当你将这个菜单的子项清除时尤为明显。如下面的代码:

int ListLength=3;
MenuItem[] mm=new MenuItem[ListLength];
this.Menu.MenuItems[0].MenuItems[9].Clear();
for (int i=0;i<ListLength;i++)
mm[i]=new MenuItem((i+1).ToString());

this.Menu.MenuItems[0].MenuItems[9].MenuItems.AddRange(mm);
dy_2000_abc 2002-11-02
  • 打赏
  • 举报
回复
我执行了一下下面的代码,当菜单弹出时,窗体不执行绘制。我想你的目的是想把菜单加完后再显示,那可以先把MenuItem[i].Visible设为false,等加完后再设为true.

private void menuItem1_Popup(object sender, System.EventArgs e)
{
int ListLength=3;
MenuItem[] mm=new MenuItem[ListLength];
for (int i=0;i<ListLength;i++)
mm[i]=new MenuItem((i+1).ToString());
this.Menu.MenuItems[0].MenuItems[0].MenuItems.AddRange(mm);
}
protected override void OnPaint(PaintEventArgs e)
{
MessageBox.Show("");
base.OnPaint(e);
}
7710703 2002-11-01
  • 打赏
  • 举报
回复

下面的代码是用户的Popup事件触发时执行的。但是在添加的时候,窗体会刷新一次,当删除的时候也会刷新一次。所有我想让窗体在我将所有菜单加完之后再刷新。

int ListLength=3;
MenuItem[] mm=new MenuItem[ListLength];
for (int i=0;i<ListLength;i++)
mm[i]=new MenuItem((i+1).ToString());
this.Menu.MenuItems[0].MenuItems[9].MenuItems.AddRange(mm);


谢谢dy_2000_abc(芝麻开门)兄!!!
dy_2000_abc 2002-11-01
  • 打赏
  • 举报
回复
搞错,菜单删减或增加不会引发Form的OnControlAdded方法 :)
dy_2000_abc 2002-11-01
  • 打赏
  • 举报
回复
菜单删减或增加不会引发Form的OnControlAdded事件。我对你的目的不是很了解,能否把代码贴出来看看
7710703 2002-11-01
  • 打赏
  • 举报
回复
我的实际情况是动态的添加菜单,但是每操作一个菜单删减的时候,屏幕就会刷新一次。但是 dy_2000_abc(芝麻开门)兄我用你的办法并不好使阿?
dy_2000_abc 2002-10-31
  • 打赏
  • 举报
回复
上面的代码是添加完成后再刷新,你需要自己定义刷新事件的话,修改一下private void OnIdle(object s, EventArgs e) 语句。
dy_2000_abc 2002-10-31
  • 打赏
  • 举报
回复
bool idleHooked = false;

protected override void OnControlAdded(
ControlEventArgs e
)
{

if (!idleHooked)

{

Application.Idle += new EventHandler(OnIdle);

}

}



private void OnIdle(object s, EventArgs e)

{

Invalidate();

PerformLayout();

if (idleHooked)

{

Application.Idle -= new EventHandler(OnIdle);

}

}

110,547

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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