mainfrm.cpp
来自「一个快捷面板,可以将自己常用的程序放在其中!」· C++ 代码 · 共 470 行
CPP
470 行
// MainFrm.cpp : CMainFrame 类的实现
//
#include "stdafx.h"
#include "LinkPanel.h"
#include "MainFrm.h"
#include ".\mainfrm.h"
#include "Registry.h"
BOOL (__stdcall *LockWorkStation)(VOID);
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define WM_TRAY_NOTIFICATION WM_USER + 1
#define GetWindowStyle(hwnd) ((DWORD)GetWindowLong(hwnd, GWL_STYLE))
BOOL CALLBACK EnumChildProc( HWND hwnd, // handle to child window
LPARAM lParam // application-defined value
)
{
//char classname[200];
//CSkinTestDlg *dlg = (CSkinTestDlg *)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;
}
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_MESSAGE(WM_TRAY_NOTIFICATION, OnTrayNotification)
ON_WM_CLOSE()
ON_COMMAND(ID_APP_EXIT, OnAppExit)
ON_COMMAND(ID_SHOW, OnShow)
ON_COMMAND(ID_OPEN_ADDREMOVE, OnOpenAddremove)
ON_COMMAND(ID_LOCK_COMPUTER, OnLockComputer)
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // 状态行指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
// CMainFrame 构造/析构
CMainFrame::CMainFrame() : m_trayIcon(IDR_TRACK_MENU)
{
m_bMinButton = TRUE;
m_bMaxButton = FALSE;
// 初始第一次的显示画面
m_bFirst = TRUE;
// 是否可以关闭程序了
m_bShutdown = FALSE;
m_bStyle = FALSE;
m_bShowBmp = FALSE;
m_bSave = TRUE;
m_bRun = TRUE;
m_Control = 0;
m_Key = 0;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 隐去工具栏和状态栏
//if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
// | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
// !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
//{
// TRACE0("未能创建工具栏\n");
// return -1; // 未能创建
//}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("未能创建状态栏\n");
return -1; // 未能创建
}
// 去掉菜单
//SetMenu(NULL);
ReadKeySetting();
SetSyle();
// 注册键值
UINT nStatus;
if(m_Key == 0)
::RegisterHotKey(this->m_hWnd, 0Xa001, MOD_WIN, (UINT)81);
else
{
switch(m_Control)
{
case 0:
nStatus = MOD_WIN;
break;
case 1:
nStatus = MOD_CONTROL;
break;
case 2:
nStatus = MOD_SHIFT;
break;
case 3:
nStatus = MOD_ALT;
break;
}
::RegisterHotKey(this->m_hWnd, 0Xa001, nStatus, (UINT)m_Key);
}
::RegisterHotKey(GetSafeHwnd(), 0Xa002, MOD_WIN, (UINT)65);
m_trayIcon.SetNotificationWnd(this, WM_TRAY_NOTIFICATION);
m_trayIcon.SetIcon(IDR_TRACK_MENU);
// 设置寻找标记
::SetProp(m_hWnd, AfxGetApp()->m_pszAppName, (HANDLE)1);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
// 根据选择去掉最大化/最小化按钮
if(ReadKeySetting())
{
cs.x = m_wpPalace.rcNormalPosition.left;
cs.y = m_wpPalace.rcNormalPosition.top;
cs.cx = m_wpPalace.rcNormalPosition.right - m_wpPalace.rcNormalPosition.left;
cs.cy = m_wpPalace.rcNormalPosition.bottom - m_wpPalace.rcNormalPosition.top;
}
//cs.x = 200;
//cs.y = 150;
//cs.cx = 600;
//cs.cy = 400;
//if(m_wpPalace.rcNormalPosition.left == 0 && m_wpPalace.rcNormalPosition.top == 0 &&
// m_wpPalace.rcNormalPosition.right == 0 && m_wpPalace.rcNormalPosition.bottom == 0)
if(!m_bMinButton)
cs.style &= ~WS_MINIMIZEBOX;
if(!m_bMaxButton)
cs.style &= ~WS_MAXIMIZEBOX;
cs.dwExStyle |= WS_EX_TOPMOST;
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
// 样式
return TRUE;
}
// CMainFrame 诊断
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
// CMainFrame 消息处理程序
BOOL CMainFrame::SetSkin(CString sSkinFile)
{
m_skinWin.LoadSkin( sSkinFile ); //load skin bitmap and parameters
m_btnres.LoadSkin( sSkinFile );
if ( m_bFirst )
{
//if it''s the first time call, InstallSkin
m_skinWin.InstallSkin( this );
//call EnumChildWindows to subclass all buttons
//EnumChildWindows( m_hWnd, EnumChildProc, (LPARAM)this );
m_bFirst = FALSE;
}
//redraw window after change skin
SetWindowPos( 0, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |SWP_FRAMECHANGED );
return TRUE;
}
//BOOL CMainFrame::SubClassButton( HWND hwnd )
//{
// CSkinButton * btn = new CSkinButton();
// CWnd* pWnd = CWnd::FromHandlePermanent(hwnd);
// if ( pWnd == NULL)
// {
// btn->SubclassWindow( hwnd );
// btn->SetResource( &m_btnres );
// return TRUE;
// }
// return FALSE;
//}
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();
POSITION pos;
pos = m_wndList.GetHeadPosition();
while( pos )
{
CObject *ob = m_wndList.GetAt(pos);
if ( ob->GetRuntimeClass() == RUNTIME_CLASS(CSkinButton) )
{
delete (CSkinButton*)ob;
}
m_wndList.GetNext(pos);
}
UnregisterHotKey(this->m_hWnd, 0Xa001);
// 删除寻找标记
::RemoveProp(m_hWnd, AfxGetApp()->m_pszAppName);
}
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message==WM_HOTKEY)
{
if(pMsg->wParam == 0Xa001) // 激活窗口
{
CLinkPanelApp* pApp = (CLinkPanelApp*)AfxGetApp();
if(pApp && pApp->m_bHide)
{
::ShowWindow(m_hWnd, SW_SHOWNORMAL);
::SetForegroundWindow(m_hWnd);
pApp->m_bHide = FALSE;
}
else
{
::ShowWindow(m_hWnd, SW_HIDE);
pApp->m_bHide = TRUE;
}
}
else if(pMsg->wParam == 0Xa002) // 激活添加删除程序
{
OnOpenAddremove();
}
}
return CFrameWnd::PreTranslateMessage(pMsg);
}
LRESULT CMainFrame::OnTrayNotification(WPARAM uID, LPARAM lEvent)
{
//if (m_bShowTrayNotifications) {
// static LPCSTR MouseMessages[] = { "WM_MOUSEMOVE",
// "WM_LBUTTONDOWN", "WM_LBUTTONUP", "WM_LBUTTONDBLCLK",
// "WM_RBUTTONDOWN", "WM_RBUTTONUP", "WM_RBUTTONDBLCLK",
// "WM_MBUTTONDOWN", "WM_MBUTTONUP", "WM_MBUTTONDBLCLK" };
// CString s;
// s.Format("托盘通知消息: ID=%d, lEvent=0x%04x %s\r\n",
// uID, lEvent, WM_MOUSEFIRST<=lEvent && lEvent<=WM_MOUSELAST ?
// MouseMessages[lEvent-WM_MOUSEFIRST] : "(未知消息)");
// m_wndEdit.SetSel(-1, -1); // end of edit text
// m_wndEdit.ReplaceSel(s); // append string..
// m_wndEdit.SendMessage(EM_SCROLLCARET); // ..and make visible
//}
// let tray icon do default stuff
return m_trayIcon.OnTrayNotification(uID, lEvent);
}
void CMainFrame::OnClose()
{
if (m_bShutdown)
{
WriteKeySetting();
CFrameWnd::OnClose();
}
else
{
ShowWindow(SW_HIDE);
((CLinkPanelApp*)AfxGetApp())->m_bHide = TRUE;
}
}
void CMainFrame::OnAppExit()
{
m_bShutdown = TRUE;
SendMessage(WM_CLOSE);
}
void CMainFrame::OnShow()
{
CLinkPanelApp* pApp = (CLinkPanelApp*)AfxGetApp();
if(pApp && pApp->m_bHide)
{
::ShowWindow(m_hWnd, SW_SHOWNORMAL);
::SetForegroundWindow(m_hWnd);
pApp->m_bHide = FALSE;
}
else
{
::ShowWindow(m_hWnd, SW_HIDE);
pApp->m_bHide = TRUE;
}
}
void CMainFrame::WriteKeySetting()
{
DWORD dwHotKey = MAKEWORD(m_Key, m_Control);
CRegistry Key(HKEY_CURRENT_USER);
if(Key.Open(_T("Software\\Xiaoqiang Studio\\LinkPanel\\Settings")))
{
Key.Write("HotKey", dwHotKey);
Key.Write("Style", m_bStyle);
Key.Write("AutoSave", (int)m_bSave);
Key.Write("AutoRun", (int)m_bRun);
Key.Write("ShowBk", (int)m_bShowBmp);
GetWindowPlacement(&m_wpPalace);
CRect rc(m_wpPalace.rcNormalPosition);
DWORD dwLeft = rc.left;
DWORD dwTop = rc.top;
DWORD dwRight = rc.right;
DWORD dwBom = rc.bottom;
Key.Write("LeftPos", dwLeft);
Key.Write("RightPos", dwRight);
Key.Write("TopPos", dwTop);
Key.Write("BottomPos", dwBom);
Key.SetKey(HKEY_CURRENT_USER);
if(Key.Open(_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run")))
{
if(m_bRun)
{
CString sTemp = _T("");
DWORD dwSize = MAX_PATH;
GetModuleFileName(AfxGetInstanceHandle(), sTemp.GetBuffer(MAX_PATH), MAX_PATH);
Key.Write("LinkPanel", sTemp);
sTemp.ReleaseBuffer(MAX_PATH);
}
else
Key.DeleteValue("LinkPanel");
}
//HKEY hKey;
//if(ERROR_SUCCESS == ::RegOpenKey(HKEY_CURRENT_USER, "Software\\Xiaoqiang Studio\\LinkPanel\\Settings", &hKey))
// ::RegSetValueEx(hKey, "window Place", NULL, REG_DWORD, (LPBYTE)&m_wpPalace, sizeof(WINDOWPLACEMENT));
}
}
BOOL CMainFrame::ReadKeySetting()
{
BOOL bReturn = TRUE;
DWORD dwHotKey = 0;
CRegistry Key(HKEY_CURRENT_USER);
if(Key.Open(_T("Software\\Xiaoqiang Studio\\LinkPanel\\Settings")))
{
if(Key.Read("HotKey", (DWORD*)&dwHotKey))
{
m_Control = HIBYTE(dwHotKey);
m_Key = LOBYTE(dwHotKey);
}
Key.Read("Style", (int*)&m_bStyle);
Key.Read("AutoSave", (int*)&m_bSave);
Key.Read("AutoRun", (int*)&m_bRun);
Key.Read("ShowBk", (int*)&m_bShowBmp);
DWORD dwLeft = 0;
DWORD dwTop = 0;
DWORD dwRight = 0;
DWORD dwBom = 0;
bReturn = bReturn && Key.Read("LeftPos", (DWORD*)&dwLeft);
bReturn = bReturn && Key.Read("RightPos", (DWORD*)&dwRight);
bReturn = bReturn && Key.Read("TopPos", (DWORD*)&dwTop);
bReturn = bReturn && Key.Read("BottomPos", (DWORD*)&dwBom);
m_wpPalace.rcNormalPosition.left = dwLeft;
m_wpPalace.rcNormalPosition.right = dwRight;
m_wpPalace.rcNormalPosition.top = dwTop;
m_wpPalace.rcNormalPosition.bottom = dwBom;
}
//HKEY hKey;
//dwHotKey = REG_DWORD;
//DWORD dwSize = sizeof(WINDOWPLACEMENT);
//if(ERROR_SUCCESS == ::RegOpenKey(HKEY_CURRENT_USER, "Software\\Xiaoqiang Studio\\LinkPanel\\Settings", &hKey))
// ::RegQueryValueEx(hKey, "window Place", NULL, &dwHotKey, (LPBYTE)&m_wpPalace, &dwSize);
return bReturn;
}
void CMainFrame::SetSyle()
{
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);
}
void CMainFrame::OnOpenAddremove()
{
CString sPath = _T("");
TCHAR szPath[MAX_PATH];
GetSystemDirectory(szPath, MAX_PATH);
sPath = szPath;
sPath += _T("\\appwiz.cpl");
ShellExecute(GetSafeHwnd(), "", sPath, "", "", SW_SHOWNORMAL);
}
void CMainFrame::OnLockComputer()
{
LockWorkStation = (BOOL(__stdcall *)(VOID))
GetProcAddress(GetModuleHandle("User32"),"LockWorkStation");
LockWorkStation();
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?