2
・プロジェクト名.cpp
#include "stdafx.h"
#include "Bootup.h"
#include "SplashWnd.h"
#include "Util.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
////////////////////////////////////////////////////////////////////////
// 表示リソース
////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------
// デストラクタ
//----------------------------------------------------------------------
SplashResource::~SplashResource()
{
// ビットマップ
HBITMAP hBmp = (HBITMAP) BackgraoundBitmap.Detach();
if (hBmp) {
DeleteObject(hBmp);
}
}
//----------------------------------------------------------------------
// 表示オブジェクトを作成する
//----------------------------------------------------------------------
void SplashResource::Create(BootupProfile* profile)
{
// ビットマップ
HBITMAP hBmp = (HBITMAP) LoadImage(
0,
profile->splashInfo.BackgraoundBitmapFilename,
IMAGE_BITMAP,
0,
0,
LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE
);
if (hBmp) {
BackgraoundBitmap.Attach(hBmp);
}
}
////////////////////////////////////////////////////////////////////////
// スプラッシュウィンドウを表示して、アプリケーションを起動する
////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------
// メッセージマップの定義
//----------------------------------------------------------------------
BEGIN_MESSAGE_MAP(CBootupApp, CWinApp)
// ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
//----------------------------------------------------------------------
// コンストラクタ
//----------------------------------------------------------------------
CBootupApp::CBootupApp() :
m_pSplashWnd(0)
{
}
//----------------------------------------------------------------------
// 設定情報を得る
//----------------------------------------------------------------------
BootupProfile* CBootupApp::GetProfile()
{
return &m_profile;
}
//----------------------------------------------------------------------
// 表示リソースを得る
//----------------------------------------------------------------------
SplashResource* CBootupApp::GetSplashResource()
{
return &m_splashResource;
}
//----------------------------------------------------------------------
// CBootupApp オブジェクトの初期化を行う
//----------------------------------------------------------------------
BOOL CBootupApp::InitInstance()
{
CWinApp::InitInstance();
// 設定情報を読み込む
CBootupProfileReader profileReader;
profileReader.LoadProfile(Util::GetModuleFilepath(PROFILE_FILENAME), m_profile);
// カレントディレクトリを設定する
CString currentDirectory = Util::GetModuleFilepath(_T(""));
SetCurrentDirectory(currentDirectory);
// 表示リソースを作成する
m_splashResource.Create(&m_profile);
// ウィンドウのサイズを調整する
int width = DEF_WND_WIDHT;
int height = DEF_WND_HEIGHT;
if (m_splashResource.BackgraoundBitmap.GetSafeHandle()) {
BITMAP bmpInfo;
m_splashResource.BackgraoundBitmap.GetBitmap(&bmpInfo);
width = bmpInfo.bmWidth + 2; // 左右の枠分を足す
height = bmpInfo.bmHeight + 2; // 上下の枠分を足す
}
if (m_profile.splashInfo.Width == 0) {
m_profile.splashInfo.Width = width;
}
if (m_profile.splashInfo.Height == 0) {
m_profile.splashInfo.Height = height;
}
// スプラッシュウィンドウを作成・表示する
m_pMainWnd = m_pSplashWnd = new CSplashWnd();
if (!m_pSplashWnd) {
return FALSE;
}
RECT rect;
SystemParametersInfo(SPI_GETWORKAREA, 0, (LPVOID) &rect, 0);
m_pSplashWnd->CreateEx(
WS_EX_TOOLWINDOW | WS_EX_TOPMOST,
AfxRegisterWndClass(CS_DBLCLKS, ::LoadCursor(0, IDC_APPSTARTING)),
0,
WS_BORDER | WS_POPUP,
(rect.right - rect.left - m_profile.splashInfo.Width) / 2,
(rect.bottom - rect.top - m_profile.splashInfo.Height) / 2,
m_profile.splashInfo.Width,
m_profile.splashInfo.Height,
0,
0
);
m_pSplashWnd->ShowWindow(SW_SHOW);
m_pSplashWnd->UpdateWindow();
// プログラムを起動する
if (0 < m_profile.splashInfo.BootupProgramFilename.GetLength()) {
CString commandLine;
CArray<TCHAR> bcmdLine;
commandLine.Format(_T("%s %s"), m_profile.splashInfo.BootupProgramFilename, m_profile.splashInfo.BootupProgramParameter);
bcmdLine.SetSize(commandLine.GetLength() + 1);
TCHAR* pbcmdLine = bcmdLine.GetData();
if (pbcmdLine) {
_tcscpy_s(pbcmdLine, bcmdLine.GetSize(), commandLine);
pbcmdLine[commandLine.GetLength()] = _T('\0');
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
BOOL rc = CreateProcess(
0, pbcmdLine,
0, 0,
FALSE,
CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
0, currentDirectory,
&si, &pi
);
if (rc) {
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
return TRUE;
}
//----------------------------------------------------------------------
// 終了処理を行う
//----------------------------------------------------------------------
int CBootupApp::ExitInstance()
{
if (m_pSplashWnd) {
delete m_pSplashWnd;
m_pSplashWnd = 0;
}
return CWinApp::ExitInstance();
}
////////////////////////////////////////////////////////////////////////
// CBootupApp オブジェクトの定義
////////////////////////////////////////////////////////////////////////
CBootupApp theApp;
Author And Source
この問題について(2), 我々は、より多くの情報をここで見つけました https://qiita.com/shanjiangzhenguo92/items/cc2ecee6c11ebf848824著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .