which event is fired after a form is displayed ?

  • Thread starter Thread starter Elp
  • Start date Start date
E

Elp

Hi,

Does anybody know which event is fired by a form after it has been displayed
on the screen (after a call to Show or ShowDialog).
I had a look at the doc for the various events fired by forms (Enter, Leave,
Activated...) but the explanations are really too confusing for me. I can't
figure out when those event are actually fired.

thanks
 
Does anybody know which event is fired by a form after it has been
displayed
on the screen

Enclosed is an application that will output all the messages it receives to
the output window.

You can use this to see a list of messages as they happen and understand in
what order things occur.

The code is below my signature.

--
Bob Powell [MVP]
C#, System.Drawing

ANNOUNCING: Well Formed.
The monthy electronic magazine for
Windows Forms and GDI+ engineers
http://www.bobpowell.net/wellformed.htm

Check out the GDI+ FAQ
http://www.bobpowell.net/gdiplus_faq.htm

--------------------------------------------------------
using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;



namespace ShowMessages

{

/// <summary>

/// Summary description for Form1.

/// </summary>

public class Form1 : System.Windows.Forms.Form

{



public enum WmDefs : int

{

WM_NULL = 0x0000,

WM_CREATE = 0x0001,

WM_DESTROY = 0x0002,

WM_MOVE = 0x0003,

WM_SIZE = 0x0005,

WM_ACTIVATE = 0x0006,

WM_SETFOCUS = 0x0007,

WM_KILLFOCUS = 0x0008,

WM_ENABLE = 0x000A,

WM_SETREDRAW = 0x000B,

WM_SETTEXT = 0x000C,

WM_GETTEXT = 0x000D,

WM_GETTEXTLENGTH = 0x000E,

WM_PAINT = 0x000F,

WM_CLOSE = 0x0010,

WM_QUERYENDSESSION = 0x0011,

WM_QUIT = 0x0012,

WM_QUERYOPEN = 0x0013,

WM_ERASEBKGND = 0x0014,

WM_SYSCOLORCHANGE = 0x0015,

WM_ENDSESSION = 0x0016,

WM_SHOWWINDOW = 0x0018,

WM_WININICHANGE = 0x001A,

WM_SETTINGCHANGE = 0x001A,

WM_DEVMODECHANGE = 0x001B,

WM_ACTIVATEAPP = 0x001C,

WM_FONTCHANGE = 0x001D,

WM_TIMECHANGE = 0x001E,

WM_CANCELMODE = 0x001F,

WM_SETCURSOR = 0x0020,

WM_MOUSEACTIVATE = 0x0021,

WM_CHILDACTIVATE = 0x0022,

WM_QUEUESYNC = 0x0023,

WM_GETMINMAXINFO = 0x0024,

WM_PAINTICON = 0x0026,

WM_ICONERASEBKGND = 0x0027,

WM_NEXTDLGCTL = 0x0028,

WM_SPOOLERSTATUS = 0x002A,

WM_DRAWITEM = 0x002B,

WM_MEASUREITEM = 0x002C,

WM_DELETEITEM = 0x002D,

WM_VKEYTOITEM = 0x002E,

WM_CHARTOITEM = 0x002F,

WM_SETFONT = 0x0030,

WM_GETFONT = 0x0031,

WM_SETHOTKEY = 0x0032,

WM_GETHOTKEY = 0x0033,

WM_QUERYDRAGICON = 0x0037,

WM_COMPAREITEM = 0x0039,

WM_GETOBJECT = 0x003D,

WM_COMPACTING = 0x0041,

WM_COMMNOTIFY = 0x0044,

WM_WINDOWPOSCHANGING = 0x0046,

WM_WINDOWPOSCHANGED = 0x0047,

WM_POWER = 0x0048,

WM_COPYDATA = 0x004A,

WM_CANCELJOURNAL = 0x004B,

WM_NOTIFY = 0x004E,

WM_INPUTLANGCHANGEREQUEST = 0x0050,

WM_INPUTLANGCHANGE = 0x0051,

WM_TCARD = 0x0052,

WM_HELP = 0x0053,

WM_USERCHANGED = 0x0054,

WM_NOTIFYFORMAT = 0x0055,

WM_CONTEXTMENU = 0x007B,

WM_STYLECHANGING = 0x007C,

WM_STYLECHANGED = 0x007D,

WM_DISPLAYCHANGE = 0x007E,

WM_GETICON = 0x007F,

WM_SETICON = 0x0080,

WM_NCCREATE = 0x0081,

WM_NCDESTROY = 0x0082,

WM_NCCALCSIZE = 0x0083,

WM_NCHITTEST = 0x0084,

WM_NCPAINT = 0x0085,

WM_NCACTIVATE = 0x0086,

WM_GETDLGCODE = 0x0087,

WM_SYNCPAINT = 0x0088,

WM_NCMOUSEMOVE = 0x00A0,

WM_NCLBUTTONDOWN = 0x00A1,

WM_NCLBUTTONUP = 0x00A2,

WM_NCLBUTTONDBLCLK = 0x00A3,

WM_NCRBUTTONDOWN = 0x00A4,

WM_NCRBUTTONUP = 0x00A5,

WM_NCRBUTTONDBLCLK = 0x00A6,

WM_NCMBUTTONDOWN = 0x00A7,

WM_NCMBUTTONUP = 0x00A8,

WM_NCMBUTTONDBLCLK = 0x00A9,

WM_KEYFIRST = 0x0100,

WM_KEYDOWN = 0x0100,

WM_KEYUP = 0x0101,

WM_CHAR = 0x0102,

WM_DEADCHAR = 0x0103,

WM_SYSKEYDOWN = 0x0104,

WM_SYSKEYUP = 0x0105,

WM_SYSCHAR = 0x0106,

WM_SYSDEADCHAR = 0x0107,

WM_KEYLAST = 0x0108,

WM_IME_STARTCOMPOSITION = 0x010D,

WM_IME_ENDCOMPOSITION = 0x010E,

WM_IME_COMPOSITION = 0x010F,

WM_IME_KEYLAST = 0x010F,

WM_INITDIALOG = 0x0110,

WM_COMMAND = 0x0111,

WM_SYSCOMMAND = 0x0112,

WM_TIMER = 0x0113,

WM_HSCROLL = 0x0114,

WM_VSCROLL = 0x0115,

WM_INITMENU = 0x0116,

WM_INITMENUPOPUP = 0x0117,

WM_MENUSELECT = 0x011F,

WM_MENUCHAR = 0x0120,

WM_ENTERIDLE = 0x0121,

WM_MENURBUTTONUP = 0x0122,

WM_MENUDRAG = 0x0123,

WM_MENUGETOBJECT = 0x0124,

WM_UNINITMENUPOPUP = 0x0125,

WM_MENUCOMMAND = 0x0126,

WM_CTLCOLORMSGBOX = 0x0132,

WM_CTLCOLOREDIT = 0x0133,

WM_CTLCOLORLISTBOX = 0x0134,

WM_CTLCOLORBTN = 0x0135,

WM_CTLCOLORDLG = 0x0136,

WM_CTLCOLORSCROLLBAR = 0x0137,

WM_CTLCOLORSTATIC = 0x0138,

WM_MOUSEMOVE = 0x0200,

WM_MOUSEFIRST = 0x0200,

WM_LBUTTONDOWN = 0x0201,

WM_LBUTTONUP = 0x0202,

WM_LBUTTONDBLCLK = 0x0203,

WM_RBUTTONDOWN = 0x0204,

WM_RBUTTONUP = 0x0205,

WM_RBUTTONDBLCLK = 0x0206,

WM_MBUTTONDOWN = 0x0207,

WM_MBUTTONUP = 0x0208,

WM_MBUTTONDBLCLK = 0x0209,

WM_MOUSEWHEEL = 0x020A,

WM_MOUSELAST = 0x020A,

WM_PARENTNOTIFY = 0x0210,

WM_ENTERMENULOOP = 0x0211,

WM_EXITMENULOOP = 0x0212,

WM_SIZING = 0x0214,

WM_CAPTURECHANGED = 0x0215,

WM_MOVING = 0x0216,

WM_POWERBROADCAST = 0x0218,

WM_DEVICECHANGE = 0x0219,

WM_MDICREATE = 0x0220,

WM_MDIDESTROY = 0x0221,

WM_MDIACTIVATE = 0x0222,

WM_MDIRESTORE = 0x0223,

WM_MDINEXT = 0x0224,

WM_MDIMAXIMIZE = 0x0225,

WM_MDITILE = 0x0226,

WM_MDICASCADE = 0x0227,

WM_MDIICONARRANGE = 0x0228,

WM_MDIGETACTIVE = 0x0229,

WM_MDISETMENU = 0x0230,

WM_ENTERSIZEMOVE = 0x0231,

WM_EXITSIZEMOVE = 0x0232,

WM_DROPFILES = 0x0233,

WM_MDIREFRESHMENU = 0x0234,

WM_IME_SETCONTEXT = 0x0281,

WM_IME_NOTIFY = 0x0282,

WM_IME_CONTROL = 0x0283,

WM_IME_COMPOSITIONFULL = 0x0284,

WM_IME_SELECT = 0x0285,

WM_IME_CHAR = 0x0286,

WM_IME_REQUEST = 0x0288,

WM_IME_KEYDOWN = 0x0290,

WM_IME_KEYUP = 0x0291,

WM_NCMOUSEHOVER = 0x02A0,

WM_MOUSEHOVER = 0x02A1,

WM_NCMOUSELEAVE = 0x02A2,

WM_MOUSELEAVE = 0x02A3,

WM_CUT = 0x0300,

WM_COPY = 0x0301,

WM_PASTE = 0x0302,

WM_CLEAR = 0x0303,

WM_UNDO = 0x0304,

WM_RENDERFORMAT = 0x0305,

WM_RENDERALLFORMATS = 0x0306,

WM_DESTROYCLIPBOARD = 0x0307,

WM_DRAWCLIPBOARD = 0x0308,

WM_PAINTCLIPBOARD = 0x0309,

WM_VSCROLLCLIPBOARD = 0x030A,

WM_SIZECLIPBOARD = 0x030B,

WM_ASKCBFORMATNAME = 0x030C,

WM_CHANGECBCHAIN = 0x030D,

WM_HSCROLLCLIPBOARD = 0x030E,

WM_QUERYNEWPALETTE = 0x030F,

WM_PALETTEISCHANGING = 0x0310,

WM_PALETTECHANGED = 0x0311,

WM_HOTKEY = 0x0312,

WM_PRINT = 0x0317,

WM_PRINTCLIENT = 0x0318,

WM_HANDHELDFIRST = 0x0358,

WM_HANDHELDLAST = 0x035F,

WM_AFXFIRST = 0x0360,

WM_AFXLAST = 0x037F,

WM_PENWINFIRST = 0x0380,

WM_PENWINLAST = 0x038F,

WM_APP = 0x8000,

WM_USER = 0x0400

}



/// <summary>

/// Required designer variable.

/// </summary>

private System.ComponentModel.Container components = null;



public Form1()

{

//

// Required for Windows Form Designer support

//

InitializeComponent();



//

// TODO: Add any constructor code after InitializeComponent call

//

}



/// <summary>

/// Clean up any resources being used.

/// </summary>

protected override void Dispose( bool disposing )

{

if( disposing )

{

if (components != null)

{

components.Dispose();

}

}

base.Dispose( disposing );

}



#region Windows Form Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

private void InitializeComponent()

{

this.components = new System.ComponentModel.Container();

this.Size = new System.Drawing.Size(300,300);

this.Text = "Form1";

}

#endregion



/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.Run(new Form1());

}



protected override void WndProc(ref Message m)

{

WmDefs mdef=(WmDefs)m.Msg;

System.Diagnostics.Trace.WriteLine(

string.Format("{0}, hWnd={1}, lParam={2},
wParam={3}",mdef.ToString(),((int)m.HWnd).ToString("X"),((int)m.LParam).ToSt
ring("X"),((short)m.WParam).ToString("X"))

);

base.WndProc (ref m);

}



}

}
 
Unfortunately, .NET doesn't really have a good AfterShow event. If
you're showing the form non-modally, your best bet is to put your init
code immediately after your call to Show(), but that's no good for
ShowDialog().

You can also try waiting for the Paint event, but that won't fire if you
have controls filling the form's entire client area.
 
Joe White said:
Unfortunately, .NET doesn't really have a good AfterShow event. If
you're showing the form non-modally, your best bet is to put your init
code immediately after your call to Show(), but that's no good for
ShowDialog().

You can also try waiting for the Paint event, but that won't fire if you
have controls filling the form's entire client area.

Thanks to you both, i am eventually using the activated event, which is
apparently fired each time the form is brought to front, and a boolean
member field that i use to know if the event is fired for the first time
(wich means that the form has just been displayed after Show or ShowDialog,
i can do my stuff here then) or not (in this case, it means that the form
has been hiden by a other one and brought to front again).

mehdi
 
Yes, you're on the right track - "Activated" is the best spot for this as
opposed to doing it in "Paint". This will occur whenever your form gets a
WM_ACTIVATE occurs.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI
/WindowsUserInterface/UserInput/KeyboardInput/KeyboardInputReference/Keyboar
dInputMessages/WM_ACTIVATE.asp

Painting happens quite often, and so you dont really want to put any code
in that event that would slow it down as you may start to notice flicker in
the app.

If you want the Activated event to fire once you can unsubscribe from the
event once you've gotten it.
(C#)
private void Form1_Activated(object sender, System.EventArgs e)
{
this.Activated -= new EventHandler(Form1_Activated);
MessageBox.Show("activated");
}

Alternately, you can use a boolean to check to see if you've already run
through the code.

Hope this helps,
Jessica

--
Windows Forms Team
This posting is provided "AS IS" with no warranties, and confers no rights.


--------------------
| Reply-To: "Elp" <[email protected]>
| From: "Elp" <[email protected]>
| References: <[email protected]>
<[email protected]>
| Subject: Re: which event is fired after a form is displayed ?
| Date: Sun, 10 Aug 2003 16:30:29 +0100
| Lines: 21
| Organization: University of Ulster
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2800.1158
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1165
| Message-ID: <[email protected]>
| Newsgroups: microsoft.public.dotnet.framework.windowsforms
| NNTP-Posting-Host: rsmf105.infm.ulst.ac.uk 193.61.182.105
| Path: cpmsftngxa06.phx.gbl!TK2MSFTNGP08.phx.gbl!tk2msftngp13.phx.gbl
| Xref: cpmsftngxa06.phx.gbl
microsoft.public.dotnet.framework.windowsforms:49976
| X-Tomcat-NG: microsoft.public.dotnet.framework.windowsforms
|
|
| | > Unfortunately, .NET doesn't really have a good AfterShow event. If
| > you're showing the form non-modally, your best bet is to put your init
| > code immediately after your call to Show(), but that's no good for
| > ShowDialog().
| >
| > You can also try waiting for the Paint event, but that won't fire if you
| > have controls filling the form's entire client area.
|
| Thanks to you both, i am eventually using the activated event, which is
| apparently fired each time the form is brought to front, and a boolean
| member field that i use to know if the event is fired for the first time
| (wich means that the form has just been displayed after Show or
ShowDialog,
| i can do my stuff here then) or not (in this case, it means that the form
| has been hiden by a other one and brought to front again).
|
| mehdi
|
|
|
 
Jessica Fosler said:
If you want the Activated event to fire once you can unsubscribe from the
event once you've gotten it.

IIRC this is the behavior of the Load event
 
Back
Top