Перейти к содержанию
Авторизация  
Myp3uK

Кастомное сплеш с помощью дллки

Рекомендуемые сообщения

В общем скачал данное дополнение http://forummaxi.ru/topic/65422-png-splashscreen/
Сделать окно анимированным я смог (AnimateWindow), но при появлении окна, оно просто светло серого цвета без картинки.

 

#pragma once

#include <windows.h>
#include <gdiplus.h>
#include <shlwapi.h>
#include "Splicing.h"
#include <time.h>
#include <iostream>


#pragma comment(lib, "gdiplus.lib")
#pragma comment(lib, "shlwapi.lib")

using namespace Gdiplus;

typedef HANDLE (__stdcall *_CreateFile) (LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
_CreateFile true_CreateFile;

ULONG_PTR gdipToken;
GdiplusStartupInput gdipStartupInput;
Image *pPNGMask = NULL;
Graphics *pGraphics = NULL;
POINT ptDst;
bool ShowSplash = true;

wchar_t PNGLogo[] = L"logo.png";	//Файл logo.png положите в папку system клиента
int SplashTime = 7000;				//Сколько секунд отображать лого

//Чтобы сплешка гасла не по таймеру а при выполнении определенного кода в клиенте, вставьте в нужное место строку ShowSplash = false;
//И раскоментите строку в CloseSplashScreen 

HANDLE __stdcall new_CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
{
	HANDLE fileHandle = 0;
	wchar_t * pos = wcsstr((wchar_t *)lpFileName, L".bmp");
    if(pos != NULL && ShowSplash)
		fileHandle = true_CreateFile(L"null\\null", dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
	else
		fileHandle = true_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
	return fileHandle;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message)
	{
		case WM_CREATE:
		{
			BITMAPINFO BMI = {};
			BLENDFUNCTION BF = {};
			POINT ptSrc = { 0, 0 };
			SIZE szDst = { pPNGMask->GetWidth(), pPNGMask->GetHeight() };
			auto hDC = GetDC(hWnd);
			auto hCDC = CreateCompatibleDC(hDC);
			BMI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
			BMI.bmiHeader.biBitCount = 32;
			BMI.bmiHeader.biCompression = BI_RGB;
			BMI.bmiHeader.biWidth = pPNGMask->GetWidth();
			BMI.bmiHeader.biHeight = pPNGMask->GetHeight();
			BMI.bmiHeader.biPlanes = 1;
			auto h32bppBitmap = CreateDIBSection(hDC, &BMI, DIB_RGB_COLORS, NULL, NULL, 0);
			SelectObject(hCDC, h32bppBitmap);
			pGraphics = new Graphics(hCDC);
			pGraphics->DrawImage(pPNGMask, 0, 0, pPNGMask->GetWidth(), pPNGMask->GetHeight());
			BF.AlphaFormat = AC_SRC_ALPHA;
			BF.BlendOp = AC_SRC_OVER;
			BF.SourceConstantAlpha = 255;
			UpdateLayeredWindow(hWnd, hDC, &ptDst, &szDst, hCDC, &ptSrc, 0, &BF, ULW_ALPHA);
			AnimateWindow(hWnd, 1000, AW_ACTIVATE | AW_BLEND);
			//ShowWindow(hWnd, SW_SHOW);
			UpdateWindow(hWnd);
			DeleteObject(h32bppBitmap);
			DeleteDC(hCDC);
			ReleaseDC(hWnd, hDC);
			break;
		}
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}

HINSTANCE hinst;
HWND hWnd;

DWORD WINAPI ShowSplashScreen(LPVOID)
{
	MSG msg;
	WNDCLASSEX wcex = {};

	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_BYTEALIGNCLIENT | CS_BYTEALIGNWINDOW;
	wcex.cbClsExtra	 = 0;
	wcex.cbWndExtra	 = DLGWINDOWEXTRA;
	wcex.lpfnWndProc = WndProc;
	wcex.hInstance = hinst;
	wcex.hIcon = LoadIcon(hinst, IDI_APPLICATION);
	wcex.hCursor = ::LoadCursor( NULL, IDC_ARROW );
	wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
	wcex.lpszMenuName   = NULL;
	wcex.lpszClassName = L"PNGFormWndClass";
	wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);
	if (!RegisterClassEx(&wcex)) return 0;
    GdiplusStartup(&gdipToken, &gdipStartupInput, NULL);
	//pPNGMask = new Image(PNGLogo);

	srand(time(NULL));
	int nomer = rand() % 3;
	wchar_t rndPNGLogo[128];
	swprintf(rndPNGLogo, 128, L"%ls%d.png", L"logo_", nomer);
	pPNGMask = new Image(rndPNGLogo);

	ptDst.x = (GetSystemMetrics(SM_CXFULLSCREEN) - pPNGMask->GetWidth()) / 2;
	ptDst.y = (GetSystemMetrics(SM_CYFULLSCREEN) - pPNGMask->GetHeight()) / 2;
	hWnd = CreateWindowEx(WS_EX_TOPMOST|WS_EX_TOOLWINDOW|WS_EX_LAYERED|WS_EX_TRANSPARENT, L"PNGFormWndClass", L"Lineage II", WS_POPUP, 0, 0, pPNGMask->GetWidth(),
	pPNGMask->GetHeight(), NULL, NULL, NULL, NULL);	
	if (hWnd)
	{
		AnimateWindow(hWnd, 1000, AW_ACTIVATE | AW_BLEND);
		//ShowWindow(hWnd, SW_SHOW);
		UpdateWindow(hWnd);
		while (GetMessage(&msg, NULL, 0, 0))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	if (pPNGMask) delete pPNGMask;
	if (pGraphics) delete pGraphics;

	return 0;
}

DWORD WINAPI CloseSplashScreen(LPVOID)
{	
	//while(ShowSplash) Sleep(10);
	Sleep(SplashTime); //Убрать если раскоментили предыдущую строку

	AnimateWindow(hWnd, 1000, AW_HIDE | AW_BLEND);
	//ShowWindow(hWnd, SW_HIDE);
	UpdateWindow(hWnd);
	if (pPNGMask) delete pPNGMask;
	if (pGraphics) delete pGraphics;
	DestroyWindow(hWnd);
	return 0;
}

void WINAPI SplashScreen(HINSTANCE hi)
{
	FARPROC addr;
	if ((addr = GetProcAddress(LoadLibraryA("kernel32.dll"), "CreateFileW")) == 0) ShowSplash = false;
	true_CreateFile = (_CreateFile) splice((unsigned char*) addr, new_CreateFile);
	hinst = hi;
	if(ShowSplash)
	{
		CreateThread (0, 0, ShowSplashScreen, 0, 0, 0);
		CreateThread (0, 0, CloseSplashScreen, 0, 0, 0);
	}
} 

 

 

Изменено пользователем Myp3uK

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...