0

我的第一篇文章。我正在尝试使用 Windows 窗体和 C++。我有一些(基本)问题。到目前为止的目标是编写一个程序来检查某个硬件是否通过 USB 端口插入,但在我开始真正的工作之前,我想完成 GUI,它会通知是否找到了硬件。
所以我有一个标准表单(Form1.h),然后我有主方法所在的 cpp 类(usbStatus.cpp)和另一个 cpp 文件(connection.cpp),我打算在其中放置代码进行搜索对于想要的硬件。在启动时,表单显示一个设置了背景颜色 RED 的 statusButton 和一个 statusLabel,上面写着“正在搜索硬件”。然后我希望当其他代码(尚未编写)完成搜索硬件时,按钮背景颜色变为绿色(如果找到硬件)并标记为“找到硬件”。嗯……什么都没有发生。我已经检查了痕迹并且代码已处理但没有可见的结果。我试过 Invalidate() 和 Refresh() 都没有成功。

我现在只有很少的东西看起来很像这样:

表格1.h

namespace usbStatus{

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;

    /// <summary>
    /// Summary for Form1
    /// </summary>
    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            //
            //TODO: Add the constructor code here
            //

        }
    ...

    void InitializeComponent(void)
        {

    ...
    this->statusButton = (gcnew System::Windows::Forms::ToolStripButton());
    this->statusLabel = (gcnew System::Windows::Forms::ToolStripLabel());
    ....

    void InitializeComponent(void)
    {
    ...
    }

在文件末尾我添加了以下方法

public: void Form1::UpdateStatusElements(Color color) 
{
    statusButton->BackColor = color;
    if (color == System::Drawing::Color::Green){
        //statusprogressBar->Enabled = false;
        statusLabel->Text = "Hardware found";
    } else {
        ...

usbStatus.cpp

#include "stdafx.h"
#include "Form1.h"
#include "Connection.h"

using namespace UsbStatus;


[STAThreadAttribute]
int main(array<System::String ^> ^args)
{

    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 

    // Create the main window and run it
    //Application::Run(gcnew Form1());
    Form1 ^mainWindow = gcnew Form1();
    Application::Run(mainWindow);

if(Connection::GetStatus()) 
    mainWindow->UpdateStatusElements(System::Drawing::Color::Green);
else
    //mainWindow->UpdateStatusElements(System::Drawing::Color::Red);
delete mainWindow;
return 0;
}

连接.h

#pragma once
#include "Form1.h"



ref class Connection
{
    private:
        static void CheckStatus();
        static void SetStatus(bool connected);
        static bool hwConnected;

    public:
        static bool GetStatus();

};

连接.cpp

#include <windows.h>
#include "Connection.h"

using namespace UsbStatus;

...

bool Connection::GetStatus()
{
    CheckStatus();
    return true;
    //return hwConnected;
}
4

1 回答 1

1

调用Application::Run(mainWindow);阻塞调用。这意味着在您的对话终止之前它不会返回。在内部它将运行windows 消息循环。因此,后续调用将在您的对话关闭执行……我认为这不是故意的。

您需要将支票移入 Form1 类。使用Load-Event(或覆盖OnLoad此事件或您 aTimer以定期检查状态并更新您的 UI。您可以Timer通过将其从 UI 元素拖放到您的表单中来在对话框编辑器中添加一个。

另请参阅:Winforms Timer for Dummies

于 2013-08-13T05:13:18.507 回答