Myp3uK 8 Опубликовано 18 февраля, 2017 (изменено) В общем скачал данное дополнение 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); } } Изменено 18 февраля, 2017 пользователем Myp3uK Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты