2013-08-11 2 views
0

Мой первый пост. Я экспериментирую с формой Windows и C++. У меня есть некоторые (основные) вопросы. На данный момент цель состоит в том, чтобы написать программу, которая проверяет, подключено ли какое-либо оборудование через USB-порт, но прежде чем я вернусь к реальной работе, я хотел закончить графический интерфейс, который будет информировать, было ли обнаружено аппаратное обеспечение.
Итак, у меня есть стандартная форма (Form1.h), тогда у меня есть класс cpp, в котором находится основной метод (usbStatus.cpp) и другой файл cpp (connection.cpp), в который я планирую поместить код для поиска требуемого оборудования. Прямо при запуске форма отображает набор statusButton с цветом фона RED и statusLabel с надписью «Поиск аппаратного обеспечения». Тогда я хотел бы, чтобы, когда другой код (еще не написанный) закончен, поиск оборудования изменит цвет фона кнопки на зеленый (если найден HW) и назовите «Hardware found». Ну ... ничего не происходит. Я проверил со следами, и код обрабатывается, но без видимого результата. Я пробовал Invalidate() и Refresh() без успеха.смена кнопки BackColor, C++ Visual Studio 2010

Очень мало я сейчас выглядит так же, как это:

Form1.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; 
} 

connection.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(); 

}; 

connection.cpp

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

using namespace UsbStatus; 

... 

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

ответ

1

Вызов Application::Run(mainWindow); является блокирования вызова. Это означает, что он не вернется, пока ваше диалоговое окно не завершится. Внутри он будет работать windows message loop. Поэтому последующие вызовы будут выполнены после ваш диоалог закрывается ... Я думаю, что это не предназначено.

Вам необходимо перенести свой чек в класс Form1. Используйте либо Load-Event (или переопределите OnLoad для этого, либо вы используете Timer для регулярной проверки состояния и обновления вашего пользовательского интерфейса. Вы можете добавить Timer в Редактор диалогов, отбросив его из пользовательских элементов в форму.

См. также: Winforms Timer for Dummies

+0

Hi Йохен и спасибо за ваше время Вы правы, я переместил если/другое перед командой Run (только для тестирования вам предложение), и это на самом деле обновления, как я пытался сделать – user2673027

+0

У меня такое ощущение, что я не должен вводить какую-либо логику в классы формы больше, чем действительно необходимо для обновления GUI, не нужно ли так думать или я должен придерживаться этого? – user2673027

+0

Лучше решение состоит в том, чтобы разделить логику через интерфейс! Затем вы можете реализовать логику в своем классе и просто передать интерфейс в форму. –