B站视频链接:https://www.bilibili.com/video/BV1a5411A7p3/
准备在B站上开视频,其中一个版本叫“程序人生”,就是将过去及将来自己制作的一些小程序、小工具共享出来。既然是和程序相关,那么这个视频的片头就不用视频编辑的方法来做,而是想到Splash。前些年,不论大小软件都有这么个Splash窗口,现今呢,只有一些大型软件,需要加载很多模块,才使用Splash了。
我这个Splasher是使用Win32 API开发的,使用的是多线程,在MFC、WTL等项目中,都可以使用。下面是个预览图。
接下来,讲解一下如何使用这个Splasher。
Splasher有两个文件组成,Splasher.h和Splasher.c,只要将这两个文件加入到工程中,然后视工程是否使用了预编译头文件做适当的调整就可以使用了。调整方法有两个:
针对Splasher.c不使用预编译头文件。到工程设置中,设定Splasher.c的Precompile为"Not using precompiled headers"
将Splasher.h中的#include <Windows.h>和#include <tchar.h>替换为#include "stdafx.h"
Splasher有三个函数:
BOOL Splash_Create(...); //创建Splash线程和窗口 void Splash_ShowText(...); //在Splash窗口上显示文本信息 BOOL Splash_Close(...); //销毁Splash窗口、关闭Splash线程
BOOL Splash_Create( HINSTANCE hInstance, // 实例句柄 LPCTSTR lpszName, // Splash位图文件或位图资源 BOOL bRes, // FALSE,指定的是位图文件;TRUE,指定的是资源。如果是resource id,需要使用MAKEINTRESOURCE宏将id转换为字符串 DWORD dwFlag, // Splash窗口属性。 // FLAG_LWA_COLORKEY,窗口的指定颜色区域将会透明 // FLAG_LWA_ALPHA,窗口的透明度,0为全透明,255为不透明。 // FLAG_DROPSHADOW,窗口有阴影 // FLAG_DRAGGABLE,窗口可拖曳 DWORD dwARGB, // 若dwFlag指定了FLAG_LWA_COLORKEY和/或FLAG_LWA_ALPHA,需要使用ARGB宏来生成相应的key color和alpha透明度 LPCTSTR lpszSound, // 显示Splash时播放的声音文件或声音资源。声音是异步播放的,也就是如果Splash已经销毁了而声音还没播放完,声音会继续播放。 BOOL bResSound, // FALSE,指定的是声音文件;TRUE,指定的是资源。如果是resource id,需要使用MAKEINTRESOURCE宏将id转换为字符串 DWORD dwShowTime // Splash窗口保持时间。如果加载的资源很少,会很快加载完成,那么Splash窗口马上就销毁了,我们看到Splash一闪而过。 //设定保持时间,Splash会等到时间到了才销毁。如果加载资源时间大于保持时间,那么窗口会在资源加载完成后销毁。 //设定0,Splash窗口在资源加载完成后就销毁。 );
void Splash_ShowText( LPCTSTR lpszText, // 指定显示在Splash窗口上的文本信息 COLORREF clrTextColor // 显示在Splash窗口的文本信息的颜色 );
BOOL Splash_Close( HWND hWndActive // Splash销毁后,要设置到前台的窗口。NULL,为GetActiveWindow获得的窗口 );
具体使用如下:
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { HWND hWnd = NULL; int iWidth = 0; int iHeight = 0; MSG msg; WNDCLASS WndClass; Splash_Create(hInstance, _T("splash.bmp"), FALSE, FLAG_DROPSHADOW|FLAG_DRAGGABLE, 0, _T("splash.wav"),FALSE, 3000); Splash_ShowText(_T("Loading main image..."),RGB(255,0,0)); //加载资源 s_hBitmap = (HBITMAP)LoadImage(NULL, _T("programmer_life.bmp"), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_DEFAULTCOLOR|LR_LOADFROMFILE ); //加载资源失败 if( s_hBitmap == NULL ) { Splash_Close(NULL); //关闭Splash return 0; } Splash_ShowText(_T("Creating memory DC..."),RGB(255,0,255)); GetObject(s_hBitmap, sizeof(BITMAP), &s_bmpInfo); s_hDCMemory = CreateCompatibleDC(NULL); //创建DC失败 if( s_hDCMemory == NULL ) { FreeRes(); Splash_Close(NULL); //关闭Splash return 0; } SelectObject(s_hDCMemory,s_hBitmap); WndClass.style = 0; WndClass.lpfnWndProc = (WNDPROC)WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = NULL; WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);; WndClass.lpszMenuName = NULL; WndClass.lpszClassName = _T("SplashDemo"); if ( !RegisterClass(&WndClass) ) { FreeRes(); Splash_Close(NULL); return 0; } iWidth = GetSystemMetrics(SM_CXSCREEN); iHeight = GetSystemMetrics(SM_CYSCREEN); hWnd = CreateWindowEx(WS_EX_TOPMOST, _T("SplashDemo"), _T("SplashDemo Window"), WS_POPUP, 0, 0, iWidth, iHeight, NULL, NULL, hInstance, 0); //在主窗口显示之前,关闭Splash。 //也可在主窗口的WM_CREATE或WM_INITDIALOG消息里调用Splash_Close。 Splash_Close(NULL); if( !hWnd ) return 0; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } FreeRes(); return (int) msg.wParam; }
你可以免费自由的复制、修改、分发,只需保留相应的License notice即可。
SplashDemo(include source codes)
更多精彩请关注公众号
更多精彩请关注公众号: