在C ++ win窗体

时间:2016-03-24 03:36:42

标签: c++

我想在Winform,C ++中动态创建一个linklabels / Buttons队列。当我单击一个按钮时,链接标签会动态显示为link1。如果我第二次点击按钮,link1应该在下面,link2应该出现在link1的顶部。点击按钮第三次link1应该下拉,link2应该取link1位置,link3应该取link2位置,依此类推。你可以看到它像一个队列。队列应该有五个项目,第六次单击按钮时,链接1应该消失,链接6应该在顶部。这种情况一直在继续。

我完成了一些任务。我已动态创建链接标签。我想在每次点击按钮时删除所有链接标签,并根据点击次数重新排序它们的位置来重新创建它们。但无法删除链接标签。我甚至试图在另一个链接标签上覆盖一个新的链接标签,但是如果我点击覆盖的链接标签,之前的链接标签就不会出现并显示一些异常错误。

2 个答案:

答案 0 :(得分:0)

`void History_Links()
{
                string name=record[0];
                LinkLabel^ lbl=gcnew LinkLabel();
                lbl->Parent=this;
                lbl->Location=System::Drawing::Point(10,300+(no_of_clicks-1)*15);
                lbl->Size=System::Drawing::Size(55,15);
                lbl->Name=gcnew String(link_names[no_of_clicks-1].c_str());
                lbl->Text= gcnew String(name.c_str());
                lbl->AutoSize = true;


                switch(no_of_clicks)
                 {
                   case 1 :
                      lbl->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::history1_LinkClicked); 
                      break;
                   case 2 :
                       //lbl->Clear();
                      lbl->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::history2_LinkClicked); 
                      break;
                   case 3 :
                      lbl->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::history3_LinkClicked); 
                      break;
                   case 4 :
                      lbl->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::history4_LinkClicked); 
                      break;
                   case 5 :
                      lbl->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::history5_LinkClicked); 
                      break;
                  }

}`

答案 1 :(得分:0)

#pragma once
#include "stdafx.h"
#include <sstream>
#include <fstream>
#include <vcclr.h>
//#include <msclr\marshal_cppstd.h>
//#include <chrono>
//using namespace msclr::interop;

namespace HistoryTracker {

    using namespace System;
    using namespace System::ComponentModel;
    using namespace System::Collections;
    using namespace System::Windows::Forms;
    using namespace System::Data;
    using namespace System::Drawing;
    using namespace System::IO;
    using namespace std;
    using namespace Runtime::InteropServices;

    string history[1000],record[50];
    //string link_names[5]={"history1","history2","history3","history4","history5"};
    int no_of_clicks=0;

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

    protected:
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        ~Form1()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::Button^  button1;
    private: AxAcroPDFLib::AxAcroPDF^  axAcroPDF1;
    private: System::Windows::Forms::Label^  label1;
    private: System::Windows::Forms::Button^  button2;
    private: System::Windows::Forms::LinkLabel^  linkLabel1;
    private: System::Windows::Forms::LinkLabel^  linkLabel2;
    private: System::Windows::Forms::LinkLabel^  linkLabel3;
    private: System::Windows::Forms::LinkLabel^  linkLabel4;
    private: System::Windows::Forms::LinkLabel^  linkLabel5;



    protected: 

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

#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)
        {
            System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
            this->button1 = (gcnew System::Windows::Forms::Button());
            this->axAcroPDF1 = (gcnew AxAcroPDFLib::AxAcroPDF());
            this->label1 = (gcnew System::Windows::Forms::Label());
            this->button2 = (gcnew System::Windows::Forms::Button());
            this->linkLabel1 = (gcnew System::Windows::Forms::LinkLabel());
            this->linkLabel2 = (gcnew System::Windows::Forms::LinkLabel());
            this->linkLabel3 = (gcnew System::Windows::Forms::LinkLabel());
            this->linkLabel4 = (gcnew System::Windows::Forms::LinkLabel());
            this->linkLabel5 = (gcnew System::Windows::Forms::LinkLabel());
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->axAcroPDF1))->BeginInit();
            this->SuspendLayout();
            // 
            // button1
            // 
            this->button1->Location = System::Drawing::Point(909, 11);
            this->button1->Name = L"button1";
            this->button1->Size = System::Drawing::Size(122, 37);
            this->button1->TabIndex = 0;
            this->button1->Text = L"Choose Files";
            this->button1->UseVisualStyleBackColor = true;
            this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
            // 
            // axAcroPDF1
            // 
            this->axAcroPDF1->Anchor = static_cast<System::Windows::Forms::AnchorStyles>((((System::Windows::Forms::AnchorStyles::Top | System::Windows::Forms::AnchorStyles::Bottom) 
                | System::Windows::Forms::AnchorStyles::Left) 
                | System::Windows::Forms::AnchorStyles::Right));
            this->axAcroPDF1->Enabled = true;
            this->axAcroPDF1->Location = System::Drawing::Point(623, 55);
            this->axAcroPDF1->Name = L"axAcroPDF1";
            this->axAcroPDF1->OcxState = (cli::safe_cast<System::Windows::Forms::AxHost::State^  >(resources->GetObject(L"axAcroPDF1.OcxState")));
            this->axAcroPDF1->Size = System::Drawing::Size(515, 580);
            this->axAcroPDF1->TabIndex = 1;
            // 
            // label1
            // 
            this->label1->AutoSize = true;
            this->label1->Location = System::Drawing::Point(16, 11);
            this->label1->Name = L"label1";
            this->label1->Size = System::Drawing::Size(35, 13);
            this->label1->TabIndex = 2;
            this->label1->Text = L"label1";
            this->label1->Click += gcnew System::EventHandler(this, &Form1::label1_Click);
            // 
            // button2
            // 
            this->button2->Location = System::Drawing::Point(1037, 11);
            this->button2->Name = L"button2";
            this->button2->Size = System::Drawing::Size(101, 37);
            this->button2->TabIndex = 3;
            this->button2->Text = L"Exit";
            this->button2->UseVisualStyleBackColor = true;
            this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
            // 
            // linkLabel1
            // 
            this->linkLabel1->AutoSize = true;
            this->linkLabel1->Location = System::Drawing::Point(15, 300);
            this->linkLabel1->Name = L"linkLabel1";
            this->linkLabel1->Size = System::Drawing::Size(13, 13);
            this->linkLabel1->TabIndex = 4;
            this->linkLabel1->TabStop = true;
            this->linkLabel1->Text = L"";
            this->linkLabel1->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::linkLabel1_LinkClicked);
            // 
            // linkLabel2
            // 
            this->linkLabel2->AutoSize = true;
            this->linkLabel2->Location = System::Drawing::Point(15, 315);
            this->linkLabel2->Name = L"linkLabel2";
            this->linkLabel2->Size = System::Drawing::Size(13, 13);
            this->linkLabel2->TabIndex = 5;
            this->linkLabel2->TabStop = true;
            this->linkLabel2->Text = L"";
            this->linkLabel2->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::linkLabel2_LinkClicked);
            // 
            // linkLabel3
            // 
            this->linkLabel3->AutoSize = true;
            this->linkLabel3->Location = System::Drawing::Point(15, 330);
            this->linkLabel3->Name = L"linkLabel3";
            this->linkLabel3->Size = System::Drawing::Size(13, 13);
            this->linkLabel3->TabIndex = 6;
            this->linkLabel3->TabStop = true;
            this->linkLabel3->Text = L"";
            this->linkLabel3->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::linkLabel3_LinkClicked);
            // 
            // linkLabel4
            // 
            this->linkLabel4->AutoSize = true;
            this->linkLabel4->Location = System::Drawing::Point(15, 345);
            this->linkLabel4->Name = L"linkLabel4";
            this->linkLabel4->Size = System::Drawing::Size(13, 13);
            this->linkLabel4->TabIndex = 7;
            this->linkLabel4->TabStop = true;
            this->linkLabel4->Text = L"";
            this->linkLabel4->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::linkLabel4_LinkClicked);
            // 
            // linkLabel5
            // 
            this->linkLabel5->AutoSize = true;
            this->linkLabel5->Location = System::Drawing::Point(15, 360);
            this->linkLabel5->Name = L"linkLabel5";
            this->linkLabel5->Size = System::Drawing::Size(13, 13);
            this->linkLabel5->TabIndex = 8;
            this->linkLabel5->TabStop = true;
            this->linkLabel5->Text = L"";
            this->linkLabel5->LinkClicked += gcnew System::Windows::Forms::LinkLabelLinkClickedEventHandler(this, &Form1::linkLabel5_LinkClicked);
            // 
            // Form1
            // 
            this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
            this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
            this->ClientSize = System::Drawing::Size(1150, 647);
            this->Controls->Add(this->linkLabel5);
            this->Controls->Add(this->linkLabel4);
            this->Controls->Add(this->linkLabel3);
            this->Controls->Add(this->linkLabel2);
            this->Controls->Add(this->linkLabel1);
            this->Controls->Add(this->button2);
            this->Controls->Add(this->label1);
            this->Controls->Add(this->axAcroPDF1);
            this->Controls->Add(this->button1);
            this->Name = L"Form1";
            this->Text = L"Form1";
            (cli::safe_cast<System::ComponentModel::ISupportInitialize^  >(this->axAcroPDF1))->EndInit();
            this->ResumeLayout(false);
            this->PerformLayout();

        }

#pragma endregion
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
                OpenFileDialog^ opendialog =gcnew OpenFileDialog;
                opendialog-> ShowDialog(); 
                axAcroPDF1->src=opendialog->FileName;

                String^ file_name=opendialog->FileName;
                std::string stan_string ;
                //std::string stan_string = marshal_as<string>(file_name);
                MarshalString(opendialog->FileName->ToString(),stan_string);
                 //const __wchar_t __pin * stan_string = PtrToStringChars(file_name);
                ofstream outfile;
                outfile.open("Test.txt", ios::out | ios::app );
                outfile<<stan_string<<endl;
                outfile.close();

                int number_of_lines = 0;
                string line,tempLine;
                ifstream myfile("Test.txt");

                while (std::getline(myfile, line))
                    ++number_of_lines;
                    myfile.close();
                ifstream my_file("Test.txt");
                    for(int i=number_of_lines;i>0;i--)
                 {
                    std::getline(my_file,line);
                    history[i] = line;

                 }
                 my_file.close();
                 ofstream out_file;
                 string fn="history.txt";
                 out_file.open(fn.c_str());
                 for(int i=1;i<=number_of_lines;i++)
                 {
                    out_file<<history[i]<<endl;
                 }
                 out_file.close();

                 String^ ReadedFile=File::ReadAllText("history.txt");
                 label1->Text = ReadedFile;

                 ifstream inFile;
                 ofstream oFile;
                 inFile.open("history.txt");
                 oFile.open("names.txt");

                 while (getline (inFile,line) ){
                // cout << line << endl;
                 int pos = line.find_last_of("\\");

                if (string::npos != pos){
                    tempLine = line.erase(0, pos + 1);
                }

                oFile << tempLine << endl;

                }

                inFile.close();
                oFile.close();
                no_of_clicks++;
                ifstream in_file("names.txt");
                    for(int i=0;i<number_of_lines;i++)
                 {
                    std::getline(in_file,line);
                    record[i] = line;

                 }
                 in_file.close();

                if (no_of_clicks>5){
                    no_of_clicks=no_of_clicks-5;

                }
                   History_Links();
}
void MarshalString ( String ^ s, string& os ) {
     using namespace Runtime::InteropServices;
     System::IntPtr pointer = Marshal::StringToHGlobalAnsi(s);
      char* charPointer = reinterpret_cast<char*>(pointer.ToPointer());
     std::string returnString(charPointer, s->Length);
     Marshal::FreeHGlobal(pointer);
     os = returnString;

    }

public: void History_Links()
{
                string name0=record[0];
                string name1=record[1];
                string name2=record[2];
                string name3=record[3];             
                string name4=record[4];
                this->linkLabel1->Text=gcnew String(name0.c_str());
                this->linkLabel2->Text=gcnew String(name1.c_str());
                this->linkLabel3->Text=gcnew String(name2.c_str());
                this->linkLabel4->Text=gcnew String(name3.c_str());
                this->linkLabel5->Text=gcnew String(name4.c_str());


}

int history_reader()
{
    int number_of_lines = 0;
            string line;
            ifstream myfile("Test.txt");

            while (std::getline(myfile, line))
                ++number_of_lines;
                myfile.close();
            ifstream my_file("Test.txt");
                for(int i=number_of_lines;i>0;i--)
             {
                std::getline(my_file,line);
                history[i] = line;
             }
                my_file.close();
                return number_of_lines;
}


private: System::Void label1_Click(System::Object^  sender, System::EventArgs^  e) {
                 // Application::Exit();
}

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {
            std::ofstream oftest;
            oftest.open("Test.txt", std::ofstream::out | std::ofstream::trunc);
            oftest.close();
            std::ofstream ofhistory;
            ofhistory.open("history.txt", std::ofstream::out | std::ofstream::trunc);
            ofhistory.close();
            std::ofstream ofnames;
            ofnames.open("names.txt", std::ofstream::out | std::ofstream::trunc);
            ofnames.close();
            Application::Exit();
}
private: System::Void linkLabel1_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e) {
            history_reader();    
            string str1=history[1];
            String^ str2 = gcnew String(str1.c_str());
            //axAcroPDF1->src=str2;
            OpenFileDialog^ opendialog =gcnew OpenFileDialog;
            opendialog->FileName=str2;
            //opendialog-> ShowDialog(); 
            axAcroPDF1->src=opendialog->FileName;
         }
private: System::Void linkLabel2_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e) {
            history_reader();    
            string str1=history[2];
            String^ str2 = gcnew String(str1.c_str());
            //axAcroPDF1->src=str2;
            OpenFileDialog^ opendialog =gcnew OpenFileDialog;
            opendialog->FileName=str2;
            //opendialog-> ShowDialog(); 
            axAcroPDF1->src=opendialog->FileName;
         }
private: System::Void linkLabel3_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e) {
            history_reader();    
            string str1=history[3];
            String^ str2 = gcnew String(str1.c_str());
            //axAcroPDF1->src=str2;
            OpenFileDialog^ opendialog =gcnew OpenFileDialog;
            opendialog->FileName=str2;
            //opendialog-> ShowDialog(); 
            axAcroPDF1->src=opendialog->FileName;
         }
private: System::Void linkLabel4_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e) {
            history_reader();    
            string str1=history[4];
            String^ str2 = gcnew String(str1.c_str());
            //axAcroPDF1->src=str2;
            OpenFileDialog^ opendialog =gcnew OpenFileDialog;
            opendialog->FileName=str2;
            //opendialog-> ShowDialog(); 
            axAcroPDF1->src=opendialog->FileName;
         }
private: System::Void linkLabel5_LinkClicked(System::Object^  sender, System::Windows::Forms::LinkLabelLinkClickedEventArgs^  e) {
            history_reader();    
            string str1=history[5];
            String^ str2 = gcnew String(str1.c_str());
            //axAcroPDF1->src=str2;
            OpenFileDialog^ opendialog =gcnew OpenFileDialog;
            opendialog->FileName=str2;
            //opendialog-> ShowDialog(); 
            axAcroPDF1->src=opendialog->FileName;
         }
};
}