CSplashScreenEx:带 Alpha 混合的非矩形启动屏幕类






4.90/5 (65投票s)
2002年10月1日
3分钟阅读

419460

12597
CSplashScreenEx 允许显示带有应用程序初始化信息的非矩形位图。
引言
不久前,我一直在寻找一个启动屏类,它允许我显示一个非矩形的位图,而不会遮挡背景。由于我没有找到符合我需求的类,所以我开发了我自己的启动屏类:CSplashScreenEx
。
兼容性
此类需要 MFC 以静态或动态链接到您的项目中;它是在 Visual Studio .NET 下编写、编译和测试的(但应该也能很好地与 VC6 配合使用)。
如何使用该类
该类使用起来非常简单:只需将 SplashScreenEx.h 和 SplashScreenEx.cpp 添加到您的项目中,然后包含 SplashScreenEx.h 到您的应用程序中。要显示启动屏,只需在您的 OnInitDialog()
函数中包含这些行:
CSplashScreenEx *pSplash=new CSplashScreenEx();
pSplash->Create(this,NULL,2000,CSS_FADE | CSS_CENTERSCREEN | CSS_SHADOW);
pSplash->SetBitmap(IDB_SPLASH,255,0,255);
pSplash->Show();
这样就完成了,启动屏会显示 2000 毫秒,然后消失并释放分配的内存。
重要提示:此类必须在堆上分配,因为它在消失时会自动销毁。
CSplashScreenEx *pSplash=new CSplashScreenEx()
启动屏还可以用于显示应用程序的加载进度,如示例 2 所示。
CSplashScreenEx *pSplash=new CSplashScreenEx();
pSplash->Create(this,"CSplashScreenEx dynamic text:",0,CSS_FADE |
CSS_CENTERSCREEN | CSS_SHADOW);
pSplash->SetBitmap(IDB_SPLASH,255,0,255);
pSplash->SetTextFont("Impact",100,CSS_TEXT_NORMAL);
pSplash->SetTextRect(CRect(125,60,291,104));
pSplash->SetTextColor(RGB(255,255,255));
pSplash->SetTextFormat(DT_SINGLELINE | DT_CENTER | DT_VCENTER);
pSplash->Show();
Sleep(1000);
pSplash->SetText("You can display infos");
Sleep(1000);
pSplash->SetText("While your app is loading");
Sleep(1000);
pSplash->SetText("Just call Hide() when loading");
Sleep(1000);
pSplash->SetText("is finished");
Sleep(1500);
pSplash->Hide();
类文档
CSplashScreenEx::Create
BOOL Create(CWnd *pWndParent,LPCTSTR szText=NULL,DWORD dwTimeout=2000,
DWORD dwStyle=CSS_FADE | CSS_CENTERSCREEN | CSS_SHADOW);
创建启动屏,它会保持隐藏,直到调用 Show()
。
参数
pWndParent
:父窗口(this
)szText
:在启动屏中显示的文本dwTimeout
:启动屏消失前的毫秒数。如果为 0,则启动屏永远显示 :)dwStyle
:可以是以下值的组合CSS_FADEIN
:出现时淡入动画CSS_FADEOUT
:消失时淡出动画CSS_FADE=CSS_FADEIN | CSS_FADEOUT
:淡入 + 淡出CSS_SHADOW
:在启动屏下方显示阴影CSS_CENTERSCREEN
:启动屏在屏幕上居中显示CSS_CENTERAPP
:启动屏在父窗口上居中显示CSS_HIDEONCLICK
:按下键盘或用鼠标单击启动屏时,启动屏会消失并销毁
CSplashScreenEx::SetBitmap
BOOL SetBitmap(UINT nBitmapID,short red=-1,short green=-1,short blue=-1);
BOOL SetBitmap(LPCTSTR szFileName,short red=-1,short green=-1,short blue=-1);
将位图与启动屏关联。
参数
nBitmapId
:位图的资源 IDszFileName
:硬盘上位图的路径red,green,blue
:位图的透明色(RGB 颜色)。将它们设置为-1
以禁用位图透明度
CSplashScreenEx::Show
void Show();
显示启动屏。
CSplashScreenEx::Hide
void Hide();
隐藏并销毁启动屏。
CSplashScreenEx::SetText
void SetText(LPCTSTR szText);
更改启动屏中显示的文本。
CSplashScreenEx::SetTextFont
void SetTextFont(LPCTSTR szFont,int nSize,int nStyle);
更改文本的字体。
参数
nStyle
可以是以下值之一或组合
CSS_TEXT_NORMAL
CSS_TEXT_BOLD
CSS_TEXT_ITALIC
CSS_TEXT_UNDERLINE
CSplashScreenEx::SetTextDefaultFont
void SetTextDefaultFont();
为启动屏中显示的文本设置系统默认字体。
CSplashScreenEx::SetTextColor
void SetTextColor(COLORREF crTextColor);
更改文本颜色。
CSplashScreenEx::SetTextRect
void SetTextRect(CRect& rcText);
更改文本矩形的边界。
CSplashScreenEx::SetTextFormat
void SetTextFormat(UINT uTextFormat);
更改文本格式;有关不同值,请参阅 MSDN 中的 DrawText
函数(默认值为 DT_CENTER | DT_VCENTER | DT_WORDBREAK
)。
技术问题
当调用 SetBitmap()
时,如果指定了透明色,则会生成一个 GDI 区域(感谢 Davide Pizzolato 的代码),并将该区域应用于启动屏窗口(SetWindowRgn
(...))。因此,窗口不再是矩形的。其余代码是基本部分,在 WM_PAINT
处理程序中,背景位图会绘制到窗口上。有关实现的更多详细信息,请参阅代码。
结论
我希望这个类对您有所帮助,如果您发现任何内存或 GDI 泄漏,或者您有改进此类别的建议,请发表评论。如果您在免费、共享软件或商业应用程序中使用此类别,请告诉我,我将很高兴 :)
许可证
本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。
作者可能使用的许可证列表可以在此处找到。