⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 看图软件
💻 CPP
字号:
// MainFrm.cpp : CMainFrame 类的实现
//

#include "stdafx.h"
#include "ScanViewer.h"

#include "MainFrm.h"
#include ".\mainfrm.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMainFrame

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullScreen)	
	ON_COMMAND(ID_SHOWTIME, OnShowtime)
	ON_COMMAND(ID_SHOWPATH, OnShowPath)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)	
	ON_COMMAND(ID_DIR_OPEN, OnDirOpen)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_SEPARATOR,           // 状态行指示器
	ID_INDICATOR_IMG,       // 图片状态行指示器                           //19:07 2007-12-22
	ID_INDICATOR_SMOD,      // 图片显示方式及快捷键                       //19:07 2007-12-22
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};


// CMainFrame 构造/析构

CMainFrame::CMainFrame()
{
	// TODO: 在此添加成员初始化代码
}

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;      // 未能创建
	}
	// TODO: 如果不需要工具栏可停靠,则删除这三行
	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
	EnableDocking(CBRS_ALIGN_ANY);
	DockControlBar(&m_wndToolBar);

	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式			
	cs.style &= ~(LONG) FWS_ADDTOTITLE;                    //去掉在主窗口标题上显示"Untitled"字样
	cs.dwExStyle |=(LONG)WS_EX_ACCEPTFILES;                //对拖放支持
	return TRUE;
}


// CMainFrame 诊断

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

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

#endif //_DEBUG


// CMainFrame 消息处理程序



//idcomcn2007
//22:51 2007-12-14
//全屏显示
void CMainFrame::OnViewFullScreen()
{
	// TODO: 在此添加命令处理程序代码
	if (this->GetActiveDocument()->GetPathName().IsEmpty()) return;

	CMenu* hMenu=AfxGetMainWnd()->GetMenu();

	//判断标题栏是否显示
	if (AfxGetApp()->m_pMainWnd->GetStyle()&WS_CAPTION)
	{
		//隐藏菜单		
		if ( hMenu != NULL ) AfxGetMainWnd()->SetMenu(NULL);	

		AfxGetApp()->m_pMainWnd->ModifyStyle(WS_THICKFRAME,NULL);                      //去掉粗框架
		AfxGetApp()->m_pMainWnd->ModifyStyle(WS_CAPTION,NULL);                         //去掉标题栏和边框
		AfxGetApp()->m_pMainWnd->ModifyStyle(WS_SYSMENU,NULL);                         //去掉系统菜单
		AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND,ID_VIEW_TOOLBAR,0);            //隐藏工具条
		AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND,ID_VIEW_STATUS_BAR,0);         //隐藏状态条
		
		
		CRect Windowrc,Clientrc,FullScreenrc;	
		GetWindowRect(&Windowrc);
		GetClientRect(&Clientrc);    
		//CString strT;
		//strT.Format("%u\t%u\n%u\t%u\n%u\t%u\n",Windowrc.Width(),Windowrc.Height(),Clientrc.Width(),Clientrc.Height(),GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
		//AfxMessageBox(strT);		
		
		FullScreenrc.SetRect(-(Windowrc.Width()-Clientrc.Width())/2,-(Windowrc.Height()-Clientrc.Height())/2,GetSystemMetrics(SM_CXSCREEN)+(Windowrc.Width()-Clientrc.Width())/2,GetSystemMetrics(SM_CYSCREEN)+(Windowrc.Height()-Clientrc.Height())/2);
		AfxGetApp()->m_pMainWnd->MoveWindow(FullScreenrc);                             //微调窗口位置					
		AfxGetMainWnd()->SetWindowPos(&this->wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);   //窗口置端
	}
	else
	{
		//显示菜单
		if ( hMenu == NULL )	
		{
			CMenu menu;
			menu.LoadMenu(IDR_MAINFRAME);
			AfxGetMainWnd()->SetMenu(&menu);
		}
        
		AfxGetApp()->m_pMainWnd->ModifyStyle(NULL,WS_THICKFRAME);                      //显示粗框架
		AfxGetApp()->m_pMainWnd->ModifyStyle(NULL,WS_CAPTION);                         //显示标题栏和边框
		AfxGetApp()->m_pMainWnd->ModifyStyle(NULL,WS_SYSMENU);                         //显示系统菜单
		AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND,ID_VIEW_TOOLBAR,0);            //显示工具条
		AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND,ID_VIEW_STATUS_BAR,0);         //显示状态条
        CRect rcWindow;                                                                //恢复窗口,并设置其占56%面积
		rcWindow.SetRect(GetSystemMetrics(SM_CXSCREEN)/8,GetSystemMetrics(SM_CYSCREEN)/8,GetSystemMetrics(SM_CXSCREEN)*3/4,GetSystemMetrics(SM_CYSCREEN)*3/4);
		AfxGetApp()->m_pMainWnd->MoveWindow(rcWindow);
		AfxGetMainWnd()->SetWindowPos(&this->wndNoTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);   //取消窗口置端
	}
}




//idcomcn2007
//13:46 2007-12-25
//显示当前时间
void CMainFrame::OnShowtime()
{
	// TODO: 在此添加命令处理程序代码
	CTime timeSy; 
	timeSy=CTime::GetCurrentTime();                            //得到当前时间 
	CString strTime=timeSy.Format("%Y-%m-%d %A %H:%M:%S");     //转换时间格式 
	//AfxMessageBox(strTime);

	CClientDC *pDC=new CClientDC(GetActiveView());
	pDC->TextOut(0,0,strTime);
	delete pDC;	
}


//idcomcn2008
//12:55 2008-2-11
//Show Path Name
void CMainFrame::OnShowPath()
{
	// TODO: 在此添加命令处理程序代码	
	CString strPath=this->GetActiveDocument()->GetPathName();
	if (strPath.IsEmpty()) return;
	//AfxMessageBox(strTime);

	CClientDC *pDC=new CClientDC(GetActiveView());
	pDC->TextOut(0,0,strPath);
	delete pDC;	
}






//	初始化文件夹设定用的回调函数
int CALLBACK _SHBrowseForFolderCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
	if(uMsg == BFFM_INITIALIZED)
	{
		///////////////////////////////////////////////////////////////////调节对话框大小//////////////////////////////////////////////////////////////////////////
		CRect rcGetDialogBegin,rcGetDialogAfter;
		::GetWindowRect(hwnd,rcGetDialogBegin);		
		MoveWindow(hwnd,(GetSystemMetrics(SM_CXSCREEN)-rcGetDialogBegin.Width())/2,GetSystemMetrics(SM_CYSCREEN)/4,rcGetDialogBegin.Width(),GetSystemMetrics(SM_CYSCREEN)/2,TRUE);	
		///////////////////////////////////////////////////////////////////调节对话框大小//////////////////////////////////////////////////////////////////////////

		///////////////////////////////////////////////////////////////////调节Button Control的位置//////////////////////////////////////////////////////////////////////////
		CRect rcStatic;	
		HWND hStatic = ::FindWindowEx(hwnd, NULL, "Static", NULL);                  //查找Static Control的窗口句柄	
		::GetWindowRect(hStatic,rcStatic);		
		::ScreenToClient(hwnd,&rcStatic.TopLeft());
		//得到第一个窗口
		HWND  hWndCtl = ::GetWindow (hwnd,GW_CHILD);
		while (hWndCtl != NULL)
		{		
			TCHAR szClassName[MAX_PATH];
			GetClassName(hWndCtl,szClassName,MAX_PATH);
			if (strcmp(szClassName,"Button")==0) 
			{		
				CRect rcBtn;
				::GetWindowRect(hWndCtl,rcBtn);
				::ScreenToClient(hwnd,&rcBtn.TopLeft());
				::SetWindowPos(hWndCtl,NULL,rcBtn.left,rcStatic.top,0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);				
			}
			//得到下一个控件
			hWndCtl = ::GetWindow(hWndCtl,GW_HWNDNEXT);
		}
		///////////////////////////////////////////////////////////////////调节Button Control的位置//////////////////////////////////////////////////////////////////////////

		///////////////////////////////////////////////////////////////////调节SysTreeView32 Control的大小//////////////////////////////////////////////////////////////////////////
		::GetWindowRect(hwnd,rcGetDialogAfter);	
		if (rcGetDialogAfter.Height()>rcGetDialogBegin.Height())
		{
			CRect rcTree;	
			HWND hTree = ::FindWindowEx(hwnd, NULL, "SysTreeView32", NULL);                  //查找SysTreeView32 Control的窗口句柄	
			::GetWindowRect(hTree,rcTree);		
			int iw=rcTree.Width(),ih=rcTree.Height();
			::ScreenToClient(hwnd,&rcTree.TopLeft());			
			::MoveWindow(hTree,rcTree.left,rcTree.top,iw,rcGetDialogAfter.Height()-GetSystemMetrics(SM_CYCAPTION)-rcTree.top-(rcGetDialogAfter.Width()-rcTree.left-iw),TRUE);						
		}
		///////////////////////////////////////////////////////////////////调节SysTreeView32 Control的大小//////////////////////////////////////////////////////////////////////////

		//以下两行可能把输入焦点移到SysTreeView32 Control
		keybd_event(VK_TAB ,0,0,0);
		keybd_event(VK_TAB ,0,KEYEVENTF_KEYUP,0);   

		::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);				
	}
		
	if(uMsg == BFFM_SELCHANGED)
	{
		TCHAR  szFolder[MAX_PATH];
		SHGetPathFromIDList((LPCITEMIDLIST)lParam,szFolder);		
		//::SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0,(LPARAM) szFolder);	
		HWND hEdit = FindWindowEx(hwnd, NULL, "Edit", NULL);                  //查找Edit Control的窗口句柄
		::SetWindowText(hEdit,szFolder);                                      //更新Edit Control的内容		
		
		//AfxMessageBox(strFolder);
	}
	if(uMsg ==BFFM_VALIDATEFAILED)
	{
		CString strT;
		strT.Format("您所指定的目录\n%s\n无效。请重新指定。",lParam);
		AfxMessageBox(strT);
		return 1;
	}
	return	0;
}



//idcomcn2008
//13:10 2008-2-15
//Open an existing document\nOpen
void CMainFrame::OnFileOpen()
{
	// TODO: 在此添加命令处理程序代码
	CString strFilter;
	CSimpleArray<GUID> aguidFileTypes;
	HRESULT hResult;
	// Finds image formats available for loading images.	
	hResult=CImage::GetImporterFilterString( strFilter, aguidFileTypes, _T( "All Image Files" ));
	if (FAILED(hResult)) 
	{
		AfxMessageBox("GetExporterFilter调用失败!");	
		return;
	}
	
	CFileDialog dlgFile(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter,NULL);     //TRUE为OPEN对话框,FALSE为SAVE AS对话框
	CString strDirPath;
	CScanViewerApp * pApp = (CScanViewerApp *)AfxGetApp();	
	pApp->GetFirstMRUDir(strDirPath);
	if (!strDirPath.IsEmpty())		dlgFile.m_pOFN->lpstrInitialDir=strDirPath;
	
	CString  FilePathName;
	if(dlgFile.DoModal()==IDOK)		FilePathName=dlgFile.GetPathName();	
	if (!FilePathName.IsEmpty())
		AfxGetApp()->OpenDocumentFile(FilePathName);
}



//idcomcn2007
//0:53 2007-12-12
//Open an existing folder\nOpen
void CMainFrame::OnDirOpen()
{
	// TODO: 在此添加命令处理程序代码	
	//retrieves the current directory for the current process.
	char path[MAX_PATH];
	GetCurrentDirectory(MAX_PATH,path);
	CString strInputFolder;
	strInputFolder.Format("%s",path);
	//MessageBox(strPath,"信息提示",MB_OK|MB_ICONINFORMATION);


	//获取“我最近访问的文档”的文件目录
	CString strMRUFolder;
	CScanViewerApp * pApp = (CScanViewerApp *)AfxGetApp();	
	pApp->GetFirstMRUDir(strMRUFolder);		
	if (!(this->GetActiveDocument()->GetPathName().IsEmpty())) 
	{
		strInputFolder=this->GetActiveDocument()->GetPathName();
		strInputFolder=strInputFolder.Left(strInputFolder.ReverseFind('\\'));
		if (strInputFolder.Right(1)!="\\")	strInputFolder+="\\";	
	}
	else {if (!strMRUFolder.IsEmpty()) strInputFolder=strMRUFolder;}


	//选择文件夹对话框
	CString strFinallyFolder;
	BROWSEINFO bi;
	memset(&bi,0,sizeof(BROWSEINFO));
	bi.hwndOwner=GetSafeHwnd();	
	TCHAR buf[MAX_PATH];
	bi.pszDisplayName=buf;
	bi.ulFlags=BIF_EDITBOX|BIF_VALIDATE;	
	//bi.lpszTitle="选择主题文件夹";
	bi.lpfn			= _SHBrowseForFolderCallbackProc;
	bi.lParam		= (LPARAM)strInputFolder.GetBuffer(0);	
	LPITEMIDLIST idl=SHBrowseForFolder(&bi);
	if (idl==NULL)  return;
	SHGetPathFromIDList(idl,strFinallyFolder.GetBuffer(MAX_PATH));
	strFinallyFolder.ReleaseBuffer();
	//释放资源
	LPMALLOC pShellMalloc=NULL;
	if (SUCCEEDED(::SHGetMalloc(&pShellMalloc)))
	{
		pShellMalloc->Free(idl);
		pShellMalloc->Release();
	}
	//MessageBox(strFolder,"信息提示",MB_OK|MB_ICONINFORMATION);

	//Verifies that a path is a valid directory. 
	if (!PathIsDirectory(strFinallyFolder))        
	{		
		CString strDir;	
		strDir.Format("您所指定的目录\n%s\n无效。请重新指定。",strFinallyFolder);
		AfxMessageBox(strDir,MB_OK,MB_ICONEXCLAMATION);	
		return ;
	}
	//MessageBox(strFolder,"信息提示",MB_OK|MB_ICONINFORMATION);

	//打开目录
	AfxGetApp()->OpenDocumentFile(strFinallyFolder);
}

⌨️ 快捷键说明

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