📄 mainfrm.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 + -