我正在尝试制作一个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或其他东西。
答案 0 :(得分:2)
您引用的文章讨论了如何在本机C ++应用程序中进行操作,而不是在WinForms应用程序中。您应该重写OnPaint方法,而不是处理WndProc中的消息。
答案 1 :(得分:2)
如果您正在制作原始Win32应用程序,那么您可以使用这些功能。
另一方面,如果您正在创建WinForms应用程序,则需要覆盖OnPaint事件。
您最终会得到一个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);
}