65.9K
CodeProject 正在变化。 阅读更多。
Home

一个 Windows Forms C++ Mandelbrot 探索器/缩放器,带有 Julia 漫游

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.09/5 (5投票s)

2010年5月10日

CPOL

2分钟阅读

viewsIcon

25469

downloadIcon

475

一个 Windows Forms C++ Mandelbrot 探索器/缩放器,带有 Julia 漫游

引言

在 Microsoft Visual C++ 2005 Express Edition 中设计应用程序非常简单。指这里,点那里,搞定! 将其放置在表单上。但说真的,单击左侧工具栏中所需的组件(控件),然后在表单上的适当位置绘制它。

表单上的组件对齐到矩形网格,使您的应用程序看起来对称。这个简单的应用程序演示了使用 C++ 中的 Windows Forms 语法创建应用程序和处理鼠标事件的简易性。

事件

到目前为止,快进一点,我们已经创建了一个 Windows Form,并将按钮和PictureBox等控件放置在表单上。要使按钮响应鼠标单击,我们必须在其中放入一些代码。所以我们双击它,然后呈现一个事件方法。我们所要做的就是在该控件的事件方法中放置一些代码。

让我们单击一个PictureBox,并在其MouseDown部分放置相关代码,因为我们有一些需要在其上处理的事件。

MouseDown 事件

当按下左键时,会调用 MouseDown 事件。当用户按下左键时,我们的应用程序会将鼠标的当前 x 和 y 坐标存储在变量start.xstart.y 中。当用户拖动鼠标时,会绘制一个矩形,它定义了要缩放的 Mandelbrot 区域的大小。

private: System::Void pictureBox1_MouseDown(System::Object^  sender, 
	System::Windows::Forms::MouseEventArgs^  e) 
{
	switch ( e->Button )
	{
		case System::Windows::Forms::MouseButtons::Left:
		if (mouse_x>=0 && mouse_x<=WIDTH && mouse_y>=0 && mouse_y<=HEIGHT)
		{
			m_show = true;
			sx = mouse_x; sy = mouse_y;ex = mouse_x;ey = mouse_y;
			rect.X=sx; rect.Y=sy;xorEx= sx+100;	xorEy= sy+100;
			endx=0;	endy=0;	startx=mouse_x;	starty=mouse_y;
			zsx=(xmin+(xmax-xmin)*((mousex)-px)/(WIDTH-1));
			zsy=(ymin+(ymax-ymin)*((mousey)-py)/(HEIGHT-1));
			zex=(xmin+(xmax-xmin)*((mousex)-px)/(WIDTH-1));
			zey=(ymin+(ymax-ymin)*((mousey)-py)/(HEIGHT-1));
			tempx=xmin;tempy=ymin;xmin=zsx;	ymin=zsy;displayData();
		}
		break;
		
		case System::Windows::Forms::MouseButtons::Right:
		if (mouse_x<width><height) 
			mousex=""mouse_x;"" mousey=""mouse_y;""></width>

MouseMove 事件

当用户拖动鼠标时,会调用 MouseMove 事件。当鼠标被拖动时,会绘制一个矩形框以显示下一个缩放区域的位置。

private: System::Void pictureBox1_MouseMove(System::Object^  sender, 
	System::Windows::Forms::MouseEventArgs^  e) 
{
	mouse_x=e->X;  mouse_y=e->Y;
	if (mouse_x>=0 && mouse_x<=WIDTH && mouse_y>=0 && mouse_y<=HEIGHT)
	{
		if (mouse_x>= sx && mouse_y >= sy )
		{
		ex = mouse_x; ey = mouse_y;	dx=zex-zsx;	dy=zey-zsy;
			if (e->Button==System::Windows::Forms::MouseButtons::Left)
			{
				rect.Width=e->X- sx;  rect.Height=e->Y- sy;
				pictureBox1->Invalidate( rect );
				label1->Text=e->X+"x"+e->Y;
			}
		}

	if ( m_show ){}
	mousex=mouse_x;	mousey=mouse_y;	displayData(); 
		if (e->Button==System::Windows::Forms::MouseButtons::Left) 
		{
			if (zoomcnt<1)pictureBox1->Image=pictureBox3->Image; 
			else pictureBox1->Image=backBuffer;
		}
	}
} 

MouseUp 事件

当释放左键时,会调用 MouseUp 事件。一旦用户释放左键,我们的应用程序会将鼠标的当前 x 和 y 坐标存储在变量 end.xend.y 中。
我们的应用程序现在计算出要从中计算 Mandelbrot 的新的插值点。

private: System::Void pictureBox1_MouseUp(System::Object^  sender, 
	System::Windows::Forms::MouseEventArgs^  e) 
{
	switch ( e->Button )
	{
		case System::Windows::Forms::MouseButtons::Left:
		if ((mouse_x>=0) &&( mouse_x<=WIDTH) && 
		(mouse_y>=0) && (mouse_y<=HEIGHT) && (ex-sx>2) && (ey-sy>2))
		{
			m_show = false;zoomcnt++;
			endx=mouse_x;endy=mouse_y;ex =mousex; ey =mousey;
			rect.Width=(ex-sx); rect.Height=(ey-sy);
			if (endx >startx+5 && endy >starty +5)
			{
			 initWalk(); MouseX=WIDTH/2; 
				MouseY=HEIGHT/2;dx=zex-zsx;dy=zey-zsy;
				 if (mouse_x>= sx && mouse_y >= sy )
				 {
				 zex=(xmin+(xmax-xmin)*((mousex)-px)/(WIDTH-1));
				 zey=(ymin+(ymax-ymin)*((mousey)-py)/(HEIGHT-1));
				 xmax=zex; ymax=zey; dx=zex-zsx;dy=zey-zsy;
				 displayData(); calculateFractal(/*hdc*/); 
					putCursor(); walkabout();
				}
			} //else{pictureBox1->Invalidate( rect );}
		}

		break;
		
		case System::Windows::Forms::MouseButtons::Right:
		walkabout();
		break;
	}
} 

这就是使用 C++ 中的 Windows Forms 语法创建应用程序和处理鼠标事件的简易程度。

感谢阅读。

历史

  • 2010-05-08 更新完成
  • 2005-11-28 代码完成
© . All rights reserved.