/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the Qt Solutions component. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names ** of its contributors may be used to endorse or promote products derived ** from this software without specific prior written permission. ** ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** ** $QT_END_LICENSE$ ** ****************************************************************************/ // QtMfc.cpp : Defines the class behaviors for the application. // #include "stdafx.h" #include "qtmfc.h" #include "mainframe.h" #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // WindowsApp BEGIN_MESSAGE_MAP(WindowsApp, CWinApp) //{{AFX_MSG_MAP(WindowsApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // WindowsApp construction WindowsApp::WindowsApp() { } ///////////////////////////////////////////////////////////////////////////// // The one and only WindowsApp object WindowsApp theApp; ///////////////////////////////////////////////////////////////////////////// // WindowsApp initialization BOOL WindowsApp::InitInstance() { // Standard initialization #if _MFC_VER < 0x0700 #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif #endif // Change the registry key under which our settings are stored. SetRegistryKey(_T("Local AppWizard-Generated Applications")); MainFrame* pFrame = new MainFrame; m_pMainWnd = pFrame; // create and load the frame with its resources pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE; } ///////////////////////////////////////////////////////////////////////////// // WindowsApp message handlers ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() static inline void formatWindowsErrorMessage(DWORD errorCode, std::wostream &str) { wchar_t *string = 0; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&string, 0, NULL); if (string) str << string; else str << "Unknown error"; LocalFree((HLOCAL)string); } static bool showQtAboutDialog(HWND parentWindow, std::wstring *errorMessage) { typedef BOOL(*pShowDialog)(HWND parent); const char dllName[] = "qtdialog.dll"; const char functionName[] = "showDialog"; const HMODULE module = LoadLibraryA(dllName); const DWORD errorCode = GetLastError(); if (!module) { std::wostringstream str; str << "Unable to load '" << dllName << "': Error #" << errorCode << ": "; formatWindowsErrorMessage(errorCode, str); *errorMessage = str.str(); return false; } pShowDialog showDialog = (pShowDialog)GetProcAddress(module, functionName); if (!showDialog) { std::wostringstream str; str << "Unable to resolve function '" << functionName << "' in '" << dllName << "'."; *errorMessage = str.str(); return false; } showDialog(parentWindow); FreeLibrary(module); return true; } // App command to run the dialog void WindowsApp::OnAppAbout() { const HWND parentWindow = theApp.m_pMainWnd->m_hWnd; std::wstring errorMessage; if (!showQtAboutDialog(parentWindow, &errorMessage)) { MessageBoxW(parentWindow, errorMessage.c_str(), L"QtMfc 1.0 MFC Application", MB_OK | MB_ICONWARNING); } } ///////////////////////////////////////////////////////////////////////////// // WindowsApp message handlers