PDA

Показать полную графическую версию : WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке?


XCodeR
11-03-2007, 11:09
Собственно сабж.

Т.к. иногда во время загрузки программы происходит различная ресурсоемкая работа с БД или с другими ресурсами. Необходимо чтобы появился 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 для уничтожения окна.

Примерно так...

XCodeR
12-03-2007, 16:46
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


Возможны ошибки.

XCodeR
12-03-2007, 19:51
DillerInc
вот так уже лучше)
видны знакомые буковки)

еще раз спасибо.




© OSzone.net 2001-2012