在Control完全加载后立即启动哪个事件?

时间:2011-09-05 14:55:38

标签: c# winforms events controls parent

我有用户控件覆盖WebBrowser控件。 有一种方法从其父窗体中获取BackgroundImage的一个区域,并使其成为html代码中的背景。它的工作原理如下:

  1. 使自己隐身。
  2. 捕获父表格。
  3. 使自己可见。
  4. 拍摄拍摄图像的特定区域并将其设置为背景。
  5. 刷新自己。
  6. 我想在控件完全加载后立即触发该方法。我无法在构造函数中执行此操作,因为我需要使用的一些重要对象和父属性仍为null。 我把它放在OnVisibleChanged事件中并将bool变量设置为false,因此它只运行一次,但每次重建我的项目时它都会触发(即使没有运行 - 它创建的位图我用作html代码中的背景,但不同的目录因为我使用Directory.CurrentDirectory()方法)。尝试也用OnLoad事件触发它,但它产生与OnVisibleChanged相同的问题。 是否有比OnVisibleChanged更合适的事件?

    PS。我总是想知道每个事件是否必须触发它的基类事件。有必要这样做吗?我根本没有看到任何差异,没有它一切都很好。如果最好将它留在那里,它应该在事件方法的开头还是结尾?

1 个答案:

答案 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...
    }
}