【问题标题】:Which event is launched right after Control is fully loaded?在 Control 完全加载后立即启动哪个事件?
【发布时间】:2011-09-05 14:55:38
【问题描述】:

我有覆盖 WebBrowser 控件的用户控件。 有一种方法可以从其父窗体中获取 BackgroundImage 的一个区域,并将其作为 html 代码中的背景。它是这样工作的:

  1. 使自己不可见。
  2. 捕获父表单。
  3. 使自己可见。
  4. 获取捕获图像的特定区域并将其设置为背景。
  5. 自我刷新。

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

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

【问题讨论】:

  • 您正在寻找的事件可能是由框架而不是由框架本身触发的,如果是鸡和蛋的问题以及无限循环;-)
  • 对不起我的英文,我编辑了标题;]

标签: c# winforms events controls parent


【解决方案1】:

没有“完全加载”的概念,创建控件是 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...
    }
}

【讨论】:

  • 它在 OnPaint 方法中的工作方式是否相同?我怎么知道父母也被画了?
  • 不,某些控件不会调用 OnPaint。像浏览器一样。本机控件已关闭 ControlStyles.UserPaint。绘制按 Z 顺序进行,您可以假设在获得 WM_PAINT 时绘制父级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多