Правильное значение параметра hWnd в BeginPaint?

Я пытаюсь создать программу Visual C++ 2008, которая отображает некоторые данные в окне. Я прочитал разные places правильный способ сделать это — переопределить WndProc. Итак, я создал приложение Windows Forms в Visual C++ 2008 Express Edition и добавил этот код в 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: 'приведение типа': невозможно преобразовать из 'System::IntPtr' в 'HWND'

Может быть, мне нужно преобразовать m.HWnd в pin_ptr или что-то в этом роде.


person David Grayson    schedule 13.03.2009    source источник


Ответы (3)


Если бы вы создавали необработанное приложение Win32, вы могли бы использовать эти функции.

Если, с другой стороны, вы создаете приложение WinForms, вам необходимо переопределить событие OnPaint.

  • Переключитесь в режим конструктора (представление, в котором отображается ваша форма).
  • Нажмите на строку заголовка вашей формы
  • В окне свойств (по умолчанию, вероятно, в правом нижнем углу экрана) выберите молнию вверху. Это отобразит список событий.
  • Прокрутите вниз до события рисования и дважды щелкните его.

Вы получите обычную оболочку Paint, из которой вы сможете использовать функции рисования графического объекта.


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

Если вы действительно хотите писать необработанный код Win32, дайте мне знать, и я помогу вам написать оболочку. В настоящее время, если вы заинтересованы в Win32, я рекомендую Charles Petzold Programming Windows 5th edition.

Если вы хотите изучить C++ WinForms... что ж, я рекомендую переключиться на C# или VB.NET просто потому, что они могут быть более интуитивно понятными.

Надеюсь это поможет. Ваше здоровье.

person user72491    schedule 13.03.2009

В статьях, на которые вы ссылаетесь, обсуждается, как это сделать в собственном приложении C++, а не в приложении WinForms. Вы должны переопределить метод OnPaint вместо обработки сообщения в WndProc.

person Michael    schedule 13.03.2009

Я думаю, вы путаетесь между программированием Win32 (необходимо переопределить WM_PAINT) и Windows Forms/.NET, где вам нужно только переопределить метод рисования.

Рисовать на форме в .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);
}
person Andrew Grant    schedule 13.03.2009
comment
Я полагаю, что он имеет в виду код C++, Эндрю, а не C#. Разницы достаточно, чтобы запутать беднягу. - person user72491; 13.03.2009
comment
Да, к счастью, у меня большой опыт работы с C#, поэтому я узнаю его, когда увижу, и довольно быстро переведу на C++. Спасибо за указание на разницу между приложением Win32 и приложением Windows Forms, Эндрю Грант. - person David Grayson; 13.03.2009
comment
Странно, код в исходном вопросе выглядит так, будто я не видел C++! - person Andrew Grant; 13.03.2009