我在Windows 10平台上有Visual Studio 2022,虽然我已经用它来开发C代码有一段时间了,但我还是第一次使用它来使用Win Forms开发GUI。我一直在看一些在线教程,有一些问题。
我的应用程序有三个表单,登录表单,编码表单和解码表单,分别是LoginForm. h,EncodeForm. h和DecodeForm. h。我已经使用设计视图为每个表单设计了这些表单,并且工作正常。在下面的教程中,LoginForm. cpp包含以下代码:
#include "LoginForm.h"
using namespace myFirstSteganGUI;
void main() {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew LoginForm());
}
字符串
其中EncodeForm.cpp和DecodeForm.cpp仅包括它们各自的头文件,而没有其他内容。
登录表单包含几个控件,这里相关的两个控件是“Encode”(按钮3)和“Decode”(按钮4),因此当您单击其中一个控件时,应用程序会将您带到编码或解码表单。
在LoginForm. h的设计视图中,我双击“Encode”和“Decode”,在这两种情况下,我都在LoginForm. h的代码末尾附近的生成函数中包含代码。代码如下:
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
EncodeForm obj;
obj.ShowDialog();
}
private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) {
DecodeForm obj;
obj.ShowDialog();
}
型
同时在#pragma之后插入#include“EncodeForm. h”和#include“DecodeForm. h”一次。应用程序正确编译,并打开登录表单,然后当我点击“编码”时,编码表单确实打开,但登录表单保持打开状态,我希望它关闭。这是问题1。如果我关闭编码表单,那么我可以点击“解码”,解码表单打开,但与之前一样,登录按钮保持打开。
我希望能够从编码或解码表单切换回登录表单,并在两个表单上都有按钮“返回登录”。在“EncodeForm. h”设计视图中,我尝试了与LoginForm. h相同的方法,即双击“返回登录”,然后在生成的函数中插入代码,如下所示:
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
LoginForm obj;
obj.ShowDialog();
}
型
并在#pragma下面插入了#include“LoginForm. h”一次。然而,这并没有编译,并产生了几个难以理解的错误。可以肯定的是,同样的问题也会发生在解码表单上,我没有尝试。这是问题2。
作为测试,我在尝试上述更改之前更改了LoginForm.cpp,结果代码为:
#include "LoginForm.h"
#include "EncodeForm.h"
#include "DecodeForm.h"
using namespace myFirstSteganGUI;
void main() {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Application::Run(gcnew LoginForm());
Application::Run(gcnew EncodeForm());
Application::Run(gcnew DecodeForm());
}
型
登录表单确实出现了,然后在我关闭登录表单后出现了编码表单,然后在我关闭编码表单后出现了解码表单。这确实是我所期望的,虽然不是我想要的,但至少可以让我看到这些表单是如何显示的。
我的问题是:
1:从登录表单中,我希望出现编码或解码表单,并关闭登录表单。目前登录表单未关闭。
第二章:无论是从编码或解码形式,我希望登录形式重新打开其原始状态保留,即与登录代码,当“返回登录”被点击,和编码或解码形式关闭。他们不需要保留自己的状态。
我相信一定有一个简单的答案,我只是不太了解Visual Studio如何使用Win Forms。
1条答案
按热度按时间zte4gxcn1#
如果不是登录表单实际关闭,而是对话框不显示,是否可以接受?如果可以,那么一个相对简单的解决方案是在显示Encode或Decode表单之前使用Login表单的
Hide()
方法。例如,字符串
接下来,将Login表单的引用存储在可从Encode和Decode表单访问的地方,例如在全局变量中,例如
objLogin
。这可以通过各种方式设置,例如从LoginForm构造函数。或者,为了使其更灵活且易于扩展,您可以按照Louis Go的评论中的建议进行操作,即创建一个可访问的回调来使用。然后在“Back to Login”按钮的Encode/Decode表单处理程序中,调用Login表单的Show()方法(例如,
objLogin.Show();
),然后调用Close();
来关闭此表单(如果Login表单仍然在其Click方法中显示Encode/Decode表单有任何问题,也可以反过来)。