summaryrefslogtreecommitdiff
path: root/app/wlib/mswlib/mswsplash.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/wlib/mswlib/mswsplash.c')
-rw-r--r--app/wlib/mswlib/mswsplash.c266
1 files changed, 266 insertions, 0 deletions
diff --git a/app/wlib/mswlib/mswsplash.c b/app/wlib/mswlib/mswsplash.c
new file mode 100644
index 0000000..bddd081
--- /dev/null
+++ b/app/wlib/mswlib/mswsplash.c
@@ -0,0 +1,266 @@
+/**
+ * Splash window for Windows
+ * $header$
+ */
+
+ /* XTrkCad - Model Railroad CAD
+ * Copyright (C) 2007 Martin Fischer
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <windows.h>
+#include <string.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <commdlg.h>
+#include <math.h>
+#include <ctype.h>
+#include <assert.h>
+#include "mswint.h"
+
+extern HINSTANCE mswHInst;
+extern HWND mswHWnd;
+
+static HWND hSplash;
+
+#define IDAPPNAME 150
+#define IDMESSAGE 200
+#define IDBITMAP 250
+
+static LPWORD lpwAlign( LPWORD lpIn )
+{
+ ULONG ul;
+
+ ul = (ULONG) lpIn;
+ ul +=3;
+ ul >>=2;
+ ul <<=2;
+ return (LPWORD) ul;
+}
+
+/**
+ * Draw the logo bitmap. Thanks to Charles Petzold.
+ */
+
+BOOL
+PaintBitmap( HWND hWnd, HBITMAP hBmp )
+{
+ HDC hdc, hdcMem;
+ RECT rect;
+
+ UpdateWindow( hWnd );
+
+ /* get device context for destination window ( the dialog control ) */
+ hdc = GetDC( hWnd );
+ GetClientRect( hWnd, &rect );
+
+ /* create a memory dc holding the bitmap */
+ hdcMem = CreateCompatibleDC( hdc );
+ SelectObject( hdcMem, hBmp );
+
+ /*
+ show it in the uppler left corner
+ the window is created with the size of the bitmap, so there is no need
+ for any special transformation
+ */
+
+ BitBlt( hdc, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
+ hdcMem, 0, 0, SRCCOPY );
+
+ /* release the DCs that are not needed any more */
+ DeleteDC( hdcMem );
+ ReleaseDC( hWnd, hdc );
+
+ return( 0 );
+}
+
+/**
+ * This is the dialog procedure for the splash window. Main activity is to
+ * catch the WM_PAINT message and draw the logo bitmap into that area.
+ */
+
+BOOL CALLBACK
+SplashDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
+{
+ static HWND hWndBmp;
+ static HBITMAP hBmp;
+
+ switch( msg ) {
+ case WM_INITDIALOG:
+ /* bitmap handle is passed at dialog creation */
+ hBmp = (HBITMAP)lParam;
+
+ hWndBmp = GetDlgItem( hDlg, IDBITMAP );
+ return TRUE;
+ case WM_PAINT:
+ /* paint the logo bitmap */
+ PaintBitmap( hWndBmp, hBmp );
+ break;
+ case WM_DESTROY:
+ /* destroy the bitmap */
+ DeleteObject( hBmp );
+ break;
+ }
+ return FALSE;
+}
+
+/**
+ * Show the splash screen. For display of the splash screen, a dialog template is
+ * created in memory. This template has three static elements:
+ * - the logo
+ * - the application name
+ * - the progress message
+ *
+ * return TRUE if successful, FALSE otherwise.
+ *
+ */
+
+int
+wCreateSplash( char *appname, char *appver )
+{
+ HGLOBAL hgbl;
+ LPDLGTEMPLATE lpdt;
+ LPWORD lpw;
+ LPDLGITEMTEMPLATE lpdit;
+ int cxDlgUnit, cyDlgUnit;
+ int cx, cy;
+ char *pszBuf;
+ HBITMAP hBmp;
+ BITMAP bmp;
+ char logoPath[MAX_PATH];
+
+ /* find the size of a dialog unit */
+ cxDlgUnit = LOWORD(GetDialogBaseUnits());
+ cyDlgUnit = HIWORD(GetDialogBaseUnits());
+
+ /* load the logo bitmap */
+ sprintf( logoPath, "%s\\logo.bmp", wGetAppLibDir());
+ hBmp = LoadImage( mswHInst, logoPath, IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_LOADFROMFILE );
+ if( !hBmp )
+ return( 0 );
+
+ /* get info about the loaded logo file */
+ GetObject( hBmp, sizeof(BITMAP), (LPVOID)&bmp );
+
+ /* calculate the size of dialog box */
+ cx = (bmp.bmWidth * 4) / cxDlgUnit; /* start with the size of the bitmap */
+ cy = (bmp.bmHeight * 8) / cyDlgUnit + 20; /* 20 is enough for two lines of text and some room */
+
+ /* allocate memory block for dialog template */
+ hgbl = GlobalAlloc(GMEM_ZEROINIT, 1024);
+ if (!hgbl)
+ return -1;
+ lpdt = (LPDLGTEMPLATE)GlobalLock(hgbl);
+
+ /* Define a dialog box. */
+ lpdt->style = WS_POPUP | WS_BORDER | WS_VISIBLE | DS_MODALFRAME | DS_CENTER;
+ lpdt->cdit = 3; // number of controls
+ lpdt->x = 0; lpdt->y = 0;
+ lpdt->cx = cx; lpdt->cy = cy;
+
+ lpw = (LPWORD) (lpdt + 1);
+ *lpw++ = 0; /* no menu */
+ *lpw++ = 0; /* predefined dialog box class (by default) */
+ *lpw++ = 0;
+
+ /* add the static control for the logo bitmap */
+ lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
+ lpdit->x = 0; lpdit->y = 0;
+ lpdit->cx = (SHORT)((bmp.bmWidth * 4) / cxDlgUnit);
+ lpdit->cy = (SHORT)((bmp.bmHeight * 8) / cyDlgUnit);
+
+ lpdit->id = IDBITMAP;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
+
+ lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Logo should be here...", -1, (LPWSTR)lpw, 50);
+
+ /* add the static control for the program title */
+ lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
+
+ lpdit->x = 2; lpdit->y = (short)( 1 + (bmp.bmHeight * 8) / cyDlgUnit );
+ lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
+ lpdit->id = IDAPPNAME;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
+
+ /* create the title string */
+ pszBuf = malloc( strlen( appname ) + strlen( appver ) + 2 );
+ if( !pszBuf )
+ return( 0 );
+ sprintf( pszBuf, "%s %s", appname, appver );
+
+ lpw += 1+MultiByteToWideChar (CP_ACP, 0, pszBuf, -1, (LPWSTR)lpw, 50);
+
+ /* add the static control for the loading message */
+ lpdit = (LPDLGITEMTEMPLATE)lpwAlign(lpw);
+ lpdit->x = 2; lpdit->y = (short)(bmp.bmHeight * 8) / cyDlgUnit + 10;
+ lpdit->cx = cx - 2; lpdit->cy = cyDlgUnit;
+ lpdit->id = IDMESSAGE;
+ lpdit->style = WS_CHILD | WS_VISIBLE | SS_LEFT;
+ lpw = (LPWORD) (lpdit + 1);
+ *lpw++ = 0xFFFF;
+ *lpw++ = 0x0082; /* static class */
+
+ lpw += 1+MultiByteToWideChar (CP_ACP, 0, "Starting Application...", -1, (LPWSTR)lpw, 50);
+
+ /* create the dialog */
+ GlobalUnlock(hgbl);
+ hSplash = CreateDialogIndirectParam( mswHInst, (LPDLGTEMPLATE) hgbl,
+ mswHWnd, (DLGPROC)SplashDlgProc, (LPARAM)hBmp );
+ GetLastError();
+
+ /* free allocated memory */
+ GlobalFree(hgbl);
+ free( pszBuf );
+
+ /* that's it */
+ return 1;
+}
+
+
+/**
+ * Update the progress message inside the splash window
+ * msg text message to display
+ * return nonzero if ok
+ */
+
+int
+wSetSplashInfo( char *msg )
+{
+ if( msg ) {
+ SetWindowText( GetDlgItem( hSplash, IDMESSAGE ), msg );
+ wFlush();
+ return TRUE;
+ }
+ wFlush();
+ return FALSE;
+}
+
+/**
+ * Remove the splash window from the screen.
+ */
+
+void
+wDestroySplash(void)
+{
+ DestroyWindow( hSplash );
+ return;
+} \ No newline at end of file