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






4.09/5 (5投票s)
一个 Windows Forms C++ Mandelbrot 探索器/缩放器,带有 Julia 漫游

引言
在 Microsoft Visual C++ 2005 Express Edition 中设计应用程序非常简单。指这里,点那里,搞定! 将其放置在表单上。但说真的,单击左侧工具栏中所需的组件(控件),然后在表单上的适当位置绘制它。
表单上的组件对齐到矩形网格,使您的应用程序看起来对称。这个简单的应用程序演示了使用 C++ 中的 Windows Forms 语法创建应用程序和处理鼠标事件的简易性。
事件
到目前为止,快进一点,我们已经创建了一个 Windows Form,并将按钮和PictureBox等控件放置在表单上。要使按钮响应鼠标单击,我们必须在其中放入一些代码。所以我们双击它,然后呈现一个事件方法。我们所要做的就是在该控件的事件方法中放置一些代码。
让我们单击一个PictureBox,并在其MouseDown
部分放置相关代码,因为我们有一些需要在其上处理的事件。
MouseDown 事件
当按下左键时,会调用 MouseDown
事件。当用户按下左键时,我们的应用程序会将鼠标的当前 x 和 y 坐标存储在变量start.x
和 start.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.x
和 end.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 代码完成