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 + -
显示快捷键?