[急切求助]SkinPlusPlus皮肤控件和加载BMP背景图片的代码出现冲突。。。

qqq_008 2010-12-24 06:57:49
之前使用SkinPlusPlus皮肤控件美化对话框程序界面,
但是自己写了段代码来加载背景图片(BMP资源文件),
鼠标放在最大化和关闭按纽之间时,
窗体上的Edit等控件有一部分看不到,让加载的背景图片给档住了,
请大家帮忙提下建议。。。

关键代码如下:
// skinTest.h : main header file for the SKINTEST application
#include "skin/SkinPlusPlus.h" //皮肤库头文件

// skinTest.cpp : Defines the class behaviors for the application.
BOOL CSkinTestApp::InitInstance()
{
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
//初始化换皮肤的相关控件
//InitializeSkin(_T("skin/XPCorona.ssk"));
InitializeSkin(_T("skin/Minimized.ssk")); //皮肤库文件
}

BOOL CSkinTestApp::ExitInstance()
{
ExitSkin(); //释放换皮肤控件占用的资源
return CWinApp::ExitInstance();
}

// skinTestDlg.cpp : implementation file
void CSkinTestDlg::OnPaint()
{
if (IsIconic())
{。。。。。 }
else
{
CDialog::OnPaint();
}
loadBmpFile(); //加载BMP文件,加载背景图片
}

//加载背景图片
void CSkinTestDlg::loadBmpFile()
{
//加载背景图片 Begin
CDC *pDC = GetDC();
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);//将位图装入内存

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);//创建内存设备环境
CBitmap *OldBitmap=MemDC.SelectObject(&Bitmap);

BITMAP bm; //创建BITMAP 结构变量
Bitmap.GetBitmap(&bm); //获取位图信息

//pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
pDC->StretchBlt(0,0,bm.bmWidth-5,bm.bmHeight+2,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

//OldBitmap->DeleteObject(); //恢复设备环境
MemDC.SelectObject(OldBitmap); //恢复mem
Bitmap.DeleteObject();
ReleaseDC(pDC);
//加载背景图片 END
}


测试用的源代码放到了CSDN下载区别,链接如下:
SkinPlus皮肤控件测试VC代码
http://download.csdn.net/source/2933844
...全文
204 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqq_008 2010-12-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 songly1 的回复:]
代码修改:
1. 将loadBmpFile定义为loadBmpFile(CDC *pDC)
2. 在onPaint中调用改为
if (IsIconic())
{。。。。。 }
else
{
CPaintDC dc(this);
loadBmpFile(&dc); CDialog::OnPaint();
}
3. loadBmpFile函数中注释掉 C……
[/Quote]

---------------------
谢谢提醒,现在问题解决了。。。

// skinTest.h 

#include "skin/SkinPlusPlus.h" //皮肤库头文件

class CSkinTestApp : public CWinApp
{
public:
virtual BOOL InitInstance();
virtual int ExitInstance(); //退出应用程序
};

// skinTest.cpp

BOOL CSkinTestApp::InitInstance()
{
//初始化换皮肤的相关控件
InitializeSkin(_T("skin/Minimized.ssk"));
return FALSE;
}

BOOL CSkinTestApp::ExitInstance()
{
ExitSkin(); //释放换皮肤控件占用的资源
return CWinApp::ExitInstance();
}

// skinTestDlg.h
class CSkinTestDlg : public CDialog
{
public:
//加载背景图片
void loadBmpFile(CDC *pDC);
};

// skinTestDlg.cpp

void CSkinTestDlg::OnPaint()
{
if (IsIconic())
{
...
}
else
{
CPaintDC dc(this);
loadBmpFile(&dc); //加载背景图片
CDialog::OnPaint();
}
}

//加载背景图片
void CSkinTestDlg::loadBmpFile(CDC *pDC)
{
//加载背景图片 Begin
//CDC *pDC = GetDC();
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);//将位图装入内存

CDC MemDC;
MemDC.CreateCompatibleDC(pDC);//创建内存设备环境
CBitmap *OldBitmap=MemDC.SelectObject(&Bitmap);

BITMAP bm; //创建BITMAP 结构变量
Bitmap.GetBitmap(&bm); //获取位图信息

//pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY); //显示位图
pDC->StretchBlt(0,0,bm.bmWidth-5,bm.bmHeight+2,&MemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);

//OldBitmap->DeleteObject(); //恢复设备环境
MemDC.SelectObject(OldBitmap); //恢复mem
Bitmap.DeleteObject();
ReleaseDC(pDC);
//加载背景图片 END
}
qqq_008 2010-12-25
  • 打赏
  • 举报
回复
谢谢楼上各位朋友的回复,我再试下看看。。。
无边1 2010-12-24
  • 打赏
  • 举报
回复
代码修改:
1. 将loadBmpFile定义为loadBmpFile(CDC *pDC)
2. 在onPaint中调用改为
if (IsIconic())
{。。。。。 }
else
{
CPaintDC dc(this);
loadBmpFile(&dc);
CDialog::OnPaint();
}
3. loadBmpFile函数中注释掉 CDC *pDC = GetDC();
路人乙2019 2010-12-24
  • 打赏
  • 举报
回复
既然用了皮肤库,就最好不要自已再去贴背景图,你的处理函数可能跟库的处理函数有冲突。可以在WM_PAINT的处理代码之前贴图试试。
皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程 皮肤控件 skin++ skincrafter SkinFeature IrisSkin 我共享的都是本人实际验证过的精品,有文档,破解后的库文件,皮肤设计工具使用教程, 1 软件界面 每个软件都要有自己的软件界面,对于软件开发来说,软件界面不一定是最重要的,但是也是相当重要的。一款软件要是可 以在界面上做好,吸引了客户的眼球,那这款软件也就相对成功了一半。 现在各行各业的软件都添加了自己的皮肤色彩,显示出了不同的特点。例如QQ,MSN,Foxmail等等,这些软件都修改 了自己软件的界面,将自己的界面化做的很完善,很漂亮。使用起来感觉很舒服。 2 软件界面的解决方案之一:使用皮肤组件 皮肤组件能完全自动的为您的应用程序添加支持换肤功能,甚至不需要更改您的设计好的Form以及添加一行代码!您 也不再需要花费很多时间来使得自己的应用程序更漂亮。 3 选择皮肤组件产品时需要考虑的几个因素: 3.1 产品易用性 软件控件的API及使用 是否简单易用是我们需要考虑的一个重要关键。这个问题涉及到两个方面:  是否容易整合到现有应用程序中?  是否容易在新的应用程序项目中应用? 易用性: 界面控件类产品对应用程序的影响应该越小越好,要易于在现有应用程序中整合。这要求API简洁,同时也要求界面库易扩 展,兼容性强。 开发人员能否及时掌握并使用。 3.2 产品稳定性 界面库产品当前的稳定性当然是首要考虑的问题,目前可以从以下几个方面来鉴别产品的稳定性:  是否有足够多的示例Demos来演示控件库产品的各个方面的功能特性  是否已经有众多的成功案例  发布多长时间,同时是否一直有持续更新。 3.3 界面配置灵活性 界面开发一个很重要的问题是界面的样式是非常灵活的。比如一个button上面可能有一个图标,但有时也有可能需 要两个图标;有时有一行文字,但有时也可能有两行不同颜色的文字。界面库产品都需要考虑这些因素。以下是我们在开发 中经常遇到的问题:  控件界面的多样性。 如上面提到的不同位置多个图标,多行文字等。如果一个控件库的button只支持设置一个图标,这显然是不够灵活的,不实 用的。有人可能会说“把几张图片,切图时做到一起不就可以了么,反正一个控件也可以理解只有一个背景。” 如果涉及 到色调调整,这种做法会遇到麻烦,比如如下界面: 其中间图标在色调调整时,其色调不变的。如果图标和背景做到一起,则不能做到此效果。  控件界面元素的动态变化。 控件的界面表现不是静态的,很多情况我们需要能根据程序逻辑动态调整界面表现。 比如: 这种情况在界面设计与开发中是非常常见的,界面库产品需要非常容易的支持此特性。  需要根据程序逻辑自绘界面。 界面库不是万能的,界面库的设计者需要考虑尽可能的避免让客户去绘制界面,但却无法做到100%避免,由于程序逻辑的需 要,客户有时候需要自己绘制控件的某一部分。因此一个完整的界面库系统需要有自绘的支持,即在界面库绘制之后,让客 户有绘制的机会。同时也需要有一套机制来管理自绘部分的图片,颜色等资源,不然无法保证界面色调的一致性。 3.4 界面库高效性 界面库的效率是一个核心问题。糟糕的界面库效率会带来极坏的用户体验,这也应是公司在考虑一个界面控件类产 品时首要考虑的问题。可以通过以下几种方式来判断界面库类产品的效率:  拖拽窗口,观察是否有明显的停顿感。 可在一个系统下,找一些知名软件比较,如QQ/MSN等。如果有明显差异,则说明界面库在界面的绘制等方面存在欠缺。  拖拽窗口,观察界面控件是否有明显闪烁 如发生界面闪烁,则说明界面绘制的处理有些问题。  软件启动速度 界面库产品应该对图片等资源加载做优化,以尽可能的减少界面库加载等带来的时间开销。也可以通过比较软件启动速度来 比较界面库的效率。  软件色调调整时的效率 色调调整等操作一般会涉及到整体界面库的运算与操作,这种情况下也可以显示出不同界面库产品之间的效率差异。如果色 调调整明显带来停顿感,则说明界面库某些方面的效率偏低;一般来说DirectUI类型的库这方面效率会稍微高些。 3.5 周边产品完整性 软件界面开发会涉及到很多部分,通用的界面库产品只是其中的一个需求。界面开发中还会涉及到其他行业相关 的特殊控件、组件需求,如果控件提供商能一站式的解决这些问题,提供完整的界面解决方案,那将极大的减少界面方面的 研发投入。 IM即时聊天客户端产品,除了通用界面库的需求外,可能还需要制作聊天窗口的RichEdit扩展控件,配置面板,系统消息组 件,这些都是一个IM客户端必须的。 3.6 产品升级及售后服务  产品是否有持续的更新和升级 所选择的产品是否有持续的、及时的升级及更新,是否有可靠的售后服务也是需要考虑的重点。 如果控件提供商不能对产品持续投入,则产品不能保持技术竞争力,也不能给客户以信心。一个优秀的产品成长 的过程应该是根据客户的需求及行业的发展来不断升级和完善的过程。  售后服务是否有保障 有保障的售后服务是选择软件产品的基本条件。 一般来说以公司方式运营的产品在售后服务方面更有保障,双方可以以合同或协议的方式来保证产品的售后服务质量及 持续性。 4 市面上有几款比较好的皮肤组件 4.1 Skin++(属于第二代的外挂式的界面库) 网站链接:http://www.uipower.com/index.html 4.1.1 简介:  产品易用性 界面与业务逻辑彻底分离; 支持流行的Windows操作系统; 支持所有Win32/Win64平台,包括.Net应用程序;   Skin++ 支持的开发工具: 支持VC++各种版本:VC6,VC2003,VC2005,VC2008; 支持VisualStudio. Net各种版本:VisualStudio. Net 2003, 2005, 2008;    支持 PowerBuilder 各种版本:PowerBuilder 6.0,7.0,8.0,9.0,10.0,10.5,11.0;    支持 Delphi各种版本:Delphi 4,5,6,7,8,2005,2006;    支持C++ Builder 各种版本:C++ Builder 4,5,6,2006;  产品稳定性 成功案例: Skype 华为eSpace 阿里旺旺 淘宝助理 江民杀毒软件 浩方对战平台 360安全卫士(使用DirectUI, DirectUI为上海勇进软件skn++有限公司旗下产品) 等等  界面配置灵活性 可视设计,正式版提供皮肤设计工具SkinBuilder,SkinBuilder是所见即所得的设计开发环境,可以设计用户自己风格的界 面皮肤,并实现动态换肤功能。 没有下载到试验版的SkinBuilder,我联系的skn++的客服人员,只提供了一个视频教程和一个文档Skin++BuilderHelp.chm 视频教程链接地址:http://www.uipower.com/bbs/forum-56-1.html 皮肤设计工具(SkinBuilder)使用演示: http://www.uipower.com/DirectUIBuilder/DirectUIBuilder.html 其它信息:http://www.uipower.com/bbs/index.htm  界面库高效性 下载试用skn++网站上的Skin++ 演示系统 SkinPlusPlus.VS.Net.EvalEdition.3.1.1.exe 窗口数量小于10个时,颜色改变时间延迟不明显,窗口推动不会闪烁。 窗口数量大于30时: 我测试时在MDI应用程序中的主框架下新建100个子窗口,改变一下界面主题颜色,从第一个子窗口改变颜色到整个界面改变 颜色,用了1分27秒。平均一秒一个窗口,内存使用28.4M左右,改变颜色过程中CPU占用99%。颜色改变时间延迟明显,窗口 推动不会闪烁,但是响应速度很慢。  周边产品完整性 可视设计,提供皮肤设计工具,所见即所得的设计开发环境;    色调变换,支持皮肤色调变换,每一套皮肤都拥有N种色调风格;    皮肤资源海量,提供方便的皮肤转换工具,可以将目前主流的皮肤主题转换成Skin++格式;    支持Unicode,提供多种编码格式;    支持静态库链接,与客户程序可以进行无缝整合;    支持第三方控件;     产品升级及售后服务 产品分为:标准版,专业版,企业版,高级版,企业源码版 根据购买的版本的不同服务的项目和时间各异: 提供4到32小时的面对面开发培训 提供1到12个月的免费售后技术服务期 同步升级1个月到12个月  价格:(skin++客服人员提供的价格) skin++ directUI 标准版 价格 5800- 专业版 价格 17800 企业版 价格 38800 58800 高级企业版 价格 58800 88800 企业源码版 价格 98800 控件源码版 价格 158800 平台源码版 价格 218800 4.1.2 详细信息: 链接到<< 皮肤控件:Skin++产品详细信息>> 4.2 DSkinLite 网站链接:http://www.uieasy.cn/ 4.2.1 简介:  产品易用性 DSkinLite界面库API及XML配置语法简单,开发人员一般可以在2-3天内熟悉使用方法。DSkinLite界面库API共20个左右,常 用API函数应该在5左右。同时DSkinLite采用C++编写,专为Visual Studio开发者设计,开发者可以很容易的将DSkinLite整 合到已有软件工程中或者迅速开发新的软件。 DSkinLite使用XML配置界面样式,定义界面资源(字体,颜色,图片)等。借助于XML的灵活的语法,可以描述多 种多样的控件界面风格。因此不管您是否有意选择DSkinLite界面产品,您都可以下载我们的使用试用版,了解DSkinLite界 面库的设计风格,相信会让您了解一种全新的界面产品设计理念,给您的界面开发带来启发。  产品稳定性 近期的客户:长江证券 广州因豪集团 易酷创新 IM即时聊天类的客户比较多  界面配置灵活性 需要熟悉xml语法。 界面配置灵活。DSkinLite界面库采用XML管理GDI元素,并独创了将界面元素抽象为图片,矩形,线条,文字等元素。任何 一个控件界面均可以由这些元素来组合,使用DSkinLite可以轻松配置各种界面效果。如下图所示: 由此在一个控件界面中,可以灵活的配置界面元素,可以满足绝大多数界面设计需要. 动态的控制界面元素。同时DSkinLite提供相应的API可以控制这些元素(image,text,rect)的显示/隐藏,同时修正某些 属性,如image的picfile属性即更换图片,text的content属性即文本内容。这种界面需求在界面开发中十分常见。  界面库高效性 DSkinLite与其他界面库相比有以下特点: 没有采用Hook所有进程消息的方式,因此没有替换系统相关对话框。DSkinLite 只是采用MFC,ATL等framework类似的方式,简单替换窗口过程,截取界面绘制等消息,对应用程序来说基本上是透明的。 从这个方面讲,DSkinLite是一款轻量级的界面库,界面效率较高。 DSkinLite内部实现跟MFC类似,就是使用SetWindowLong替换窗口过程,然后截获绘制相关消息绘制界面.  周边产品完整性 没有可视化皮肤编辑工具 控件的样式定义于XML中,你可以在xml中定义一张图片,并设置其在窗口的任何位置,包括标题栏区域,  产品升级及售后服务 DSkinLite界面库产品及服务: DSkinLite产品使用授权 软件界面开发服务 控件定制服务 ekRichEdit 控件: ekRichEdit源码版使用授权 RichEdit控件定制服务 DirectUI界面库: DirectU产品源码使用授权 控件定制服务 这个公司的UI设计也是外包的, 有专门针对IM即时聊天的扩展控件 ekRichEdit;  价格 http://www.uieasy.cn/dskinlite/purchase.html DSkinLite界面库企业版(¥12000) 企业版售后服务如下: 12个月免费Email技术支持 12个月免费版本升级 8小时免费技术培训 两个工作日技术支持响应 软件界面开发服务(¥5000起) 软件界面框架开发服务,根据客户需求及提供的UI设计图片,完成软件界面框架开发。此服务费用为5000元起,具体费用需 要根据用户的需求评估具体工作量来定。 控件定制服务(¥2000起) 如您需要一些特殊的控件,我们可以根据您的需求定制控件。此服务费用为2000元起,具体需要根据控件需求及具体工作量 来定。 4.3 其他产品及信息: 4.3.1 东日IrisSkin 支持Delphi 5/6/7/2005,C++Builder 5/6,BDS 2006,RAD Studio 2007/2009/2010/XE; Microsoft VisualStudio.NET 2002/2003/2005/2008/2010; 含有免费的SkinBuilder工具 IrisSkin 共有两个版本,一个是IrisSkin.dll 用于.Net Framework1.0/1.1 和IrisSkin2.dll 用于.Net Framework2.0版 本。详细内容见安装文件的help文档。 除此之外,东日还有两个很cool的Menu: MatrixMenu和WheelMenu。 (详细内容请参见http://www.sunisoft.cn/irisskin)。 《皮肤控件:东日 Skin详细信息.doc》 4.3.2 Appface Appface支持的语言与开发环境是我见到的最多的,在。net上面使用起来相对前面4中都相对复杂一点, 不过看看那个 Demo也差不多会了,还是几个函数的使用。 (详细内容请参见http://www.appface.net)。 4.3.3 SkinSE 网站链接:http://www.skinse.com/ 是一款真正意义上适合软件界面开发的C++皮肤库。通过使用XML文件来配置GDI资源(如:图片、字体、颜色等),最大程度将 界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SkinSE没有采用传统的HOOK修改窗口过程函数的方式 ,而是只是针对具体窗口进行界面处理。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL等第三方库),采用 纯API编写,采用C语言导出方式,增强可移植性。 4.3.4 DotNetSkin DotNetSkin的用法和IrisSkin差不多。此外,网站提供了几个免费的很cool的控件, Button,RadioButton, CheckBox, 那个button和codeproject的XPButton有的一拼了。 (详细内容请参见http://www.dotnetskin.net)。 4.3.5 SkinCrafter SkinCrafter地用法和Skin++有点类似,都是添加一个Com引用,然后加上几句语句用来Load皮肤,和Apply皮肤。另外, SkinCrafter还另外提供了为Windows Installer换肤的软件。 (详细内容请参见http://www.skincrafter.com)。 4.3.6 SkinEngine Alcyonesoft推出了SkinEngine,支持的语言数目与Appface不相上下,用法和Skin++, SkinCrafter类似。(详细内容参 见http://www.ksdev.com) 6、 DotNetMagic提供了许多漂亮的控件(http://www.dotnetmagic.com), 7、DotNetBar许多很有创意,很炫的控件(http://www.devcomponents.com) 8、Divelements 的许多漂亮的控件(http://www.divelements.co.uk) VclSkin DevExpress系列 XPMenu、 SuiPack、 rainxp、 Flatstyle、 skinengine..... 4.3.7 其他公司的界面库: 金山 自己的界面库; 瑞星 自己的界面库; 腾讯 自己的界面库,皮肤设计工具做的最精细; 迅雷7 自己的皮肤库,采用lua+xml架构,扩展性强,效率高,“万能皮肤库”。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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