【问题标题】:Using PaintEventHandler - Visual C++ (Studio 2010) Windows Forms Application使用 PaintEventHandler - Visual C++ (Studio 2010) Windows 窗体应用程序
【发布时间】:2023-03-19 22:18:01
【问题描述】:

所以,我正在 Visual C++ 2010 中创建一个 Windows 窗体应用程序,并且我想将一个事件添加到一个文本框中。当程序加载时,一个字母 A 会打印到屏幕上。当你输入文本框时,字母应该会变成红色。

文本框的名称是 AngleA,这是我目前的代码:

this->AngleA->Enter += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::AngleA_Enter);
//many lines later
this->Controls->Add(this->AngleA);
//many lines later
public: System::Void Form1::AngleA_Enter(System::Object^  sender, PaintEventArgs^  e) 
     {
         System::Drawing::Font^ textFontA = gcnew System::Drawing::Font("Arial", 16);
         System::Drawing::SolidBrush^ textBrushA = gcnew System::Drawing::SolidBrush(Color::Red);
         e->Graphics->DrawString("A", textFontA, textBrushA, 300, 120);
     }

字母的原始绘制发生在一个单独的函数中,这里:

    public: virtual Void Form1::OnPaint(PaintEventArgs^ pe ) override
{
   Graphics^ g = pe->Graphics;

   System::Drawing::Font^ textFont = gcnew System::Drawing::Font("Times New Roman", 16);

   SolidBrush^ textBrushA = gcnew SolidBrush(Color::Black);

   g->DrawString("A", textFont, textBrushA, 300, 120);

}

所以,原始字母的绘制效果很好,但是每次我尝试使用 Enter 事件构建程序时,都会收到以下错误:

error C2664: 'System::Windows::Forms::Control::Enter::add' : cannot convert parameter 1 from 'System::Windows::Forms::PaintEventHandler ^' to 'System::EventHandler ^'
1>          No user-defined-conversion operator available, or
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

在我看来,form1 对象(Windows 窗体应用程序中类的默认名称)只接受“this->AngleA->Enter += gcnew”的 EventHandler 参数,而不接受 PaintEventHandler,但我不明白为什么.有什么方法可以创建一个 Enter 事件函数,允许我在程序加载后根据事件进行绘画?

感谢您的帮助,我希望我的问题很清楚:)

【问题讨论】:

    标签: .net visual-studio-2010 c++-cli


    【解决方案1】:

    您只能在Paint 事件中添加PaintEventHandler;不要参加Enter 事件。

    您可能希望将普通的EventHandler 添加到Enter 事件并在处理程序中调用Invalidate()

    【讨论】:

    • 好的,我明白了。问题是,我不想重新绘制控件本身,我想在窗口的不同部分在现有的上绘制一个红色字母 A。如何定义要绘制的字符串“A”的区域?
    • Paint 处理程序中,你可以绘制任何你想要的东西,它会覆盖控件。
    • 我想我真的不明白 Invalidate() 是如何工作的;这是我得到的:codepublic: System::Void Form1::AngleA_Enter(System::Object^ sender, EventArgs^ e) { Rectangle rectangle;矩形.X = 250;矩形.Y = 120;矩形.宽度 = 30;矩形.高度 = 30;无效(矩形);显然这与我想要的相去甚远。如何按照您所指的方式使用 invalidate() 函数?
    • 使用 InvokePaint() 怎么样?
    • InvokePaint 无济于事。 Invalidate 应该可以工作;使用调试器找出发生了什么。
    最近更新 更多