123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 |
- #include "./uiUpdatingData.h"
- #include "./resource.h"
- #include <strsafe.h>
- #define TIMER_SHOWDIALOG_ID 1979
- #define TIMER_ANIMATION_ID 1978
- #define TIMER_ANIMATION_INTERVAL 500
- #define ANIMATION_CUBE_SIDE 16
- #define ANIMATION_CUBE_SPACING 4
- UpdatingDataUI::UpdatingDataUI(void)
- {
- hwnd = NULL;
- hThread = NULL;
- evntExit = NULL;
- evntStarted = NULL;
- text[0] = 0x0000;
- }
- UpdatingDataUI::~UpdatingDataUI(void)
- {
- Hide();
- }
- void UpdatingDataUI::Show(int delay,HWND ownerWnd)
- {
- wchar_t buffer[128] = {0};
- LoadStringW(hResource, IDS_UPDATINGDATA, buffer, 128);
- Show(delay, buffer, TRUE, ownerWnd);
- }
- void UpdatingDataUI::Show(int delay, const wchar_t* text, int animation, HWND ownerWnd)
- {
- this->delay = delay;
- this->ownerWnd = ownerWnd;
- StringCchCopyW(this->text, 128, text);
- this->animation = animation;
- animStep = 0;
-
- evntExit = CreateEvent(NULL, FALSE, FALSE, NULL);
- evntStarted = CreateEvent(NULL, FALSE, FALSE, NULL);
- DWORD id;
- hThread = CreateThread(NULL, 0, MessagePump, this, 0, &id);
- WaitForSingleObject(evntStarted, INFINITE);
- CloseHandle(evntStarted);
- evntStarted = NULL;
- }
- void UpdatingDataUI::Hide(void)
- {
- if (hwnd) PostMessage(hwnd, WM_CLOSE, 0, 0);
-
- if (evntExit)
- {
- WaitForSingleObject(evntExit, INFINITE);
- CloseHandle(evntExit);
- evntExit = NULL;
- }
- if (hThread)
- {
- CloseHandle(hThread);
- hThread = NULL;
- }
- }
- void UpdatingDataUI::OnInitDialog(HWND hwndDlg)
- {
- hwnd = hwndDlg;
- SetTimer(hwnd, TIMER_SHOWDIALOG_ID, delay, NULL);
- SetEvent(evntStarted);
- }
- void UpdatingDataUI::OnShowTimer(void)
- {
- KillTimer(hwnd, TIMER_SHOWDIALOG_ID);
- RECT rect;
- if (ownerWnd)
- {
- RECT ownerRect;
- GetWindowRect(hwnd, &rect);
- GetWindowRect(ownerWnd, &ownerRect);
- SetWindowPos(hwnd, HWND_TOPMOST, ownerRect.left + ((ownerRect.right - ownerRect.left) - (rect.right - rect.left))/2,
- ownerRect.top + ((ownerRect.bottom - ownerRect.top) - (rect.bottom - rect.top))/2,
- 0,0, SWP_NOSIZE);
- }
- SetDlgItemTextW(hwnd, IDC_LBL_TEXT, text);
- if (animation)
- {
- GetClientRect(hwnd, &rect);
- int width = (rect.right - rect.left);
- animStep = 0;
- SetRect(&animRect, 10, (rect.bottom - rect.top) - ANIMATION_CUBE_SIDE - 8, width - 8, (rect.bottom - rect.top) - 10);
- animMaxStep = ((animRect.right - animRect.left) + ANIMATION_CUBE_SPACING) / (ANIMATION_CUBE_SIDE + ANIMATION_CUBE_SPACING);
- SetTimer(hwnd, TIMER_ANIMATION_ID, TIMER_ANIMATION_INTERVAL, NULL);
- }
- else
- {
- SetRect(&animRect, 0, 0, 0, 0);
- animMaxStep = 0;
- }
- ShowWindow(hwnd, SW_SHOWNORMAL);
- UpdateWindow(hwnd);
- }
- void UpdatingDataUI::OnAnimationTimer(void)
- {
- animStep++;
- if (animStep == animMaxStep) animStep = 0;
- InvalidateRect(hwnd, &animRect, FALSE);
- }
- void UpdatingDataUI::OnDestroy(void)
- {
- hwnd = NULL;
- }
- void UpdatingDataUI::OnPaint(PAINTSTRUCT *ps)
- {
- if (RectVisible(ps->hdc, &animRect))
- {
- HBRUSH br = GetSysColorBrush(COLOR_3DFACE);
- HBRUSH sbr = CreateSolidBrush(RGB(254, 172, 1));
- HBRUSH oldBrush;
- HPEN oldPen, pen = CreatePen(PS_SOLID, 2, RGB(21, 72, 9));
- oldPen = (HPEN)SelectObject(ps->hdc, pen);
- oldBrush = (HBRUSH)SelectObject(ps->hdc, br);
- RECT cube = {animRect.left, animRect.top, animRect.left + ANIMATION_CUBE_SIDE, animRect.top + ANIMATION_CUBE_SIDE};
-
- for (int i = 0; i < animMaxStep; i++)
- {
- SelectObject(ps->hdc, (i == animStep) ? sbr : br);
- Rectangle(ps->hdc, cube.left, cube.top, cube.right, cube.bottom);
- cube.left = cube.right + ANIMATION_CUBE_SPACING;
- cube.right = cube.left + ANIMATION_CUBE_SIDE;
- }
- SelectObject(ps->hdc, oldPen);
- SelectObject(ps->hdc,oldBrush);
- // DeleteObject(br);
- DeleteObject(sbr);
- }
- }
- DWORD UpdatingDataUI::MessagePump(void *param)
- {
- UpdatingDataUI *object = (UpdatingDataUI*)param;
- LPCDLGTEMPLATE templ = NULL;
- HRSRC hres = FindResourceExW(hResource, MAKEINTRESOURCEW(5), MAKEINTRESOURCEW(IDD_DLG_UPDATING), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
- if (hres) templ = (LPCDLGTEMPLATE)LoadResource(hResource, hres);
- HWND dlgWnd = CreateDialogIndirectParamW(dllInstance, templ, NULL, (DLGPROC)WndProc, (LPARAM)object);
- if (!dlgWnd) return 1;
-
- MSG msg;
- BOOL ret;
- while( 0 != (ret = GetMessageW(&msg, dlgWnd, 0, 0)))
- {
- if (ret == -1) break;
- if (IsDialogMessage(dlgWnd, &msg)) continue;
- TranslateMessage(&msg);
- DispatchMessageW(&msg);
- }
- SetEvent(object->evntExit);
- return 0;
- }
- LRESULT UpdatingDataUI::WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- static UpdatingDataUI *object = NULL;
- switch(uMsg)
- {
- case WM_INITDIALOG:
- object = (UpdatingDataUI*)lParam;
- object->OnInitDialog(hwndDlg);
- break;
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- if (BeginPaint(hwndDlg, &ps))
- {
- object->OnPaint(&ps);
- EndPaint(hwndDlg, &ps);
- }
- }
- break;
- case WM_CLOSE:
- DestroyWindow(hwndDlg);
- break;
- case WM_DESTROY:
- ShowWindow(hwndDlg, SW_HIDE);
- PostQuitMessage(1);
- object->OnDestroy();
- break;
- case WM_TIMER:
- switch(wParam)
- {
- case TIMER_SHOWDIALOG_ID:
- object->OnShowTimer();
- break;
- case TIMER_ANIMATION_ID:
- object->OnAnimationTimer();
- break;
- }
- break;
- }
- return 0;
- }
|