关于vc++6.0和GDI+的问题,有经验的来回答

jjjy 2005-11-10 10:48:36
需求:
a.我想在vc++6.0中使用GDI+
b.但是本机有很多代码,动态链接库都是要用vc++6.0编写的;

看了很多帖子都说要下载更新sdk;
问题1:
不知道下载更新SDK 对以前,使用vc++6.0编译的程序有什么影响;
我以前的工程是否能够正确编译;
问题2:
实际上更新SDK,是做了什么 工作;
问题3:
vc++6.0能否在不更新的情况下使用GDI+?
例如:我下载GDI+相关 .h,下载.Lib,下载.dll 等文件
然后在工程中引用,使用,是否能行?如果可以的话希望提供
相关的下载地址;
问题4:这样写出来的GDI+相关的dll是否能够正确的供vc++6.0编写的
工程代码使用
...全文
389 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenailin 2006-03-21
  • 打赏
  • 举报
回复
//初始化GDI+

GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
// destory
ULONG_PTR m_gdiplusToken;

GdiplusShutdown(m_gdiplusToken);
Stefine 2005-11-10
  • 打赏
  • 举报
回复
如果不更新SDK,只加载GDI+的头文件和库文件是否可行?

好像不太行


建议自己咯GOOGLE再查下
jjjy 2005-11-10
  • 打赏
  • 举报
回复
感谢小三的回答:
Software Development Kit
软件开发包;

但还是有些疑问
两个不同的SDK,可以在一台机器上共存吗?
不同SDK开发出来的东西,是否能够正常调用;

希望能够提供,GDI+的头文件和库文件的下载地址;
你给的连接文章中的连接,是无效的;
如果不更新SDK,只加载GDI+的头文件和库文件是否可行?
lixiaosan 2005-11-10
  • 打赏
  • 举报
回复
http://www.vcfans.com/article/vc/2005/08/041055398.htm
lixiaosan 2005-11-10
  • 打赏
  • 举报
回复
当微软每次推出一个重要的Windows版本,一般都会同时推出一个SDK(Software Development Kit),SDK中包括开发该版本Windows所需要的函数和常数定义、API函数说明文档、相关的工具和示例。SDK一般都使用C语言,但不包括编译器。SDK可以在微软的站点下载,也可以在MSDN专业版和企业版的光盘中找到。安装SDK后,使用VC++编写和编译程序就可以了。VC++中包括了 SDK中的所有头文件、帮助、示例和工具,所以如果你使用的是VC++,你一般就不需要SDK了。只有当你的VC++版本比较低,如你使用的是VC++ 5.0,而想利用Win98中提供的新功能时,才需要安装SDK。从Windows 98起,Windows SDK叫Platform SDK(http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en)。Platform SDK包括最新的Windows API(如Windows 2000的新函数)的有关声明、例子,值得下载。
jjjy 2005-11-10
  • 打赏
  • 举报
回复
调试发现
先前下载的
GDI+运行包是错误的 伤心
jjjy 2005-11-10
  • 打赏
  • 举报
回复
在运行例子时
编译通过
老是出来 错误
无法定位程序输入点GdiplusShutdown于动态链接库gdiplus.dll

DM0025:Error attaching to process

怎么回事?
jjjy 2005-11-10
  • 打赏
  • 举报
回复
^_^ 谢谢大家的答复
已经下载了 GDI+运行包
下载路径:
www.codeguru.com/code/legacy/gdi/GDIPlus.zip

不知道怎么判别该包是否是比较新的版本;
to:大家
有没有简单的例子,
和GDI+的帮助文档 给我发个;或给个连接地址,自己下;
另外,我的信箱:yangj_un@163.com
dawndu 2005-11-10
  • 打赏
  • 举报
回复
如果不更新SDK,只加载GDI+的头文件和库文件是否可行?
可以,老夫用了这么久了也没事
ddmor 2005-11-10
  • 打赏
  • 举报
回复
你放心吧,找到这些文件就可以在vc6中使用。我就是一直在vc6下用gdi+。如果找不到可以留一个电子邮箱我发给你。
ddmor 2005-11-10
  • 打赏
  • 举报
回复
可以不用更新SDK,当然更新了更好,推荐更新到windows2003的sdk。
如果在VC6。0中,可以在网上找到以下32个文件就可以了
gdiplus.dll//运行库文件
GdiPlus.lib//链接库
//30个头文件
GdiPlus.h
GdiPlusBase.h
GdiPlusBitmap.h
GdiPlusBrush.h
GdiPlusCachedBitmap.h
GdiPlusColor.h
GdiPlusColorMatrix.h
GdiPlusEnums.h
GdiPlusFlat.h
GdiPlusFont.h
GdiPlusFontCollection.h
GdiPlusFontFamily.h
GdiPlusGpStubs.h
GdiPlusGraphics.h
GdiPlusHeaders.h
GdiPlusimageAttributes.h
GdiPlusImageCodec.h
GdiPlusImaging.h
GdiPlusLineCaps.h
GdiPlusMatrix.h
GdiPlusMem.h
GdiPlusMetaFile.h
GdiPlusMetaHeader.h
GdiPlusPath.h
GdiPlusPen.h
GdiPlusPixelFormats.h
GdiPlusRegion.h
GdiPlusStringFormat.h
GdiPlusTypes.h
GdiPlusInit.h
标准Windows应用程序窗口一般为带有标题栏的浅灰色矩形外观,因而“异形”对话框/窗口也主要是颜色与外形上动手脚。改变背景颜色 改变对话框(窗口)的背景颜色是最简单的改变Windows应用程序外观的方法,根据Windows创建与管理机理,一般有两种方法。一种是处理WM_CTLCOLOR消息,首先创建所选背景颜色的刷子,然后调用SetBkColor()或SetDialogBkColor()以所创建的刷子来绘制窗口或对话框的背景。需要重画窗口或对话(或对话的子控件)时,Windows向对话发送消息WM_CTLCOLOR,应用程序处理WM_CTLCOLOR消息并返回一个用来绘画对话背景的刷子句柄。另外一种是响应Windows的WM_ERASEBKGND消息,Windows向窗口发送一个WM_ERASEBKGND消息通知该窗口擦除背景,可以使用VC++的ClassWizard重载该消息的缺省处理程序来擦除背景(实际是用刷子画),并返回TRUE以防止Windows擦除窗口。2.改变窗口外形通过使用新的SDK函数SetWindowRgn(),可以将绘画和鼠标消息限定在窗口的一个指定的区域,因此实际上是使窗口成为指定的不规则形状(区域形状)。“区域”是Windows GDI中一种强有力的机制,区域是设备上的一块空间,可以是任意形状,复杂的区域可以由各个小区域组合而成。Windows内含的区域创建函数有CreateRectRgn()、CreatePolyRgn()、CreatePolygonRgn()、CreateRoundRectRgn()和CreateEllipticRgn(),再通过CombineRgn()来组合区域,即可得到复杂形状的区域,获得复杂形状的窗口外形。通过上面的方法虽然可以得到“异形”窗口,但感觉颜色单调,外形也不够“COOL”,能否获得更酷的“异形”对话框/窗口呢?回答是肯定的。下面就介绍利用位图和蒙板创建“异形”对话框/窗口的方法。3.利用位图创建异形对话框窗口利用位图创建异形对话框原理是根据象素的颜色来进行“扣像”处理,对所有非指定颜色象素区域进行区域组合。利用这一技术,实际上就是实现对话框/窗口的位图背景,并且对指定的颜色区域进行透明处理。下面就以透明位图为背景的对话框为例来说明:首先用绘图软件如PhotoShop绘制编辑一幅拟做对话框背景用的图片,用BMP格式保存,假设存为Back.Bmp。需要说明的是,虽然Visual C++集成开发环境的资源编辑器只能编辑不超过16色的位图,但完全我们可以以真彩色方式存储,不必理会Visual C++的警告。下一步是用Visual C++的AppWizard创建一个基于对话框的应用程序假定命名为Trans。用资源编辑器引入背景图片Back.Bmp,如果是高彩色,不必理会出现的警告信息,点击OK确认即可。为了明确,修改默认的资源ID标识IDB_BITMAP1为IDB_BACKBMP。然后修改对话框的Style为Popup,Border为None,如图1 。图1向CTransDlg类添加区域处理功能模块void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*背景位图资源ID*/, UINT MaskBitmapID /*区域处理位图资源ID*/, COLORREF TransColor = 0x00000000 /*透明颜色值,默认为黑色*/)。到目前为止,我们暂时认为MaskBitmapID等同于BackBitmapID。其核心工作是根据MaskBitmapID指示位图的象素颜色进行区域组合。完整的代码如下:void CTransDlg::SetupRegion(CDC *pDC /*对话框窗口DC*/, UINT BackBitmapID /*背景位图资源ID*/,UINT MaskBitmapID /*区域处理位图资源ID*/,COLORREF TransColor /*透明颜色值*/){CDC memDC;CBitmap cBitmap;CBitmap* pOldMemBmp = NULL;COLORREF cl;CRect cRect;UINT x, y;CRgn wndRgn, rgnTemp;//取得窗口大小GetWindowRect(&cRect);//背景位图资源IDm_BackBitmapID = BackBitmapID//装载位图cBitmap.LoadBitmap(MaskBitmapID);memDC.CreateCompatibleDC(pDC);pOldMemBmp = memDC.SelectObject(&cBitmap);//首先创建默认的完整区域为完整的窗口区域wndRgn.CreateRectRgn(0, 0, cRect.Width(), cRect.Height());//下面的两层循环为检查背景位图象素颜色,进行透明区域处理;//当象素颜色为指定的透明值时,即将该点从区域中剪裁掉。//其中用到的几个成员变量m_MaskLeftOff、m_MaskTopOff、//m_MaskRightOff、m_MaskBottomOff、m_FrameWidth//和m_CaptionHeight,其作用后面再作说明,此时可全部当作0来处理。for(x= m_FrameWidth+m_MaskLeftOff;x<=cRect.Width() - m_FrameWidth-m_MaskRightOff; x++){for(y = m_CaptionHeight+m_MaskTopOff; yBitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRC/DownloadFiles\a\2001-10-12\COPY);if (pOldMemBmp) memDC.SelectObject( pOldMemBmp );//删除系统却省的OnEraseBkgnd功能//return CDialog::OnEraseBkgnd(pDC);return TRUE;}接下来是在WM_PAINT的消息处理函数OnPaint()中添加代码。由于当背景位图比较大时,进行区域处理比较耗时,所以只在启动时进行一次处理。一种方法是OnInitDialog()处理,但这样会在从启动程序到窗口出现有相当的延迟,易引起程序尚未启动的误解。再一种方法就是在OnPaint()处理,但为了避免重复处理,可以加上一个判断标志。以下是OnPaint()的代码,正体为AppWizard生成,粗体为自己添加内容。void CTransDlg::OnPaint() {if (IsIconic()){……}else{if(m_nFirstRun){ //首次运行标志//修改鼠标光标为等待方式BeginWaitCursor();//设置背景区域SetupRegion(GetWindowDC(), 计算机教程用VC++实现异形窗口.来自www.itwen.comIT WEN计算机教程网 IDB_BACKBMP, IDB_BACKBMP, 0x00FFFFFF /*白色*/);//恢复鼠标光标为正常模式EndWaitCursor();m_nFirstRun = 0;}CDialog::OnPaint();}}剩下的工作就是根据背景位图的大小来设置对话框窗口的大小和位置,这可以在OnInitDialog()中通过调用MoveWindow()来实现。再添加一些变量的声名和初始化,即可编译运行。图2为运行结果示例:图24.进一步的讨论前面实现了单一模式的异形对话框,但有些情况下又需要不同的样式,如有标题栏、边框等,或者只作局部的处理,这就是前面两个成员变量m_FrameWidth和m_CaptionHeight作用,通过在OnInitDialog()判断窗口样式,使m_FrameWidth和m_CaptionHeight取不同的值。这部分的代码为:BOOL CTransBmpDlg::OnInitDialog(){……// TODO: Add extra initialization herem_nFirstRun = 1;//数据设置,窗口左上角坐标:m_Left=0,m_Top=0 //背景位图宽高:m_Width=535,m_Height=105SetSize(0, 0, 535, 105);//蒙板处理区域与窗口边框的距离m_MaskLeftOff=m_MaskTopOff=m_MaskRightOff=m_MaskBottomOff=0;//窗口边框与标题栏象素值m_FrameWidth = m_CaptionHeight = 0;//取得窗口样式LONG style = ::GetWindowLong(this->m_hWnd, GWL_STYLE);//如保留窗口风格样式,则根据不同的窗口边框类型    //选取不同的m_FrameWidth和m_CaptionHeight值, //也可以根据处理位置的需要进行付值if((style & WS_BORDER) == WS_BORDER)m_FrameWidth = ::GetSystemMetrics(SM_CXBORDER);if((style & WS_THICKFRAME) == WS_THICKFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & DS_MODALFRAME) == DS_MODALFRAME)m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);if((style & WS_CAPTION) == WS_CAPTION){m_FrameWidth = ::GetSystemMetrics(SM_CXFIXEDFRAME);m_CaptionHeight = ::GetSystemMetrics(SM_CYSMCAPTION);}m_CaptionHeight += m_FrameWidth * 2;//重置窗口的位置和大小MoveWindow(m_Left, m_Top, m_Width + m_FrameWidth * 2, m_Height + m_CaptionHeight, TRUE);……return TRUE; // return TRUE unless you set the focus to a control}另外,为进一步增加灵活性,使窗口样式不仅仅受背景位图颜色的控制。通过指定SetupRegion()的MaskBitmapID 为一个我们称之为“蒙板”的双色位图(多色彩也可以,但一般没有必要),即可实现需要的操作。图4为在同一背景位图上,通过图3的蒙板位图实现的效果,并且增加了对话框窗体的边框和标题栏属性。图3图4利用这种蒙板技术,可以创建出任意形状的窗口,而与背景位图无关。需要注意的是,对于对话框中的控件如按钮等,如处在或部分处在通明区域中,则通明区域中部分一并被剪裁掉,是否剪裁和剪裁位置与大小,利用蒙板可以很方便地进行控制。需要特别指出的是,SetWindowRgn()所指定的区域是针对整个窗口的,而Bitblt()/ StretchBlt()的输出区域是针对于客户区,两者在定位上是不同的,编程中应加以注意并灵活应用,这也是前面之所以设置边框大小等变量的原因。5.结束语这种异形窗口的创建不仅适应于对话框,而且适应于所有的基于CWnd类的派生窗口。采用这一方法,你可以创建出任何只要你能够画出的窗体,实现只要可以画出,就可以做出的目标。本文代码在Visual C++ 5.0、6.0下调试通过,运行正常,操作系统为Windows98SE。

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧