Application.Run到底做了些什么工作啊

twtyypmb123 2014-01-24 05:09:55
using System;
using System.Drawing;
using System.Windows.Forms;

class Entry
{
static Form form1, form2;
public static void Main()
{
form1 = new Form();
form2 = new Form();

form1.Text = "First Form";
form1.BackColor = Color.White;
form1.Paint += new PaintEventHandler( MyPaintHandler );
form2.Text = "Second Form";
form2.BackColor = Color.White;
form2.Paint += new PaintEventHandler( MyPaintHandler );

form2.Show();
Application.Run( form1 );
}

static void MyPaintHandler( object sender, PaintEventArgs e )
{
Form form = (Form)sender;
Graphics grfx = e.Graphics;
string str;

if( form == form1 )
{
str = "hello from the first form";
}
else
{
str = "hello from the second form";
}

grfx.DrawString( str, form.Font, Brushes.Black, 0, 0 );
}
}

代码如上,我有两个问题,
1.代码并没有显式调用Paint,它是何时被什么调用的?
2.上面的form2并没有run,为什么它的窗口区还会被更新?
...全文
622 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2014-01-27
  • 打赏
  • 举报
回复
楼主先了解什么是windows消息循环,或者看看《windows程序设计》。
threenewbee 2014-01-27
  • 打赏
  • 举报
回复
没有学过Win32开发? 如果你看过SDK程序:
//最简单的Windows程序

#define WINDOW_CLASS    "StrandedGame"		// 窗口类名
#define WINDOW_NAME     "Stranded"			// 窗口名
#define WIN_WIDTH       800					// 初始窗口宽度
#define WIN_HEIGHT      600					// 初始窗口高度


#include <windows.h>

// 窗口处理函数
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );



int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
				   LPSTR lpCmdLine, int nCmdShow)
{
    // 设计窗口类
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
		GetModuleHandle(NULL), NULL, NULL, (HBRUSH)(COLOR_WINDOW+1), NULL,
		WINDOW_CLASS, NULL };
	// 注册窗口类
    RegisterClassEx( &wc );
	
    // 创建窗口
    HWND hWnd = CreateWindow( WINDOW_CLASS, WINDOW_NAME, 
		WS_OVERLAPPEDWINDOW, 0, 0, WIN_WIDTH, WIN_HEIGHT,
		NULL, NULL, wc.hInstance, NULL );
	
	
	// 显示窗口
	ShowWindow( hWnd, SW_SHOWDEFAULT );
	UpdateWindow( hWnd );
	
	// 消息循环(消息被转化以后,由窗口处理函数处理)
	MSG msg; 
	while( GetMessage( &msg, NULL, 0, 0 ) )
	{
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}
	
	// 取消窗口注册
    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}


// 消息处理
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
	// 消息处理
    switch( msg )
    {
	case WM_DESTROY:
		PostQuitMessage( 0 );
		return 0;
		
    }
	
    return DefWindowProc( hWnd, msg, wParam, lParam );
}

Application.Run就相当于 while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
twtyypmb123 2014-01-27
  • 打赏
  • 举报
回复
引用 3 楼 BenBenBears 的回复:
你是面向过程去理解windows窗体应用程序了,窗体是一个对象,对象的生命周期是介于构造阶段和析构阶段之间,并不是Show这一语句运行完了就完了。
Show这一句只是设置了属性而已吧,然后就没form2的事了,那为什么form2还能更新?paint事件为何会被触发?求大神详解,
BenBenBears 2014-01-24
  • 打赏
  • 举报
回复
你是面向过程去理解windows窗体应用程序了,窗体是一个对象,对象的生命周期是介于构造阶段和析构阶段之间,并不是Show这一语句运行完了就完了。
twtyypmb123 2014-01-24
  • 打赏
  • 举报
回复
引用 1 楼 BenBenBears 的回复:
1、当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息给应用程序的回调函数。对窗口进行重新绘制。 2、Application.Run表示应用程序消息循环开启;Form.Show()表示显示窗体,Form1、Form2的重绘消息都会被应用程序捕获,从而调用回调函数。
Form2.Show()运行完了就完了啊,就没有关于form2的语句了,为什么还会留在那里呢,Application.Run指定了form1,为什么form2的事件会被调用呢?新手刚学,不懂....
BenBenBears 2014-01-24
  • 打赏
  • 举报
回复
1、当需要更新或重新绘制窗口的外观时,应用程序就会发送WM_PAINT消息给应用程序的回调函数。对窗口进行重新绘制。 2、Application.Run表示应用程序消息循环开启;Form.Show()表示显示窗体,Form1、Form2的重绘消息都会被应用程序捕获,从而调用回调函数。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧