diff options
Diffstat (limited to 'src/ui/ui-drv/win32/about.c')
-rw-r--r-- | src/ui/ui-drv/win32/about.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/src/ui/ui-drv/win32/about.c b/src/ui/ui-drv/win32/about.c new file mode 100644 index 0000000..22b040d --- /dev/null +++ b/src/ui/ui-drv/win32/about.c @@ -0,0 +1,239 @@ +#include <windows.h> +#include "fconfig.h" +#include "xerror.h" +#include "ui_win32.h" +#include "about.h" +void CenterWindow(HWND hwndChild, HWND hwndParent) +{ + RECT rChild, rParent, rWorkArea; + int wChild, hChild, wParent, hParent; + int xNew, yNew; + BOOL bResult; + + GetWindowRect(hwndChild, &rChild); + wChild = rChild.right - rChild.left; + hChild = rChild.bottom - rChild.top; + + GetWindowRect(hwndParent, &rParent); + wParent = rParent.right - rParent.left; + hParent = rParent.bottom - rParent.top; + + bResult = SystemParametersInfo(SPI_GETWORKAREA, // system parameter to query or set + sizeof(RECT), &rWorkArea, 0); + if (!bResult) { + rWorkArea.left = rWorkArea.top = 0; + rWorkArea.right = GetSystemMetrics(SM_CXSCREEN); + rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN); + } + + xNew = rParent.left + ((wParent - wChild) / 2); + if (xNew < rWorkArea.left) { + xNew = rWorkArea.left; + } else if ((xNew + wChild) > rWorkArea.right) { + xNew = rWorkArea.right - wChild; + } + + yNew = rParent.top + ((hParent - hChild) / 2); + if (yNew < rWorkArea.top) { + yNew = rWorkArea.top; + } else if ((yNew + hChild) > rWorkArea.bottom) { + yNew = rWorkArea.bottom - hChild; + } + + SetWindowPos(hwndChild, NULL, xNew, yNew, 0, 0, + SWP_NOSIZE | SWP_NOZORDER); + return; +} + + +static LPTSTR GetStringRes(int id) +{ + static TCHAR buffer[MAX_PATH]; + + buffer[0] = 0; + LoadString(GetModuleHandle(NULL), id, buffer, MAX_PATH); + return buffer; +} + +static LRESULT CALLBACK +About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) +{ + static HFONT hfontDlg; // Font for dialog text + static HFONT hFinePrint; // Font for 'fine print' in dialog + DWORD dwVerInfoSize; // Size of version information block + LPSTR lpVersion; // String pointer to 'version' text + DWORD dwVerHnd = 0; // An 'ignored' parameter, always '0' + UINT uVersionLen; + WORD wRootLen; + BOOL bRetCode; + int i; + char szFullPath[256]; + char szResult[256]; + char szGetName[256]; + DWORD dwVersion; + char szVersion[40]; + DWORD dwResult; + + switch (message) { + case WM_INITDIALOG: + ShowWindow(hDlg, SW_HIDE); + + if (PRIMARYLANGID(GetUserDefaultLangID()) == LANG_JAPANESE) { + hfontDlg = + CreateFont(14, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, + 0, VARIABLE_PITCH | FF_DONTCARE, ""); + hFinePrint = + CreateFont(11, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, + 0, VARIABLE_PITCH | FF_DONTCARE, ""); + } else { + hfontDlg = CreateFont(14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + VARIABLE_PITCH | FF_SWISS, ""); + hFinePrint = CreateFont(11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + VARIABLE_PITCH | FF_SWISS, ""); + } + + CenterWindow(hDlg, GetWindow(hDlg, GW_OWNER)); + GetModuleFileName(hInstance, szFullPath, sizeof(szFullPath)); +#if 0 + // Now lets dive in and pull out the version information: + dwVerInfoSize = GetFileVersionInfoSize(szFullPath, &dwVerHnd); + if (dwVerInfoSize) { + LPSTR lpstrVffInfo; + HANDLE hMem; + hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); + lpstrVffInfo = GlobalLock(hMem); + GetFileVersionInfo(szFullPath, dwVerHnd, dwVerInfoSize, + lpstrVffInfo); + // The below 'hex' value looks a little confusing, but + // essentially what it is, is the hexidecimal representation + // of a couple different values that represent the language + // and character set that we are wanting string values for. + // 040904E4 is a very common one, because it means: + // US English, Windows MultiLingual characterset + // Or to pull it all apart: + // 04------ = SUBLANG_ENGLISH_USA + // --09---- = LANG_ENGLISH + // --11---- = LANG_JAPANESE + // ----04E4 = 1252 = Codepage for Windows:Multilingual + + lstrcpy(szGetName, GetStringRes(IDS_VER_INFO_LANG)); + + wRootLen = (WORD) lstrlen(szGetName); // Save this position + + // Set the title of the dialog: + lstrcat(szGetName, "ProductName"); + bRetCode = VerQueryValue((LPVOID) lpstrVffInfo, + (LPSTR) szGetName, + (LPVOID) & lpVersion, + (UINT *) & uVersionLen); + + // Notice order of version and string... + if (PRIMARYLANGID(GetUserDefaultLangID()) == LANG_JAPANESE) { + lstrcpy(szResult, lpVersion); + lstrcat(szResult, " のバージョン情報"); + } else { + lstrcpy(szResult, "About "); + lstrcat(szResult, lpVersion); + } + + // ----------------------------------------------------- + + SetWindowText(hDlg, szResult); + + // Walk through the dialog items that we want to replace: + for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++) { + GetDlgItemText(hDlg, i, szResult, sizeof(szResult)); + szGetName[wRootLen] = (char) 0; + lstrcat(szGetName, szResult); + uVersionLen = 0; + lpVersion = NULL; + x_message("lpstrVffInfo %s", lpstrVffInfo); + bRetCode = VerQueryValue((LPVOID) lpstrVffInfo, + (LPSTR) szGetName, + (LPVOID) & lpVersion, + (UINT *) & uVersionLen); + + if (bRetCode && uVersionLen && lpVersion) { + // Replace dialog item text with version info + lstrcpy(szResult, lpVersion); + SetDlgItemText(hDlg, i, szResult); + } else { + dwResult = GetLastError(); + + wsprintf(szResult, GetStringRes(IDS_VERSION_ERROR), + dwResult); + SetDlgItemText(hDlg, i, szResult); + } + SendMessage(GetDlgItem(hDlg, i), WM_SETFONT, + /* (ULONG_PTR) */ + (unsigned long *) ((i == DLG_VERLAST) ? + hFinePrint : hfontDlg), + TRUE); + } // for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++) + + + GlobalUnlock(hMem); + GlobalFree(hMem); + } else { + // No version information available. + } // if (dwVerInfoSize) +#endif + for (i = DLG_VERFIRST; i <= IDC_LICENSE; i++) { + SendMessage(GetDlgItem(hDlg, i), WM_SETFONT, + /* (ULONG_PTR) */ + (unsigned long *) ((i == DLG_VERLAST) ? hFinePrint + : hfontDlg), TRUE); + } // for (i = DLG_VERFIRST; i <= DLG_VERLAST; i++) + + SendMessage(GetDlgItem(hDlg, IDC_LABEL), WM_SETFONT, + (WPARAM) hfontDlg, (LPARAM) TRUE); + + // We are using GetVersion rather then GetVersionEx + // because earlier versions of Windows NT and Win32s + // didn't include GetVersionEx: + dwVersion = GetVersion(); + + if (dwVersion < 0x80000000) { + // Windows NT + wsprintf(szVersion, "Microsoft Windows NT %u.%u (Build: %u)", + (DWORD) (LOBYTE(LOWORD(dwVersion))), + (DWORD) (HIBYTE(LOWORD(dwVersion))), + (DWORD) (HIWORD(dwVersion))); + } else if (LOBYTE(LOWORD(dwVersion)) < 4) { + // Win32s + wsprintf(szVersion, "Microsoft Win32s %u.%u (Build: %u)", + (DWORD) (LOBYTE(LOWORD(dwVersion))), + (DWORD) (HIBYTE(LOWORD(dwVersion))), + (DWORD) (HIWORD(dwVersion) & ~0x8000)); + } else { + // Windows 95 + wsprintf(szVersion, "Microsoft Windows 95 %u.%u", + (DWORD) (LOBYTE(LOWORD(dwVersion))), + (DWORD) (HIBYTE(LOWORD(dwVersion)))); + } + + SetWindowText(GetDlgItem(hDlg, IDC_OSVERSION), szVersion); + ShowWindow(hDlg, SW_SHOW); + return (TRUE); + + case WM_COMMAND: + if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { + EndDialog(hDlg, TRUE); + DeleteObject(hfontDlg); + DeleteObject(hFinePrint); + return (TRUE); + } + break; + } + + return FALSE; +} + +void AboutBox(void) +{ +#ifdef DDRAW_DRIVER + if (directX == 1) + return; +#endif + DialogBox(hInstance, "AboutBox", hWnd, (DLGPROC) About); +} |