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

StackOverflow https://stackoverflow.com/questions/641089

  •  22-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь создать программу Visual C++ 2008, которая отображает некоторые данные в окне.Я прочитал из различный места правильный способ сделать это — переопределить 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:«БегинПаинт»:невозможно преобразовать параметр 1 из «System::IntPtr» в «HWND»

Когда я пытаюсь использовать this->Handle вместо m.HWnd, возникает та же ошибка.

Когда я пытаюсь привести m.HWnd к (HWND), возникает эта ошибка:ошибка C2440:'приведение типов':невозможно преобразовать из «System::IntPtr» в «HWND»

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

Это было полезно?

Решение

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

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

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

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


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

Если вы действительно хотите написать необработанный код Win32, дайте мне знать, и я помогу вам написать оболочку.На данный момент, если вас интересует Win32, я рекомендую книгу Чарльза Петцольда «Программирование Windows 5-е издание».

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

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

Другие советы

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

Я думаю, что вы перепутали программирование на 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top