琪依坤 | 羽毛在飛

Good Luck To You!

Win32 Splasher

B站视频链接:https://www.bilibili.com/video/BV1a5411A7p3/

准备在B站上开视频,其中一个版本叫“程序人生”,就是将过去及将来自己制作的一些小程序、小工具共享出来。既然是和程序相关,那么这个视频的片头就不用视频编辑的方法来做,而是想到Splash。前些年,不论大小软件都有这么个Splash窗口,现今呢,只有一些大型软件,需要加载很多模块,才使用Splash了。

我这个Splasher是使用Win32 API开发的,使用的是多线程,在MFC、WTL等项目中,都可以使用。下面是个预览图。

接下来,讲解一下如何使用这个Splasher。

Splasher有两个文件组成,Splasher.h和Splasher.c,只要将这两个文件加入到工程中,然后视工程是否使用了预编译头文件做适当的调整就可以使用了。调整方法有两个:

  1. 针对Splasher.c不使用预编译头文件。到工程设置中,设定Splasher.c的Precompile为"Not using precompiled headers"

  2. 将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) 


更多精彩请关注公众号

更多精彩请关注公众号:

发表评论:

Powered By Z-BlogPHP 1.7.2

沪ICP备12032294号-1