科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件托管C++中GDI 和GDI混合编程技术

托管C++中GDI 和GDI混合编程技术

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在托管C++中通过平台调用来实现GDI 和GDI的混合编程,不仅可以克服GDI 中的不足,如XOR的光栅操作,更主要的是可以借助MFC DLL来拓展GDI 的图形图像的开发能力。

作者:丁有和 来源:天极网 2007年11月16日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
3.3 实例

  这个实例是用来显示实现绘制直线的橡皮条过程,如图1所示的窗体。其中平台调用的GDI函数和结构如下面的代码:

namespace GDI32
{
 using namespace System;
 using namespace System::Runtime::InteropServices;
 typedef void* HDC;
 typedef void* HPEN;
 [StructLayout(LayoutKind::Sequential)]
 public __value struct POINT
 {
  public:
   long x; // long或Int32
   long y;
 };
 [DllImport("gdi32", EntryPoint="SetROP2")]
 extern "C" int SetROP2(HDC hDC, int fnDrawMode); // 设置光栅操作模式
 [DllImport("gdi32", EntryPoint="CreatePen")]
 extern "C" HPEN CreatePen(int fnPenStyle, int nWidth, unsigned long crColor);
 // 创建画笔
 [DllImport("gdi32", EntryPoint="SelectObject")]
 extern "C" void* SelectObject(HDC hDC, void* hGdiobj);
 // 选入GDI属性对象
 [DllImport("gdi32", EntryPoint="LineTo")]
 extern "C" bool LineTo(HDC hDC, int nXEnd, int nYEnd);
 // 画线
 [DllImport("gdi32", EntryPoint="MoveToEx")]
 extern "C" bool MoveTo(HDC hDC, int x, int y, POINT* pt);
 // 移动当前位置
}

  在鼠标移动事件(MouseMove)处理方法中的主要代码如下:

private: System::Void On_MouseMove(System::Object * sender, System::Windows::Forms::MouseEventArgs * e)
{
 ……
 Graphics *g = this->panel1->CreateGraphics();
 // 创建与panel1控件相关联的Graphics
 IntPtr hdc = g->GetHdc();
 GDI32::HPEN hPen = GDI32::CreatePen( 0, 0, 0xA0A0A0 ); // 创建灰色画笔
 GDI32::SelectObject( (GDI32::HDC)hdc, hPen ); // 选入画笔
 GDI32::SetROP2( (GDI32::HDC)hdc, 7 ); // 7表示XORPEN模式
 GDI32::MoveTo( (GDI32::HDC)hdc, pt.X, pt.Y, NULL );
 GDI32::LineTo( (GDI32::HDC)hdc, ptPrev.X, ptPrev.Y );
 ptPrev = Point( e->X, e->Y );
 GDI32::MoveTo( (GDI32::HDC)hdc, pt.X, pt.Y, NULL );
 GDI32::LineTo( (GDI32::HDC)hdc, ptPrev.X, ptPrev.Y );
 g->ReleaseHdc( hdc );
}


图1 GDI+和GDI混合编程实例
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章