📄 jpegview.cpp
字号:
// JPEGView.cpp : implementation of the CJPEGView class
//
#include "stdafx.h"
#include "JPEG.h"
#include "JPEGDoc.h"
#include "JPEGView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CJPEGView
IMPLEMENT_DYNCREATE(CJPEGView, CScrollView)
BEGIN_MESSAGE_MAP(CJPEGView, CScrollView)
//{{AFX_MSG_MAP(CJPEGView)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_IJPEG, OnIjpeg)
ON_UPDATE_COMMAND_UI(ID_IJPEG, OnUpdateIjpeg)
ON_WM_KEYDOWN()
ON_COMMAND(ID_JPEG, OnJpeg)
ON_UPDATE_COMMAND_UI(ID_JPEG, OnUpdateJpeg)
ON_COMMAND(ID_Invert, OnInvert)
ON_COMMAND(ID_Invert_Zhe, OnInvertZhe)
ON_UPDATE_COMMAND_UI(ID_Invert, OnUpdateInvert)
ON_UPDATE_COMMAND_UI(ID_Invert_Zhe, OnUpdateInvertZhe)
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CJPEGView construction/destruction
CJPEGView::CJPEGView()
{
// TODO: add construction code here
}
CJPEGView::~CJPEGView()
{
}
BOOL CJPEGView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CJPEGView drawing
void CJPEGView::OnDraw(CDC* pDC)
{
CJPEGDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect rc;
GetClientRect(rc);
int x,y;
if(rc.right>m_Dib.width)
x=rc.right/2-m_Dib.width/2; //显示图象居中
else
x=0;
if(rc.bottom>m_Dib.height)
y=rc.bottom/2-m_Dib.height/2;
else
y=0;
if(m_Dib.m_bit24)
m_Dib.Show(pDC,x,y); //用show()显示24色图象
else
{
m_Dib.SetPalette(pDC);
m_Dib.Draw(pDC,x,y); //用Draw()函数显示非24色图象(如灰度图,256色图)
}
// TRACE("中华人民共和国!!!");
///////////////////////////////////////////
// int data2=100;
// CString st;
// pDC->SetTextAlign(TA_LEFT);
// pDC->SetBkColor(RGB(0,0,0));
// pDC->SetTextColor(RGB(255,0,255));
// st.Format("data1=%d",data1);
// pDC->TextOut(10,20,st);
// for(int i=0;i<10;i++)
// {
// st.Format("data%d=%d",i,data2+i);
// pDC->TextOut(10+i*80,40,st);
// }
////////////////////////////////////////////
}
void CJPEGView::OnInitialUpdate()
{
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = m_Dib.width; // 设置工作区域的最大宽度。
sizeTotal.cy = m_Dib.height; // 设置工作区域的最大高度。
// TRACE("\nx=%d,y=%d\n\n",sizeTotal.cx,sizeTotal.cy);
SetScrollSizes(MM_TEXT, sizeTotal); //动态调整滚动条。
//CWnd::SetScrollRange(SB_HORZ,0,1024,TRUE);
//CSize sizeTotal(30000, 40000); // 30-by-40 cm
//CSize sizeLine = CSize(sizeTotal.cx / 100, sizeTotal.cy / 100);
//SetScrollSizes(MM_HIMETRIC, sizeTotal, sizeTotal, sizeLine);
CScrollView::OnInitialUpdate();
}
/////////////////////////////////////////////////////////////////////////////
// CJPEGView printing
BOOL CJPEGView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CJPEGView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CJPEGView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CJPEGView diagnostics
#ifdef _DEBUG
void CJPEGView::AssertValid() const
{
CScrollView::AssertValid();
}
void CJPEGView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CJPEGDoc* CJPEGView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJPEGDoc)));
return (CJPEGDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CJPEGView message handlers
void CJPEGView::OnFileOpen()
{
// TODO: Add your command handler code here
static char szFilter[]="BMP Files(*.BMP)|*.BMP||";
CFileDialog FileDlg(TRUE, //此处为TRUE时表示是一个打开文件的对话框
NULL,NULL,OFN_HIDEREADONLY,szFilter);
if(FileDlg.DoModal()==IDOK&&m_Dib.Load(FileDlg.GetPathName()))
{
InvalidateRect(NULL,TRUE);
UpdateWindow();
CStatusBar * pStatus=
(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
char tbuf[45];
CString colornum;
if(m_Dib.m_pBIH->biBitCount==24)
{
colornum="24b";
}
else if(m_Dib.m_pBIH->biBitCount==8)
{
colornum="256";
}
else if(m_Dib.m_pBIH->biBitCount==4)
{
colornum="16";
}
else
{
colornum="2";
}
sprintf(tbuf,"%d×%d×%s BMP %ld Byte",m_Dib.width,m_Dib.height,colornum,m_Dib.BmpFileLength);
pStatus->SetPaneText(2,tbuf);
pStatus->SetPaneText(1,FileDlg.GetFileName());
}
}
OnInitialUpdate(); //更新滚动条的滚动范围
}
void CJPEGView::OnFileSaveAs()
{
// TODO: Add your command handler code here
static char szFilter[]="BMP Files(*.BMP)|*.BMP||";
CFileDialog FileSaveAs(FALSE, //此处为FALSE时表示是一个另存为的对话框
"bmp",NULL,OFN_OVERWRITEPROMPT,szFilter); //此处的第二个参数是附加默认的扩展名为.bmp,为NULL时表明不附加扩展名
if(FileSaveAs.DoModal()==IDOK&&m_Dib.Save(FileSaveAs.GetPathName()))
{
InvalidateRect(NULL,TRUE);
UpdateWindow();
CStatusBar * pStatus=
(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
pStatus->SetPaneText(1,FileSaveAs.GetFileName());
}
}
}
BOOL CJPEGView::OnJpeg()
{
// TODO: Add your command handler code here
if(m_Dib.width>1600||m_Dib.height>1600)
{
AfxMessageBox("本软件目前只能对小于等于1600*1600的BMP图像进行压缩!!!");
return FALSE;
}
static char szFilter[]="JPEG Files(*.jpg)|*.jpg||";
CFileDialog FileSaveAs(FALSE, //此处为FALSE时表示是一个另存为的对话框
"jpg",NULL,OFN_OVERWRITEPROMPT,szFilter); //此处的第二个参数是附加默认的扩展名为.jpg,为NULL时表明不附加扩展名
if(FileSaveAs.DoModal()==IDOK&&m_Dib.SaveJpeg(FileSaveAs.GetPathName()))
{
InvalidateRect(NULL,TRUE);
UpdateWindow();
CStatusBar * pStatus=
(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
char tbuf[45];
int colornum;
if(m_Dib.m_pBIH->biBitCount==24)
colornum=24;
else
colornum=(int)pow(2,m_Dib.m_pBIH->biBitCount);
sprintf(tbuf,"%d×%d×%d JPG 大小待计算",m_Dib.width,m_Dib.height,colornum);
pStatus->SetPaneText(2,tbuf);
pStatus->SetPaneText(1,FileSaveAs.GetFileName());
}
}
////////////////////////////////////
return TRUE;
}
void CJPEGView::OnUpdateJpeg(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
BOOL loadfile;
if((m_Dib.m_bit24==1||m_Dib.m_bit24==0)&&m_Dib.m_pDib!=NULL)
loadfile=TRUE;
else
loadfile=FALSE;
pCmdUI->Enable(loadfile);
}
//////////////////////////////
//// 由JPEG变为BMP文件 ////
//////////////////////////////
void CJPEGView::OnIjpeg()
{
// TODO: Add your command handler code here
}
void CJPEGView::OnUpdateIjpeg(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(FALSE);
}
////////////本函数实现用键盘进行滚动条的操作//////////////
void CJPEGView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_HOME:
OnVScroll(SB_TOP,0,NULL);
OnHScroll(SB_LEFT,0,NULL);
break;
case VK_END:
OnVScroll(SB_BOTTOM,0,NULL);
OnHScroll(SB_RIGHT,0,NULL);
break;
case VK_UP:
OnVScroll(SB_LINEUP,0,NULL);
break;
case VK_DOWN:
OnVScroll(SB_LINEDOWN,0,NULL);
break;
case VK_PRIOR:
OnVScroll(SB_PAGEUP,0,NULL);
break;
case VK_NEXT:
OnVScroll(SB_PAGEDOWN,0,NULL);
break;
case VK_LEFT:
OnHScroll(SB_LINELEFT,0,NULL);
break;
case VK_RIGHT:
OnHScroll(SB_LINERIGHT,0,NULL);
break;
default:
break;
}
}
void CJPEGView::OnInvert()
{
// TODO: Add your command handler code here
m_Dib.ShangInvert();
Invalidate();
}
void CJPEGView::OnInvertZhe()
{
// TODO: Add your command handler code here
m_Dib.ZheInvert();
Invalidate();
}
void CJPEGView::OnUpdateInvert(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Dib.m_bit24);
}
void CJPEGView::OnUpdateInvertZhe(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_Dib.m_bit24);
}
void CJPEGView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
// TODO: Add your specialized code here and/or call the base class
}
//在状态栏显示鼠标的座标
void CJPEGView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CStatusBar * pStatus=
(CStatusBar *)AfxGetApp()->m_pMainWnd->GetDescendantWindow(ID_VIEW_STATUS_BAR);
if(pStatus)
{
char tbuf[40];
sprintf(tbuf,"(%3d,%3d)",point.x,point.y);
pStatus->SetPaneText(4,tbuf);
}
CScrollView::OnMouseMove(nFlags, point);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -