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