Правильное значение параметра hWnd для BeginPaint?
Вопрос
Я пытаюсь создать программу 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);
}