// SplashScreenEx.cpp : implementation file
// by John O'Byrne 01/10/2002
#include "stdafx.h"
#include "SplashScreenEx.h"
#ifndef AW_HIDE
#define AW_HIDE 0x00010000
#define AW_BLEND 0x00080000
#endif
#ifndef CS_DROPSHADOW
#define CS_DROPSHADOW 0x00020000
#endif
// CSplashScreenEx
IMPLEMENT_DYNAMIC(CSplashScreenEx, CWnd)
CSplashScreenEx::CSplashScreenEx()
{
m_pWndParent=NULL;
m_strText="";
m_hRegion=0;
m_nBitmapWidth=0;
m_nBitmapHeight=0;
m_nxPos=0;
m_nyPos=0;
m_dwTimeout=2000;
m_dwStyle=0;
m_rcText.SetRect(0,0,0,0);
m_crTextColor=RGB(0,0,0);
m_uTextFormat=DT_CENTER | DT_VCENTER | DT_WORDBREAK;
HMODULE hUser32 = GetModuleHandle(_T("USER32.DLL"));
if (hUser32!=NULL)
m_fnAnimateWindow = (FN_ANIMATE_WINDOW)GetProcAddress(hUser32, _T("AnimateWindow"));
else
m_fnAnimateWindow = NULL;
SetTextDefaultFont();
}
CSplashScreenEx::~CSplashScreenEx()
{
}
BOOL CSplashScreenEx::Create(CWnd *pWndParent,LPCTSTR szText,DWORD dwTimeout,DWORD dwStyle)
{
ASSERT(pWndParent!=NULL);
m_pWndParent = pWndParent;
if (szText!=NULL)
m_strText = szText;
else
m_strText="";
m_dwTimeout = dwTimeout;
m_dwStyle = dwStyle;
WNDCLASSEX wcx;
wcx.cbSize = sizeof(wcx);
wcx.lpfnWndProc = AfxWndProc;
wcx.style = CS_DBLCLKS|CS_SAVEBITS;
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.hInstance = AfxGetInstanceHandle();
wcx.hIcon = NULL;
wcx.hCursor = LoadCursor(NULL,IDC_ARROW);
wcx.hbrBackground=::GetSysColorBrush(COLOR_WINDOW);
wcx.lpszMenuName = NULL;
wcx.lpszClassName = "SplashScreenExClass";
wcx.hIconSm = NULL;
if (m_dwStyle & CSS_SHADOW)
wcx.style|=CS_DROPSHADOW;
ATOM classAtom = RegisterClassEx(&wcx);
// didn't work? try not using dropshadow (may not be supported)
if (classAtom==NULL)
{
if (m_dwStyle & CSS_SHADOW)
{
wcx.style &= ~CS_DROPSHADOW;
classAtom = RegisterClassEx(&wcx);
}
else
return FALSE;
}
if (!CreateEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST,"SplashScreenExClass",NULL,WS_POPUP,0,0,0,0,pWndParent->m_hWnd,NULL))
return FALSE;
return TRUE;
}
BOOL CSplashScreenEx::SetBitmap(UINT nBitmapID,short red,short green,short blue)
{
BITMAP bm;
m_bitmap.DeleteObject();
if (!m_bitmap.LoadBitmap(nBitmapID))
return FALSE;
GetObject(m_bitmap.GetSafeHandle(), sizeof(bm), &bm);
m_nBitmapWidth=bm.bmWidth;
m_nBitmapHeight=bm.bmHeight;
m_rcText.SetRect(0,0,bm.bmWidth,bm.bmHeight);
if (m_dwStyle & CSS_CENTERSCREEN)
{
m_nxPos=(GetSystemMetrics(SM_CXFULLSCREEN)-bm.bmWidth)/2;
m_nyPos=(GetSystemMetrics(SM_CYFULLSCREEN)-bm.bmHeight)/2;
}
else if (m_dwStyle & CSS_CENTERAPP)
{
CRect rcParentWindow;
ASSERT(m_pWndParent!=NULL);
m_pWndParent->GetWindowRect(&rcParentWindow);
m_nxPos=rcParentWindow.left+(rcParentWindow.right-rcParentWindow.left-bm.bmWidth)/2;
m_nyPos=rcParentWindow.top+(rcParentWindow.bottom-rcParentWindow.top-bm.bmHeight)/2;
}
if (red!=-1 && green!=-1 && blue!=-1)
{
m_hRegion=CreateRgnFromBitmap((HBITMAP)m_bitmap.GetSafeHandle(),RGB(red,green,blue));
SetWindowRgn(m_hRegion, TRUE);
}
return TRUE;
}
BOOL CSplashScreenEx::SetBitmap(LPCTSTR szFileName,short red,short green,short blue)
{
BITMAP bm;
HBITMAP hBmp;
hBmp=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),szFileName,IMAGE_BITMAP,0,0, LR_LOADFROMFILE);
if (!hBmp)
return FALSE;
m_bitmap.DeleteObject();
m_bitmap.Attach(hBmp);
GetObject(m_bitmap.GetSafeHandle(), sizeof(bm), &bm);
m_nBitmapWidth=bm.bmWidth;
m_nBitmapHeight=bm.bmHeight;
m_rcText.SetRect(0,0,bm.bmWidth,bm.bmHeight);
if (m_dwStyle & CSS_CENTERSCREEN)
{
m_nxPos=(GetSystemMetrics(SM_CXFULLSCREEN)-bm.bmWidth)/2;
m_nyPos=(GetSystemMetrics(SM_CYFULLSCREEN)-bm.bmHeight)/2;
}
else if (m_dwStyle & CSS_CENTERAPP)
{
CRect rcParentWindow;
ASSERT(m_pWndParent!=NULL);
m_pWndParent->GetWindowRect(&rcParentWindow);
m_nxPos=rcParentWindow.left+(rcParentWindow.right-rcParentWindow.left-bm.bmWidth)/2;
m_nyPos=rcParentWindow.top+(rcParentWindow.bottom-rcParentWindow.top-bm.bmHeight)/2;
}
if (red!=-1 && green!=-1 && blue!=-1)
{
m_hRegion=CreateRgnFromBitmap((HBITMAP)m_bitmap.GetSafeHandle(),RGB(red,green,blue));
SetWindowRgn(m_hRegion,TRUE);
}
return TRUE;
}
void CSplashScreenEx::SetTextFont(LPCTSTR szFont,int nSize,int nStyle)
{
LOGFONT lf;
m_myFont.DeleteObject();
m_myFont.CreatePointFont(nSize,szFont);
m_myFont.GetLogFont(&lf);
if (nStyle & CSS_TEXT_BOLD)
lf.lfWeight = FW_BOLD;
else
lf.lfWeight = FW_NORMAL;
if (nStyle & CSS_TEXT_ITALIC)
lf.lfItalic=TRUE;
else
lf.lfItalic=FALSE;
if (nStyle & CSS_TEXT_UNDERLINE)
lf.lfUnderline=TRUE;
else
lf.lfUnderline=FALSE;
m_myFont.DeleteObject();
m_myFont.CreateFontIndirect(&lf);
}
void CSplashScreenEx::SetTextDefaultFont()
{
LOGFONT lf;
CFont *myFont=CFont::FromHandle((HFONT)GetStockObject(DEFAULT_GUI_FONT));
myFont->GetLogFont(&lf);
m_myFont.DeleteObject();
m_myFont.CreateFontIndirect(&lf);
}
void CSplashScreenEx::SetText(LPCTSTR szText)
{
m_strText=szText;
RedrawWindow();
}
void CSplashScreenEx::SetTextColor(COLORREF crTextColor)
{
m_crTextColor=crTextColor;
RedrawWindow();
}
void CSplashScreenEx::SetTextRect(CRect& rcText)
{
m_rcText=rcText;
RedrawWindow();
}
void CSplashScreenEx::SetTextFormat(UINT uTextFormat)
{
m_uTextFormat=uTextFormat;
}
void CSplashScreenEx::Show()
{
SetWindowPos(NULL,m_nxPos,m_nyPos,m_nBitmapWidth,m_nBitmapHeight,SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE);
if ((m_dwStyle & CSS_FADEIN) && (m_fnAnimateWindow!=NULL))
{
m_fnAnimateWindow(m_hWnd,500,AW_BLEND);
}
else
ShowWindow(SW_SHOW);
if (m_dwTimeout!=0)
SetTimer(0,m_dwTimeout,NULL);
}
void CSplashScreenEx::Hide()
{
if ((m_dwStyle & CSS_FADEOUT) && (m_fnAnimateWindow!=NULL))
m_fnAnimateWindow(m_hWnd,200,AW_HIDE | AW_BLEND);
else
ShowWindow(SW_HIDE);
DestroyWindow();
}
HRGN CSplashScreenEx::CreateRgnFromBitmap(HBITMAP hBmp, COLORREF color)
{
// this code is written by Davide Pizzolato
if (!hBmp) return NULL;
BITMAP bm;
GetObject( hBmp, sizeof(BITMAP), &bm ); // get bitmap attributes
CDC dcBmp;
dcBmp.CreateCompatibleDC(GetDC()); //Creates a memory device context for the bitmap
dcBmp.SelectObject(hBmp); //selects the bitmap in the device context
const DWORD RDHDR = sizeof(RGNDATAHEADER);
const DWORD MAXBUF = 40; // size of one block in RECTs
// (i.e. MAXBUF*sizeof(RECT) in bytes)
LPRECT pRects;
DWORD cBlocks = 0; // number of allocated blocks
INT i, j; // current position in mask image
INT first = 0; // left position of current scan line
// where mask was found
bool wasfirst = false; // set when if mask was found in current scan line
bool ismask; // set when current color is mask color
// allocate memory for region data
RGNDATAHEADER* pRgnData = (RGNDATAHEADER*)new BYTE[ RDHDR + ++cBlocks * MAXBUF * sizeof(RECT) ];
memset( pRgnData, 0, RDHDR + cBlocks * MAXBUF * sizeof(RECT) );
// fill it by default
pRgnData->dwSize = RDHDR;
pRgnData->iType = RDH_RECTANGLES;
pRgnData->nCount = 0;
for ( i = 0; i < bm.bmHeight; i++ )
for ( j = 0; j < bm.bmWidth; j++ ){
// get color
ismask=(dcBmp.GetPixel(j,bm.bmHeight-i-1)!=color);
// place part of scan line as RECT region if transparent color found after mask color or
// mask color found at the end of mask image
if (wasfirst && ((ismask && (j==(bm.bmWidth-1)))||(ismask ^ (j<bm.bmWidth)))){
// get offset to RECT array if RGNDATA buffer
pRects = (LPRECT)((LPBYTE)pRgnData + RDHDR);
// save current RECT
pRects[ pRgnData->nCount++ ] = CRect( first, bm.bmHeight - i - 1, j+(j==(bm.bmWidth-1)), bm.bmHeight - i );
// if buffer full reallocate it
if ( pRgnData->nCount >= cBlocks * MAXBUF ){
LPBYTE pRgnDat
splashwnd
4星 · 超过85%的资源 需积分: 0 67 浏览量
更新于2008-05-25
收藏 8KB RAR 举报
在IT行业中,MFC(Microsoft Foundation Classes)是一个重要的C++库,由微软开发,用于简化Windows应用程序的开发。"SplashWnd"是MFC中的一个关键概念,它涉及到启动画面(Splash Screen)的实现。
启动画面通常是在应用程序启动时短暂显示的一个窗口,用来展示公司标志、产品信息或加载进度,为用户提供应用程序正在准备运行的视觉反馈。在MFC中,`CSplashWnd`类是用来创建和管理这种启动画面的。
`CSplashWnd`是MFC的一个派生窗口类,它扩展了基本的`CWnd`类,提供了构建和显示启动画面的功能。通过继承`CSplashWnd`,开发者可以自定义启动画面的样式、大小、持续时间和显示的内容。这个类包含了设置图像资源、动画效果以及决定何时关闭启动画面的方法。
创建一个`CSplashWnd`实例时,你需要提供一个位图资源ID,这通常是PNG或BMP格式的图像,用于显示在启动画面上。你可以通过`SetBitmap`函数来指定这个资源。此外,还可以设置启动画面的尺寸、位置和透明度,以适应不同的设计需求。
在描述中提到的"**splashwndsplashwnd**"可能是对`CSplashWnd`类或者与之相关的函数、变量名的重复,这可能意味着在代码中有一个自定义的`CSplashWnd`对象或者类,其名称包含了两次"splashwnd"。
在实际编程中,你可能会在应用程序初始化阶段创建`CSplashWnd`对象,然后使用`ShowWindow(SW_SHOW)`方法来显示启动画面。同时,为了控制启动画面的生命周期,可以设置一个定时器,当定时器超时时自动关闭启动画面,或者在主窗口加载完毕后关闭它。
在标签中提到的"MFC",即Microsoft Foundation Classes,是微软提供的C++类库,用于构建Windows应用程序。MFC封装了许多Windows API,使得开发者可以用面向对象的方式来处理Windows编程中的各种任务,如窗口管理、消息处理、数据库访问等。
至于"新建文件夹",这可能表示压缩包中包含了一个空的文件夹,可能用于存放与`CSplashWnd`相关的资源文件,如位图图片、配置文件等。在实际开发中,这些资源通常会被添加到项目中,并链接到`CSplashWnd`类,以便程序在运行时能正确找到并显示启动画面。
总结来说,"splashwnd"是关于MFC框架下使用`CSplashWnd`类创建启动画面的知识点,这涉及到了Windows应用程序的用户界面设计和资源管理。在开发过程中,需要理解如何配置和使用`CSplashWnd`,以实现符合设计要求的启动画面效果。
downloadsomething
- 粉丝: 0
- 资源: 3
最新资源
- 水果系统.rar
- 企业级新闻系统(SSH+MYSQL)130221.rar
- 图片浏览小程序(java+applet)130227.rar
- 通用的在线考试系统(jsp+struts+hibernate+oracle)130220.rar
- 微信文章爬虫项目全套技术资料100%好用.zip
- 单机无穷大系统发生各类(三相短路,单相接地,两相接地,两相相间短路)等短路故障,各类(单相断线,两相断线,三相断线)等断线故障,暂态稳定仿真分析
- 图书管理系统(struts+hibernate+spring).rar
- 图书管理系统(struts+hibernate+spring)130225.rar
- 图书管理系统(struts+hibernate+spring+ext).rar
- 网上订餐系统(struts+spring+hibernate).rar
- 网上订餐系统(struts+spring+hibernate)130221.rar
- 图书管理系统(struts+hibernate+spring+ext)130221.rar
- 网上商城系统(JSP+MYSQL)130220.rar
- 网上商城系统(JSP+MYSQL).rar
- 网上购物系统(JavaBean+Servlet+jsp)130223.rar
- 网上书城系统(Struts+Hibernate+Mysql)130222.rar