3

我正在尝试制作一个在窗口中绘制一些数据的 Visual C++ 2008 程序。我从不同的 地方读到了正确的方法是重写 WndProc。因此,我在 Visual C++ 2008 Express Edition 中制作了一个 Windows 窗体应用程序,并将此代码添加到 Form1.h,但它不会编译:

    public:
    [System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    virtual void WndProc(Message %m) override
    {
        switch(m.Msg)
        {
            case WM_PAINT:
            {
                HDC     hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(m.HWnd, &ps);

                // i'd like to insert GDI code here

                EndPaint(m.Wnd, &ps);
                return;
            }
        }
        Form::WndProc(m);
    }

当我尝试在 Visual C++ 2008 Express Edition 中编译它时,会出现此错误: 错误 C2664: 'BeginPaint' : cannot convert parameter 1 from 'System::IntPtr' to 'HWND'

当我尝试使用 this->Handle 而不是 m.HWnd 时,会发生相同的错误。

当我尝试将 m.HWnd 转换为 (HWND) 时,会出现此错误: 错误 C2440: 'type cast' : cannot convert from 'System::IntPtr' to 'HWND'

也许我需要将 m.HWnd 转换为 pin_ptr 或其他东西。

4

3 回答 3

2

您参考的文章讨论了如何在本机 C++ 应用程序中进行操作,而不是在 WinForms 应用程序中。您应该重写 OnPaint 方法,而不是在 WndProc 中处理消息。

于 2009-03-13T00:58:49.790 回答
2

如果您正在制作原始 Win32 应用程序,那么您可以使用这些功能。

另一方面,如果您正在制作 WinForms 应用程序,那么您需要覆盖 OnPaint 事件。

  • 切换到设计视图(显示表单的视图。)
  • 单击表单的标题栏
  • 在属性窗口中(默认情况下可能在您的右下角屏幕上)选择靠近顶部的闪电。这将显示事件列表。
  • 向下滚动到绘画事件并双击它。

您最终将得到一个 Paint 例程外壳,您可以从中使用图形对象的绘图功能。


private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) 
{
    e->Graphics->DrawRectangle(...)              
}

如果你真的想写原始的 Win32 代码,请告诉我,我可以帮你写一个 shell。目前,如果您对 Win32 感兴趣,我推荐 Charles Petzold 的 Programming Windows 5th edition。

如果你想学习 C++ WinForms...好吧,我建议切换到 C# 或 VB.NET,因为它们可能更直观。

希望这可以帮助。干杯。

于 2009-03-13T01:11:17.750 回答
1

我认为你在 Win32 编程(必须覆盖 WM_PAINT)和 Windows Forms / .NET 之间混淆了,你只需要覆盖 draw 方法。

在 .NET 中在表单上绘图非常简单!您只需覆盖 OnPaint 方法,然后执行所有绘图。

您可以使用 Visual Studio 中的工具箱或在您的类中使用以下代码绑定到绘制处理程序;

this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyForm_Paint); 

然后像这样实现 MyForm_Paint 方法;

private void MyForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  //create a graphics object from the form
  Graphics g = this.CreateGraphics();

  // create  a  pen object with which to draw
  Pen p = new Pen(Color.Red, 7);  // draw the line 

  // call a member of the graphics class
  g.DrawLine(p, 1, 1, 100, 100);
}
于 2009-03-13T01:01:29.427 回答