mainfrm.cpp

来自「《Visual C++视频技术方案宝典》配套光盘」· C++ 代码 · 共 271 行

CPP
271
字号
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "SysPlug.h"

#include "MainFrm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainFrame
#define MINPLUGCMD 10000
#define MAXPLUGCMD  MINPLUGCMD+ 300

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_COMMAND(ID_ADDPLUG, OnAddplug)
	ON_COMMAND_EX_RANGE(MINPLUGCMD,MAXPLUGCMD,OnPlugEvent)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // status line indicator
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	// TODO: add member initialization code here
	
}

CMainFrame::~CMainFrame()
{

	CPlugMap* pTempObj;
	int ItemCount = m_PlugSet.GetCount();
	for (int i = 0; i< ItemCount; i++)
	{
		pTempObj = m_PlugSet.RemoveTail();
		delete pTempObj;
	}
}

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("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if (!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("Failed to create status bar\n");
		return -1;      // fail to create
	}

	// TODO: Delete these three lines if you don't want the toolbar to
	// be dockable
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	SetTitle("设计具有插件功能的应用程序");


	LoadPlug();//
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers


void CMainFrame::OnAddplug() 
{
	CFileDialog fDlg(TRUE,NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Dll文件|*.dll",this);
	if (fDlg.DoModal()==IDOK)
	{
		//获取应用程序路径
		CString appName="";
		GetModuleFileName(NULL,appName.GetBuffer(0),MAX_PATH);
		int pos = appName.ReverseFind('\\');
		CString temp = appName;
		CString appdir = temp.Left(pos);
		
		CString path = fDlg.GetPathName();
		CString name = fDlg.GetFileName();
		CopyFile(path,appdir+"\\Plug\\"+name,FALSE);
	}
	LoadPlug();	
	LoadPlug();	
}

void CMainFrame::LoadPlug()
{
	//清除原来的插件对象
	CPlugMap* pTempObj;
	int ItemCount = m_PlugSet.GetCount();
	for (int index = 0; index<ItemCount; index++)
	{
		pTempObj = m_PlugSet.RemoveTail();
		delete pTempObj;
	}

	WIN32_FIND_DATA fData;

	m_Images.Create(32,32,ILC_COLOR24|ILC_MASK,1,1);	

	//获取应用程序路径
	CString appName="";
	GetModuleFileName(NULL,appName.GetBuffer(0),MAX_PATH);
	int pos = appName.ReverseFind('\\');
	CString temp = appName;
	CString appdir = temp.Left(pos);

	//搜索Plug目录
	HANDLE hFile =  FindFirstFile(appdir+"\\Plug\\*.*",&fData);

	if (hFile != INVALID_HANDLE_VALUE )
	{
		CString str ;
a:		if (fData.dwFileAttributes !=FILE_ATTRIBUTE_DIRECTORY)
		{
			str =  fData.cFileName;
			HINSTANCE hInstance = LoadLibrary(appdir+"\\Plug\\"+str);
			if (hInstance)
			{
				fCreatePlugObj CreatePlugObj = (fCreatePlugObj)GetProcAddress(hInstance,"CreatePlugObj");
				if (CreatePlugObj)
				{
					CPlugMap* plugMap = new CPlugMap;

					plugMap->m_DllInstance = hInstance;
					BOOL ret =  CreatePlugObj((void**)&plugMap->m_PlugObj);
					m_PlugSet.AddTail(plugMap);			
				}
			}
		}
		while (FindNextFile(hFile,&fData))
		{		
			if (fData.dwFileAttributes !=FILE_ATTRIBUTE_DIRECTORY)
			{
				str =  fData.cFileName;
				goto a;
			}
		}
	}
	int PlugCount = m_PlugSet.GetCount();

	if (PlugCount>0)  //创建工具栏及工具栏按钮
	{	
		
		if (!IsWindow(m_PlugToolBar.m_hWnd))
			m_PlugToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		      | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY );

		UINT * ButtonArray = new UINT[PlugCount];
		for (int i = 0; i<PlugCount;i++)
		{
			ButtonArray[i] = MINPLUGCMD+i;

		}
		int btnCount =  m_PlugToolBar.GetToolBarCtrl().GetButtonCount();
		for (i = 0 ; i<btnCount; i++)
			m_PlugToolBar.GetToolBarCtrl().DeleteButton(i);

		m_PlugToolBar.SetButtons(ButtonArray,PlugCount);
		delete ButtonArray;		
		m_PlugToolBar.SetSizes(CSize(70,70),CSize(32,32));		
		//设置按钮文本
		POSITION pos = m_PlugSet.GetHeadPosition();
		int curIndex = 0;
		CPlugMap* pTemp = m_PlugSet.GetHead();

		while( pos != NULL)
		{
			pTemp = m_PlugSet.GetNext(pos);
			m_Images.Add(pTemp->m_PlugObj->GetIconRes());
			m_PlugToolBar.SetButtonText(curIndex,pTemp->m_PlugObj->GetCmdText());	
			curIndex++;
		}
		m_PlugToolBar.GetToolBarCtrl().SetButtonWidth(0,120);
		m_PlugToolBar.GetToolBarCtrl().SetImageList(&m_Images);	

		m_PlugToolBar.EnableDocking(CBRS_ALIGN_ANY);
		EnableDocking(CBRS_ALIGN_ANY);
		DockControlBar(&m_PlugToolBar);
		RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
	}
	m_Images.Detach();
}

BOOL CMainFrame::OnPlugEvent(UINT nID)
{
	int Pluts = m_PlugSet.GetCount();
	CPlugMap* pTempObj;
	POSITION pos = m_PlugSet.GetHeadPosition();
	
	int CurID = 0;
	if (pos != NULL)
	{
		pTempObj = m_PlugSet.GetAt(pos);
		if (nID-MINPLUGCMD ==CurID)
		{
			pTempObj->m_PlugObj->PlugDone();
			return TRUE;
		}
	}
	while (pos !=NULL)
	{
		pTempObj = m_PlugSet.GetNext(pos);
		CurID++;
		pTempObj = m_PlugSet.GetAt(pos);
		if (nID-MINPLUGCMD ==CurID)
		{
			pTempObj->m_PlugObj->PlugDone();
			return TRUE;
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

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