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