2011-09-05 23 views
1

我有覆盖WebBrowser控件的用户控件。 有一种方法从其父窗体中获取BackgroundImage的区域,并将其作为HTML代码的背景。它的工作原理如下:控件满载后立即启动哪个事件?

  1. 使其本身不可见。
  2. 捕获父窗体。
  3. 使其本身可见。
  4. 拍摄拍摄图像的特定区域并将其设置为其背景。
  5. 刷新本身。

我希望在控件完全加载后立即触发该方法。我不能在构造函数中完成它,因为我需要使用的一些重要对象和父属性仍然为null。 我把它放在OnVisibleChanged事件中,并将bool变量设置为false,所以它只运行一次,但它每次重建我的项目时都会触发(即使没有运行 - 它创建的位图我在html代码中用作背景,但由于目录不同,我使用Directory.CurrentDirectory()方法)。试过还用OnLoad事件激发它,但它和OnVisibleChanged一样造成问题。 有比OnVisibleChanged更适合的事件吗?

PS。我一直在想,是否每个事件都要触发它的基类。是否有必要这样做?根本没有看到任何差异,没有它,一切都很好。如果最好放在那里,它应该在事件方法的开始还是结束?

+0

事件您正在寻找可能是由框架解雇不是本身,如果是鸡和鸡蛋,也无限循环的问题; - ) –

+0

对不起,我编辑了标题;] –

回答

3

没有“完全加载”的概念,创建控件是Winforms中的一个原子操作,并由OnHandleCreated()指示。你在这里找的是完全控制。绘画是Windows中的一项低优先级任务,只有在没有其他任何事情需要完成时才会执行。

通过重写的WndProc()和追赶WM_PAINT获得该通知:

bool fullyPainted = false; 

protected override void WndProc(ref Message m) { 
    base.WndProc(ref m); 
    if (m.Msg == 15 && !fullyPainted) { 
     fullyPainted = true; 
     // etc... 
    } 
} 
+0

它会在OnPaint方法中工作吗?我怎么知道父母也被画了? –

+0

不,不会在某些控件上调用OnPaint。像WebBrowser一样。本机控件已关闭ControlStyles.UserPaint。绘画按Z顺序进行,您可以假定当您获取WM_PAINT时绘制父项。 –

相关问题