在进行图形用户界面(GUI)编程时,创建一个无边框且可移动的窗口是一个常见的需求。本文将介绍如何在C++中使用Windows Forms来实现这一功能。
首先,创建一个新的Windows Forms项目,会得到一个空白窗口。要创建一个无边框窗口,需要做的第一步是去除窗口的边框。
在窗口上右键点击,选择“属性”。在“窗体边框样式”中,选择“无”。
接下来,回到窗口并添加一些控件。可以添加任何想要的控件,但建议首先添加一个关闭按钮。添加一个按钮,并将其标签设置为“X”,然后将其放置在窗口的右上角。
为了使关闭按钮能够关闭窗口,双击按钮,它会自动创建一个事件。在事件的代码块中,输入以下代码:
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
Close();
}
接下来,需要使窗口可移动。首先,在类Form1中添加以下成员变量(确保在控件属性之前):
private:
bool dragging;
private: Point offset;
没有这些变量,下面的代码将无法工作。稍后将明白为什么使用这些变量。
为了使窗口可移动,需要创建四个事件。第一个是Form_Load事件。要创建这个事件,双击窗口。
现在,让确保在打开窗口时不会开始拖动。在事件的代码块中,添加以下代码:
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
this->dragging = false;
}
回到设计器,右键点击窗口并再次选择“属性”。在属性菜单中,点击顶部的闪电图标。这将显示窗口的所有事件。
在这里,需要为三个鼠标事件创建事件:MouseDown、MouseMove和MouseUp。双击其中一个以创建事件。
当MouseDown事件创建后,需要告诉窗口它即将开始移动。因此,在事件的代码块中,添加以下代码:
private: System::Void Form1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
this->dragging = true;
this->offset = Point(e->X, e->Y);
}
既然知道窗口即将移动,需要告诉它获取鼠标的当前位置并将窗口移动到该位置。
private: System::Void Form1_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if(this->dragging){
Point currentScreenPos = PointToScreen(e->Location);
Location = Point(currentScreenPos.X - this->offset.X, currentScreenPos.Y - this->offset.Y);
}
}
现在,需要在释放左键时停止拖动。这个事件叫做MouseUp。
创建MouseUp事件。在MouseUp事件中,需要告诉窗口它需要停止移动。因此,在事件的代码块中,添加以下代码:
private: System::Void Form1_MouseUp(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
this->dragging = false;
}