Показать полную графическую версию : WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?
Собственно сабж.
Т.к. иногда во время загрузки программы происходит различная ресурсоемкая работа с БД или с другими ресурсами. Необходимо чтобы появился SplashScreen на нем игралась какая-нибудь анимация, а по завершению инициализации программы он закрылся.
DillerInc
12-03-2007, 11:19
XCodeR
Я бы сделал что-то наподобие следующего(извини,что код на асме,просто мне влом браться за дельфи :) ) :
MainProc proc
; /* Создаём событие, которое будет служить сигналом */
push offset szSplash
push FALSE ; Создаём событие как nonsignaled
push TRUE ; Создаём manual-reset событие
push NULL
call CreateEventA
mov hSplashEvent, eax
; /* Создаём поток */
push NULL
push NULL
push NULL
push offset ShowSplash ; адрес процедуры, где будет создаватся SplashScreen
push NULL
push NULL
call CreateThread
mov hSplashRoutineThread, eax
; /* Имитируем ресурсоёмкую работу */
push 10000
call Sleep
; /* Теперь меняем состояние события, сигнализируя о конце ресурсоёмкой работы */
push hSplashEvent
call SetEvent
; /* Закрываем описатель потока */
push hSplashRoutineThread
call CloseHandle
; /* Закрываем описатель события */
push hSplashEvent
call CloseHandle
ret
MainProc endp
ShowSplash proc
; /* Регистрируем класс создаваемого splash-окна */
...
; /* Создаём само окно */
...
; /* Ждём сигнала из основного потока */
push INFINITE
push hSplashEvent
call WaitForSingleObject
; /* Теперь, когда функция WaitForSingleObject возвратится, уничтожаем окно и снимаем регистрацию класса */
...
; /* Закрываем поток */
push NULL
call ExitThread
ShowSplash endp
При регистрации класса splash-окна необходимо указать отдельную оконную процедуру, которая должна обрабатывать сообщение WM_DESTROY для уничтожения окна.
Примерно так...
DillerInc
арр, не люблю я ассемблер.... ((
но будем разбираться - Спасибо...
DillerInc
12-03-2007, 18:47
арр, не люблю я ассемблер.... ((
... ;)
Лады,попробуем тогда так:
var
SplashWindowClass : TWndClass;
hSplashWnd, hSplashEvent, hSplashRoutineThread : HWND;
function SplashWindowProc(hWnd : HWND; uMsg : UINT; wParam : WPARAM;
lParam : LPARAM) : LRESULT; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
if uMsg = WM_DESTROY then
PostQuitMessage(0);
end; // SplashWindowProc
procedure MainProc;
hSplashEvent := CreateEvent(0, true, false, 'SplashEvent');
hSplashRoutineThread := CreateThread(0, 0, @ShowSplashWindow, 0, 0, 0);
Sleep(10000);
SetEvent(hSplashEvent);
CloseHandle(hSplashRoutineThread);
CloseHandle(hSplashEvent);
end; // MainProc
procedure ShowSplashWindow;
SplashWindowClass.style := CS_HREDRAW or CS_VREDRAW;
SplashWindowClass.lpfnWndProc := @SplashWindowProc;
SplashWindowClass.hInstance := Instance;
SplashWindowClass.hIcon := LoadIcon(0, IDI_APPLICATION);
SplashWindowClass.hCursor := LoadCursor(0, IDC_ARROW);
SplashWindowClass.hbrBackground := COLOR_BACKGROUND;
SplashWindowClass.lpszClassName := 'Splash';
RegisterClass(SplashWindowClass);
hSplashWnd := CreateWindow('Splash', 'SplashScreen',
WS_POPUP,
350, 300, 400, 250, 0, 0, Instance, NIL);
ShowWindow(hSplashWnd, SW_SHOW);
UpdateWindow(hSplashWnd);
WaitForSingleObject(hSplashEvent, INFINITE);
DestroyWindow(hSplashWnd);
UnregisterClass('Splash', Instance);
ExitThread(0);
end; // ShowSplashWindow
Возможны ошибки.
DillerInc
вот так уже лучше)
видны знакомые буковки)
еще раз спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC