正确的BeginPaint的hWnd参数值?

时间:2009-03-13 00:50:59

标签: .net c++ gdi

我正在尝试制作一个Visual C ++ 2008程序,它在一个Window中绘制一些数据。我从various places读取了正确的方法是覆盖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':无法将参数1从'System :: IntPtr'转换为'HWND'

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

当我尝试将m.HWnd转换为(HWND)时,会发生以下错误: 错误C2440:'type cast':无法从'System :: IntPtr'转换为'HWND'

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

另一方面,如果您正在创建WinForms应用程序,则需要覆盖OnPaint事件。

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

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


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

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

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

希望这会有所帮助。欢呼声。

答案 2 :(得分: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);
}