GDI+开发环境配置

下载GDI+ SDK for Visual C++6.0

下载地址: http://groups.google.com/group/tim-files/files?upload=1     名为GDIPlus.zip

配置Visual C++6.0环境

将GDI+下的Include文件夹添加到Visual C++6.0

Tools->Options->Directorys下的的Include files下面添加GDI+的Include文件夹的路径,见下图:

将GDI+下的Lib文件夹添加到Visual C++6.0

Tools->Options->Directorys下的的Lib files下面添加GDI+的Lib文件夹的路径,见下图:

配置Visual C++6.0的工程环境

在StdAfx.h中添加代码

添加的代码如下:
#define ULONG_PTR ULONG
#include <gdiplus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")

编译、连接工程

至于如何编译和连接工程,我想就不废话了吧,按两下按钮就OK了。
将GDI+解压出来的文件下的gdiplus.dll拷贝到工程Debug或Release目录下。

在CWinApp派生类中添加成员变量

如果你的工程名字是test,那么CWinApp的派生类的名字就为CtestApp。在CtestApp的头文件(也就是test.h)中,添加如下代码:
private:
  GdiplusStartupInput m_gdiplusStartupInput;
  ULONG_PTR m_pGdiToken;

在CWinApp派生类中的InitialInstance函数中添加初始化代码

添加的代码如下:
GdiplusStartup(&m_pGdiToken,&m_gdiplusStartupInput,NULL);
注意:一定要添加在 m_pMainWnd->ShowWindow(SW_SHOW);之前。

为CWinApp派生类添加Virtual Function

添加的虚函数的名字为ExitInstance,并在ExitInstance中添加如下退出GDI+的代码:
GdiplusShutdown(m_pGdiToken);

测试GDI+环境是否配置成功

新建一个单文档工程,然后在工程的OnDraw函数中添加如下代码:
Graphics graphics(pDC->m_hDC);
Pen pen(Color(255, 0, 255));
graphics.DrawLine(&pen, 0, 0, 200, 100);
然后编译,运行工程,如果可以显示出一条线,就证明已经配置成功了。

特别注意

如果你建立的是一个基于对话框的程序,可能无法使用GDI+。因为我尝试过在对话框程序下面配置GDI+,总是出现如下的错误:
f:/includes/gdiplusenums.h(29) : error C2146: syntax error : missing ';' before identifier 'GraphicsState'
f:/includes/gdiplusenums.h(29) : fatal error C1004: unexpected end of file found
即使你在 #include <gdiplus.h>之前加上#include <afxdtctl.h>,那么在编译阶段是不会有错误的,但是连接的时候就会出现同样的错误,而且不能通过。
但是,单文档的应用程序,按照上面的配置就不会出现编译或链接的错误的。
但是,不知道为什么,后来我建立了一个基于对话框的程序,就没有上面的编译的问题。只是不能绘制出曲线。
如果是基于对话框的程序,那么需要相应WM_PAINT消息,然后再OnPaint函数中添加如下代码:
void CDlgGDIDlg::OnPaint()
{
  CPaintDC dc(this); // device context for painting
  
  CDC* pDC=GetDC();
  Graphics graphics(pDC->GetSafeHdc());
  
    //添加自己的绘制代码
  
  ReleaseDC(pDC);
}
可是仍不能绘制出曲线,原因是如果你建立的是基于对话框的应用程序,那么初始化InitialInstance中的初始化GDI+的代码必须放在DoModal函数之前。然而,即便如此,我发现在OnPait函数中的GDI+代码可以画出来,可是在按钮下面的仍然是编译通过,但是画不出来。
不过有一种解决方法就是在按钮下面调用OnPaint函数,然后再调用RedrawWindow函数就可以了。比如下面的程序:
void CGDIDlg::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 
 // TODO: Add your message handler code here
 // Do not call CDialog::OnPaint() for painting messages
 
 
 using namespace Gdiplus;
    Graphics graphics( dc.m_hDC );
 if(m_filename!="")
 {
  Image image(m_filename.AllocSysString());
  graphics.DrawImage(&image,0,0);
  UpdateWindow();
 }
 
}
void CGDIDlg::OnFileOpen()
{
 // TODO: Add your command handler code here
 //利用系统的打开对话框
 static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|JPG文件(*.jpg)|*.jpg|All Files(*.*)|*.*||";
  CFileDialog dlg(true,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
  if(dlg.DoModal()==IDOK)
  {
   UpdateData(true);
   m_filename=dlg.GetPathName();
  m_pImage=Image::FromFile(m_filename.AllocSysString());
  }
  else
  {
   return;
  }
 OnPaint();
 
 RedrawWindow(); 
}
如果是单文档或多文档的,要在OnDraw函数中添加如下代码:
void CExampleView::OnDraw(CDC* pDC)
{
    CExampleDoc* pDoc=GetDocument();
    ASSERT_VALID(pDoc);
    if(!pDoc) return;
 
    //添加内容
    Graphics graph(pDC->GetSafeHdc());
    //添加自己的绘制代码
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值