linkpanel.cpp

来自「一个快捷面板,可以将自己常用的程序放在其中!」· C++ 代码 · 共 262 行

CPP
262
字号
// LinkPanel.cpp : 定义应用程序的类行为。
//

#include "stdafx.h"
#include "LinkPanel.h"
#include "MainFrm.h"

#include "LinkPanelDoc.h"
#include "LinkPanelView.h"
#include ".\linkpanel.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CLinkPanelApp

BEGIN_MESSAGE_MAP(CLinkPanelApp, CWinApp)
	ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
	// 基于文件的标准文档命令
	ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
	ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
END_MESSAGE_MAP()


// CLinkPanelApp 构造

CLinkPanelApp::CLinkPanelApp()
{
	// TODO: 在此处添加构造代码,
	m_bHide		= TRUE;
	m_hSem		= NULL;
}


// 唯一的一个 CLinkPanelApp 对象

CLinkPanelApp theApp;

// CLinkPanelApp 初始化

BOOL CLinkPanelApp::InitInstance()
{
	// 如果一个运行在 Windows XP 上的应用程序清单指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
	//则需要 InitCommonControls()。否则,将无法创建窗口。
	
	if(!CheckApplication())
		return FALSE;

	InitCommonControls();

	CWinApp::InitInstance();

	// 初始化 OLE 库
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}
	AfxEnableControlContainer();
	// 标准初始化
	// 如果未使用这些功能并希望减小
	// 最终可执行文件的大小,则应移除下列
	// 不需要的特定初始化例程
	// 更改用于存储设置的注册表项
	// TODO: 应适当修改该字符串,
	// 例如修改为公司或组织名
	SetRegistryKey(_T("Xiaoqiang Studio"));
	LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU)
	// 注册应用程序的文档模板。文档模板
	// 将用作文档、框架窗口和视图之间的连接
	CSingleDocTemplate* pDocTemplate;
	pDocTemplate = new CSingleDocTemplate(
		IDR_MAINFRAME,
		RUNTIME_CLASS(CLinkPanelDoc),
		RUNTIME_CLASS(CMainFrame),       // 主 SDI 框架窗口
		RUNTIME_CLASS(CLinkPanelView));
	if (!pDocTemplate)
		return FALSE;
	AddDocTemplate(pDocTemplate);
	// 分析标准外壳命令、DDE、打开文件操作的命令行
	CCommandLineInfo cmdInfo;
	ParseCommandLine(cmdInfo);
	// 调度在命令行中指定的命令。如果
	// 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
	if (!ProcessShellCommand(cmdInfo))
		return FALSE;
	// 唯一的一个窗口已初始化,因此显示它并对其进行更新
	m_pMainWnd->ShowWindow(SW_HIDE);
	m_pMainWnd->UpdateWindow();
	// 仅当存在后缀时才调用 DragAcceptFiles,
	//  在 SDI 应用程序中,这应在 ProcessShellCommand  之后发生
	return TRUE;
}

// CLinkPanelApp 消息处理程序
void CLinkPanelApp::OnAppAbout()
{
	CAboutDlg aboutDlg;
	aboutDlg.DoModal();
}

BOOL CLinkPanelApp::CheckApplication()
{
	// 用应用程序名创建信号量 
	HANDLE hSem = CreateSemaphore(NULL, 1, 1, m_pszAppName); 

	// 信号量存在,则程序已有一个实例运行 
	if (GetLastError() == ERROR_ALREADY_EXISTS) 
	{ 
		// 关闭信号量句柄 
		CloseHandle(hSem); 
		// 寻找先前实例的主窗口 
		HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); 
		while (::IsWindow(hWndPrevious)) 
		{ 
			// 检查窗口是否有预设的标记? 
			// 有,则是我们寻找的主窗 
			if (::GetProp(hWndPrevious, m_pszAppName)) 
			{ 
				// 主窗口已最小化,则恢复其大小 
				if (::IsIconic(hWndPrevious)) 
					::ShowWindow(hWndPrevious, SW_SHOW); 

				// 将主窗激活 
				::SetForegroundWindow(hWndPrevious); 

				// 将主窗的对话框激活 
				::SetForegroundWindow(::GetLastActivePopup(hWndPrevious));
				FlashWindow(hWndPrevious, TRUE);

				// 退出本实例 
				return FALSE; 
			} 
			// 继续寻找下一个窗口 
			hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT);
		} 
		// 前一实例已存在,但找不到其主窗 
		// 可能出错了 
		// 退出本实例 
		return FALSE; 

	}

	return TRUE;

}

int CLinkPanelApp::ExitInstance()
{
	CloseHandle(m_hSem);

	return CWinApp::ExitInstance();
}


CAboutDlg::CAboutDlg(BOOL bStyle) : CDialog(CAboutDlg::IDD)
{
	m_bFirst		= TRUE;
	m_bStyle		= bStyle;
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()

// 用于运行对话框的应用程序命令
BOOL CAboutDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetStyle();

	m_wndLink1.m_link = _T("http://www.vckbase.com");
	m_wndLink2.m_link = _T("Santa_q01@sina.com");
	m_wndLink1.SubclassDlgItem(IDB_STATIC_IMG, this);
	m_wndLink2.SubclassDlgItem(IDC_EMAIL, this);

	UpdateData(FALSE);


	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

BOOL CAboutDlg::SetSkin(CString file)
{
	m_skinWin.LoadSkin( file );
	m_btnres.LoadSkin( file );
	if ( m_bFirst )
	{
		m_skinWin.InstallSkin( this );
		EnumChildWindows( m_hWnd, EnumChildProc, (LPARAM)this );

		m_bFirst = FALSE;
	}
	SetWindowPos( 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |SWP_FRAMECHANGED );
	return TRUE;

}


BOOL CAboutDlg::SubClassButton( HWND hwnd )
{
	CSkinButton * btn = new CSkinButton();
	CWnd* pWnd = CWnd::FromHandlePermanent(hwnd);
	if ( pWnd == NULL)
	{
		btn->SetResource(&m_btnres);

		return TRUE;
	}
	return FALSE;
}

void CAboutDlg::SetStyle() 
{
	CString sPath = _T("");
	GetModuleFileName(AfxGetInstanceHandle(), sPath.GetBuffer(MAX_PATH), MAX_PATH);
	sPath.ReleaseBuffer(MAX_PATH);
	sPath = sPath.Left(sPath.ReverseFind('\\') + 1);
	if(!m_bStyle)
		sPath = sPath + _T("skin\\neostyle\\theme.ini");
	else
		sPath += _T("skin\\xpstyle\\theme.ini");

	SetSkin(sPath);
}
BOOL CALLBACK CAboutDlg::EnumChildProc(  HWND hwnd,      // handle to child window
										LPARAM lParam   // application-defined value
										)
{
	char classname[200];
	CAboutDlg *dlg = (CAboutDlg*)lParam;
	DWORD style;

	GetClassName( hwnd, classname, 200 );
	style = GetWindowStyle( hwnd );
	if ( strcmp( classname, "Button" ) == 0 )
	{
		style = (UINT)GetWindowLong(hwnd, GWL_STYLE) & 0xff;
		if ( style == BS_PUSHBUTTON || style == BS_DEFPUSHBUTTON )
			dlg->SubClassButton( hwnd );
	}


	return TRUE;
}







⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?