Правильное значение для параметра hWnd BeginPaint? - PullRequest
3 голосов
/ 13 марта 2009

Я пытаюсь создать программу для 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: «BeginPaint»: невозможно преобразовать параметр 1 из «System :: IntPtr» в «HWND»

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

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

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

Ответы [ 3 ]

2 голосов
/ 13 марта 2009

Если вы делали сырое приложение 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 просто потому, что они могут быть более интуитивными.

Надеюсь, это поможет. Приветствия.

2 голосов
/ 13 марта 2009

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

1 голос
/ 13 марта 2009

Я думаю, что вы перепутали программирование на 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);
}
...