【问题标题】:Creating a Windows Forms Control (C++)创建 Windows 窗体控件 (C++)
【发布时间】:2009-10-19 22:17:44
【问题描述】:

试图在 msdn 上运行 this basic form control example

在“向控件添加自定义属性”部分的第 1 步,我们将 ClickAnywhere 代码放在类的公共部分。

第一个错误:“error C2144: 语法错误:'bool' 前面应该有 ';'

这种语法在 C++ 中是否正确? (见下文)
(删除代码的 ClickAnywhere 部分,它编译得很好......)

#pragma once

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


namespace clickcounter
{
    /// <summary> 
    /// Summary for clickcounterControl
    /// </summary>
    ///
    /// WARNING: If you change the name of this class, you will need to change the 
    ///          'Resource File Name' property for the managed resource compiler tool 
    ///          associated with all .resx files this class depends on.  Otherwise,
    ///          the designers will not be able to interact properly with localized
    ///          resources associated with this form.
    public __gc class clickcounterControl : public System::Windows::Forms::UserControl
    {   
    public:



//Problem code*****  


property bool ClickAnywhere { //Is this syntax right in C++?
    bool get() {
        return (label1->Dock == DockStyle::Fill);
    }
    void set(bool val) {
        if (val) 
            label1->Dock = DockStyle::Fill;
        else 
            label1->Dock = DockStyle::None;
    }
}
//End Problem code***** 


        clickcounterControl(void)   
        {
            InitializeComponent();
        }



    protected:
        void Dispose(Boolean disposing) 
        {
            if (disposing && components)
            {
                components->Dispose();
            }
            __super::Dispose(disposing);
        }
    private: System::Windows::Forms::Label *  label1;

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

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        void InitializeComponent(void)
        {
            this->label1 = new System::Windows::Forms::Label();
            this->SuspendLayout();
            // 
            // label1
            // 
            this->label1->BorderStyle = System::Windows::Forms::BorderStyle::FixedSingle;
            this->label1->Location = System::Drawing::Point(32, 40);
            this->label1->Name = S"label1";
            this->label1->Size = System::Drawing::Size(30, 20);
            this->label1->TabIndex = 0;
            this->label1->Text = S"0";
            this->label1->TextAlign = System::Drawing::ContentAlignment::MiddleCenter;
            this->label1->Click += new System::EventHandler(this, label1_Click);
            // 
            // clickcounterControl
            // 
            this->Controls->Add(this->label1);
            this->Name = S"clickcounterControl";
            this->Size = System::Drawing::Size(100, 100);
            this->ResumeLayout(false);

        }
    private: System::Void label1_Click(System::Object *  sender, System::EventArgs *  e)
             {
                int temp = System::Int32::Parse(label1->Text);
                temp++;
                label1->Text = temp.ToString();
             }

    };
}

【问题讨论】:

  • 为了记录,这是 C++/CLR,而不是普通的 C++。
  • 这是真的。我是否需要配置不同的设置才能在 Visual C++ .net 2003 中编译它?
  • 可能。在 CLR 下启动一个新项目,然后选择 Windows 窗体应用程序。看看这是否能解决任何问题。

标签: c++ windows winforms winapi


【解决方案1】:

由于您使用的是 Visual Studio .Net 2003,因此您使用的是托管 C++,而不是 C++/CLI。语法有显着差异。对于属性,您必须使用 __property 关键字,而不是 C++/CLI property 关键字及其新样式。

因此应该是:

__property bool get_ClickAnywhere() {
    return (label1->Dock == DockStyle::Fill);
}
__property void set_ClickAnywhere(bool value) {
    if (value)
        label1->Dock = DockStyle::Fill;
    else 
        label1->Dock = DockStyle::None;
}

看起来您在使用 Visual Studio 2003 的同时遵循为 C++/CLI(Visual Studio 2005 和更高版本)编写的指南被绊倒了。

【讨论】:

    猜你喜欢
    • 2013-11-04
    • 2020-11-07
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多