2013-08-22 61 views
0

請看看下面的代碼Windows窗體中,無法顯示

#pragma once 

#include "Email.h" 

    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Threading; 
    using namespace SMSLib; 

    /// <summary> 
    /// Summary for NotifyAlarm 
    /// </summary> 
    public ref class NotifyAlarm : public System::Windows::Forms::Form 
    { 
     int count; 
     Email ^email; 

    public: 
     NotifyAlarm(void) 
     { 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
      count = 10; 
      //email = gcnew Email(); 
     } 

    protected: 
     /// <summary> 
     /// Clean up any resources being used. 
     /// </summary> 
     ~NotifyAlarm() 
     { 
      if (components) 
      { 
       delete components; 
      } 
     } 
    private: System::Windows::Forms::Label^ label1; 
    protected: 
    private: System::Windows::Forms::Label^ secondsLabel; 
    private: System::Windows::Forms::Label^ label2; 
    private: System::Windows::Forms::Button^ sendNowBtn; 
    private: System::Windows::Forms::Button^ cancelBtn; 
    private: System::Windows::Forms::Timer^ timer1; 
    private: System::ComponentModel::IContainer^ components; 


    private: 
     /// <summary> 
     /// Required designer variable. 
     /// </summary> 


#pragma region Windows Form Designer generated code 
     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     void InitializeComponent(void) 
     { 
      this->components = (gcnew System::ComponentModel::Container()); 
      this->label1 = (gcnew System::Windows::Forms::Label()); 
      this->secondsLabel = (gcnew System::Windows::Forms::Label()); 
      this->label2 = (gcnew System::Windows::Forms::Label()); 
      this->sendNowBtn = (gcnew System::Windows::Forms::Button()); 
      this->cancelBtn = (gcnew System::Windows::Forms::Button()); 
      this->timer1 = (gcnew System::Windows::Forms::Timer(this->components)); 
      this->SuspendLayout(); 
      // 
      // label1 
      // 
      this->label1->AutoSize = true; 
      this->label1->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
       static_cast<System::Byte>(0))); 
      this->label1->Location = System::Drawing::Point(13, 27); 
      this->label1->Name = L"label1"; 
      this->label1->Size = System::Drawing::Size(405, 20); 
      this->label1->TabIndex = 0; 
      this->label1->Text = L"Intruder Detected. An Email and SMS will be sent within "; 
      // 
      // secondsLabel 
      // 
      this->secondsLabel->AutoSize = true; 
      this->secondsLabel->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
       static_cast<System::Byte>(0))); 
      this->secondsLabel->ForeColor = System::Drawing::Color::Red; 
      this->secondsLabel->Location = System::Drawing::Point(408, 27); 
      this->secondsLabel->Name = L"secondsLabel"; 
      this->secondsLabel->Size = System::Drawing::Size(51, 20); 
      this->secondsLabel->TabIndex = 1; 
      this->secondsLabel->Text = L"label2"; 
      // 
      // label2 
      // 
      this->label2->AutoSize = true; 
      this->label2->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 12, System::Drawing::FontStyle::Regular, System::Drawing::GraphicsUnit::Point, 
       static_cast<System::Byte>(0))); 
      this->label2->Location = System::Drawing::Point(465, 27); 
      this->label2->Name = L"label2"; 
      this->label2->Size = System::Drawing::Size(69, 20); 
      this->label2->TabIndex = 2; 
      this->label2->Text = L"seconds"; 
      // 
      // sendNowBtn 
      // 
      this->sendNowBtn->Location = System::Drawing::Point(370, 70); 
      this->sendNowBtn->Name = L"sendNowBtn"; 
      this->sendNowBtn->Size = System::Drawing::Size(75, 23); 
      this->sendNowBtn->TabIndex = 3; 
      this->sendNowBtn->Text = L"Send Now"; 
      this->sendNowBtn->UseVisualStyleBackColor = true; 
      this->sendNowBtn->Click += gcnew System::EventHandler(this, &NotifyAlarm::sendNowBtn_Click); 
      // 
      // cancelBtn 
      // 
      this->cancelBtn->Location = System::Drawing::Point(469, 70); 
      this->cancelBtn->Name = L"cancelBtn"; 
      this->cancelBtn->Size = System::Drawing::Size(75, 23); 
      this->cancelBtn->TabIndex = 4; 
      this->cancelBtn->Text = L"Cancel"; 
      this->cancelBtn->UseVisualStyleBackColor = true; 
      this->cancelBtn->Click += gcnew System::EventHandler(this, &NotifyAlarm::cancelBtn_Click); 
      // 
      // timer1 
      // 
      this->timer1->Enabled = true; 
      this->timer1->Interval = 1000; 
      this->timer1->Tick += gcnew System::EventHandler(this, &NotifyAlarm::timer1_Tick); 
      // 
      // NotifyAlarm 
      // 
      this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); 
      this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; 
      this->ClientSize = System::Drawing::Size(566, 105); 
      this->Controls->Add(this->cancelBtn); 
      this->Controls->Add(this->sendNowBtn); 
      this->Controls->Add(this->label2); 
      this->Controls->Add(this->secondsLabel); 
      this->Controls->Add(this->label1); 
      this->Name = L"NotifyAlarm"; 
      this->Text = L"NotifyAlarm"; 
      this->ResumeLayout(false); 
      this->PerformLayout(); 

     } 
#pragma endregion 
    private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) 
      { 
       count--; 
       DoUpdateText(count); 

      } 
private: System::Void sendNowBtn_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
      timer1->Stop(); 


     } 

public: System::Void showGUI() 
        { 
         this->Show(); 
        } 
private: System::Void cancelBtn_Click(System::Object^ sender, System::EventArgs^ e) 
     { 
      timer1->Stop(); 
      this->Close(); 
     } 





     delegate void UpdateTextDelegate(int count); 

private: void DoUpdateText(int count) 
     { 
      ISynchronizeInvoke^ i = this; 

      if (i->InvokeRequired) 
      { 
       UpdateTextDelegate^ tempDelegate = 
        gcnew UpdateTextDelegate(this, &NotifyAlarm::DoUpdateText); 
       cli::array<System::Object^>^ args = gcnew cli::array<System::Object^>(1); 
       args[0] = count; 
       i->BeginInvoke(tempDelegate, args); 
       return; 
      } 

      if(count>0 || count==0) 
      { 
       secondsLabel->Text = ""+count; 
      } 
      else 
      { 
       timer1->Stop(); 



       this->Close(); 

      } 
     } 
}; 

上面的代碼顯示了用於生成通知的Windows窗體。我在另一個線程中運行這個類。下面是我如何設置另一類內的線程

na = gcnew NotifyAlarm(); 
Thread ^t = gcnew Thread(gcnew System::Threading::ThreadStart(na,&NotifyAlarm::showGUI)); 
t->Start(); 

我遇到的問題是,表單顯示正常,但一秒後,它消失。無論在表單中運行的進程是否正在運行,但在後臺運行,沒有顯示錶單。

講究這裏:

delegate void UpdateTextDelegate(int count); 

private: void DoUpdateText(int count) 
     { 
      ISynchronizeInvoke^ i = this; 

      if (i->InvokeRequired) 
      { 
       UpdateTextDelegate^ tempDelegate = 
        gcnew UpdateTextDelegate(this, &NotifyAlarm::DoUpdateText); 
       cli::array<System::Object^>^ args = gcnew cli::array<System::Object^>(1); 
       args[0] = count; 
       i->BeginInvoke(tempDelegate, args); 
       return; 
      } 

      if(count>0 || count==0) 
      { 
       secondsLabel->Text = ""+count; 
      } 
      else 
      { 
       timer1->Stop(); 



       this->Close(); 

      } 
     } 
}; 

這其中內螺紋的形式工作情況。

對我來說,在另一個線程中顯示此表單非常重要。爲什麼它正在消失?

UPDATE

使用

System::Void showGUI() { 
    Application::Run(*this); 
} 

後,我得到這個錯誤

1>c:\users\yohan\documents\visual studio 2010\projects\ eesystem\eesystem\NotifyAlarm.h(182): error C2665: 'System::Windows::Forms::Application::Run' : none of the 3 overloads could convert all the argument types 
1>   c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\system.windows.forms.dll: could be 'void System::Windows::Forms::Application::Run(System::Windows::Forms::Form ^)' 
1>   c:\program files\reference assemblies\microsoft\framework\.netframework\v4.0\system.windows.forms.dll: or  'void System::Windows::Forms::Application::Run(System::Windows::Forms::ApplicationContext ^)' 
1>   while trying to match the argument list '(NotifyAlarm)' 
+0

你忽略了你之前得到的建議。當你不使用答案時,提問並沒有太多意義。 –

+0

@HansPassant:不,我沒有。我正在使用第二個答案!我檢查了語音識別的問題,並且我已經爲引擎使用了異步方法。所以,我不得不與第二個答案:) –

回答

1

這裏的問題是,你只是打電話this->Show()。這最多隻會顯示一次。它不會設置消息循環,因此它不會響應任何用戶操作,也不會在第一次後自行重繪。爲了解決這個問題,你需要設置一個消息循環與Application::Run

System::Void showGUI() { 
    Application::Run(this); 
} 
+0

嗨,非常感謝您的答覆。不幸的是,我得到了一個錯誤,它是在我的問題'更新'部分 –

+0

@Artificial_Intelligence我的不好,更新了我的答案 – JaredPar

+0

非常感謝答覆。將檢查這 –