c# 的 Form 是如何封装 WndProc 方法的

来源:互联网 发布:hp1020网络打印机驱动 编辑:程序博客网 时间:2024/04/30 09:51
  1. 类继承关系
  2. System.Object
     System.MarshalByRefObject
      System.ComponentModel.Component
       System.Windows.Forms.Control
        System.Windows.Forms.ScrollableControl
          System.Windows.Forms.ContainerControl
            System.Windows.Forms.Form
            System.ComponentModel.Design.CollectionEditor.CollectionForm
            System.Messaging.Design.QueuePathDialog
            System.ServiceProcess.Design.ServiceInstallerDialog
            System.Web.UI.Design.WebControls.CalendarAutoFormatDialog
            System.Web.UI.Design.WebControls.RegexEditorDialog
            System.Windows.Forms.Design.ComponentEditorForm
            System.Windows.Forms.PrintPreviewDialog
            System.Windows.Forms.ThreadExceptionDialog
            System.Workflow.Activities.Rules.Design.RuleConditionDialog
            System.Workflow.Activities.Rules.Design.RuleSetDialog
            System.Workflow.ComponentModel.Design.ThemeConfigurationDialog
            System.Workflow.ComponentModel.Design.TypeBrowserDialog
            System.Workflow.ComponentModel.Design.WorkflowPageSetupDialog

  3. WndProc 方法所在的类
  4. System.Windows.Forms.Control

    WndProc Processes Windows messages.

  5. 结论

Form 类都是由 WndProc 方法的,我们可以重载它来实现自己的功能。实例如下:

    using System;using System.Drawing;using System.Windows.Forms;namespace csTempWindowsApplication1{    public class Form1 : System.Windows.Forms.Form    {        // Constant value was found in the "windows.h" header file.        private const int WM_ACTIVATEAPP = 0x001C;        private bool appActive = true;        [STAThread]        static void Main()         {            Application.Run(new Form1());        }        public Form1()        {            this.Size = new System.Drawing.Size(300,300);            this.Text = "Form1";            this.Font = new System.Drawing.Font("Microsoft Sans Serif", 18F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));        }        protected override void OnPaint(PaintEventArgs e)         {            // Paint a string in different styles depending on whether the            // application is active.            if (appActive)             {                e.Graphics.FillRectangle(SystemBrushes.ActiveCaption,20,20,260,50);                e.Graphics.DrawString("Application is active", this.Font, SystemBrushes.ActiveCaptionText, 20,20);            }            else             {                e.Graphics.FillRectangle(SystemBrushes.InactiveCaption,20,20,260,50);                e.Graphics.DrawString("Application is Inactive", this.Font, SystemBrushes.ActiveCaptionText, 20,20);            }        }[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]        protected override void WndProc(ref Message m)         {            // Listen for operating system messages.            switch (m.Msg)            {                // The WM_ACTIVATEAPP message occurs when the application                // becomes the active application or becomes inactive.                case WM_ACTIVATEAPP:                    // The WParam value identifies what is occurring.                    appActive = (((int)m.WParam != 0));                    // Invalidate to get new text painted.                    this.Invalidate();                    break;                            }            base.WndProc(ref m);        }    }}