📄 magichouseview.cpp
字号:
break;
case ST_FIXSCREEN: // 适合大小模式
// 按适合宽度模式处理
width = (REAL)winRect.Width();
c = width / image.GetWidth();
// 如果没有超界
if (c * image.GetHeight() < winRect.Height())
height = c * image.GetHeight();
// 超界则采用适合高度模式
else
{
height = (REAL)winRect.Height();
c = height / image.GetHeight();
width = c * image.GetWidth();
}
break;
}
return CSize((int)width, (int)height);
}
/******************************************************************************
* 作用: 鼠标按下的响应函数
******************************************************************************/
void CMagicHouseView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_psMove = point;
CView::OnLButtonDown(nFlags, point);
}
/******************************************************************************
* 作用: 修正图像的偏移坐标等信息
* 备注: 以显示模式为依据
******************************************************************************/
void CMagicHouseView::FixOffset()
{
if (m_nPos < 0 || m_nPos >= m_nPicNum)
return;
Image image(GetFilePath(m_nPos));
if ( image.GetLastStatus() != Ok )
return;
m_bHeightOut = false;
m_bWidhtOut = false;
CSize imgSize = GetShowPicSize(image, m_nShowType);
CRect rect;
GetClientRect(rect);
switch (m_nShowType)
{
case ST_NORMAL:
if (imgSize.cx > rect.Width())
{
m_nXXMax = imgSize.cx - rect.Width();
m_bWidhtOut = true;
}
if (imgSize.cy > rect.Height())
{
m_nYYMax = imgSize.cy - rect.Height();
m_bHeightOut = true;
}
break;
case ST_FIXWIDTH:
if (imgSize.cy > rect.Height())
{
m_nYYMax = imgSize.cy - rect.Height();
m_bHeightOut = true;
}
break;
case ST_FIXHEIGHT:
if (imgSize.cx > rect.Width())
{
m_nXXMax = imgSize.cx - rect.Width();
m_bWidhtOut = true;
}
break;
case ST_FIXSCREEN:
default:;
}
}
/******************************************************************************
* 作用: 鼠标移动的响应函数
* 备注: 如果图像为拖动状态,则自动修正图像的偏移坐标
******************************************************************************/
void CMagicHouseView::OnMouseMove(UINT nFlags, CPoint point)
{
if (nFlags & MK_LBUTTON)
{
if (m_bWidhtOut)
{
m_nXX += point.x - m_psMove.x;
if (m_nXX < 0 && abs(m_nXX) > m_nXXMax)
m_nXX = -m_nXXMax;
if (m_nXX > 0)
m_nXX = 0;
}
if (m_bHeightOut)
{
m_nYY += point.y - m_psMove.y;
if (m_nYY < 0 && abs(m_nYY) > m_nYYMax)
m_nYY = -m_nYYMax;
if (m_nYY > 0)
m_nYY = 0;
}
m_psMove = point;
Invalidate();
}
CView::OnMouseMove(nFlags, point);
}
/******************************************************************************
* 作用: 根据情况改变鼠标光标
******************************************************************************/
BOOL CMagicHouseView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (m_bHeightOut || m_bWidhtOut)
{
SetCursor(::LoadCursor(NULL, IDC_SIZEALL));
return TRUE;
}
else
return CView::OnSetCursor(pWnd, nHitTest, message);
}
/******************************************************************************
* 作用: 在内存中预先绘制图像
******************************************************************************/
void CMagicHouseView::PreDrawImage(void)
{
Image image(GetFilePath(m_nPos));
::delete m_pBitmap;
m_pBitmap = ::new Bitmap(image.GetWidth(), image.GetHeight(), PixelFormat32bppARGB);
Graphics* graph = Graphics::FromImage(m_pBitmap);
graph->DrawImage(&image, 0, 0, image.GetWidth(), image.GetHeight());
SAFE_DELETE (graph);
}
/******************************************************************************
* 作用: 更新状态栏的指示器信息
******************************************************************************/
void CMagicHouseView::RefreshIndicator()
{
CMainFrame* pMain = (CMainFrame*)AfxGetMainWnd();
CString strTemp;
strTemp.Format(L"%d/%d", m_nPos + 1, m_nPicNum);
pMain->UpdateIndicator(ID_INDICATOR_PICNUM, strTemp);
pMain->UpdateIndicator(ID_INDICATOR_PICNAME, m_FilesNameAry[m_nPos]);
}
/******************************************************************************
* 作用: 使用特效显示图像
* 参数:
* pDC 目标设备上下文
* pMemDC 内存设备上下文
* 备注: 将内存设备上下文中已经绘制的图像以特效形式显示在目标设备上下文中
******************************************************************************/
void CMagicHouseView::EffectDisplayImage(CDC* pDC, CDC* pMemDC)
{
int nType = m_nEffectDisplayType;
if (nType == EDT_RAND)
{
LARGE_INTEGER seed;
QueryPerformanceFrequency(&seed);
QueryPerformanceCounter(&seed);
//初始化一个以微秒为单位的时间种子
srand((int)seed.QuadPart);
nType = rand() % 10;
}
switch (nType)
{
case EDT_SCANDOWN:
EffectDisplay::ScanDownDisplay(pDC, pMemDC);
break;
case EDT_VSCAN:
EffectDisplay::VSScanDisplay(pDC, pMemDC);
break;
case EDT_MOVERIGHT:
EffectDisplay::MoveRightDisplay(pDC, pMemDC);
break;
case EDT_HSMOVE:
EffectDisplay::HSMoveDisplay(pDC, pMemDC);
break;
case EDT_VBLIND:
EffectDisplay::VBlindDisplay(pDC, pMemDC);
break;
case EDT_HBLIND:
EffectDisplay::HBlindDisplay(pDC, pMemDC);
break;
case EDT_VRASTER:
EffectDisplay::VRasterDisplay(pDC, pMemDC);
break;
case EDT_HRASTER:
EffectDisplay::HRasterDisplay(pDC, pMemDC);
break;
case EDT_MOSAIC:
EffectDisplay::MosaicDisplay(pDC, pMemDC);
break;
default:
EffectDisplay::RaindropDisplay(pDC, pMemDC);
}
}
void CMagicHouseView::OnModeNormal()
{
if (m_nShowType != ST_NORMAL)
{
m_nShowType = ST_NORMAL;
FixOffset();
Invalidate();
}
}
void CMagicHouseView::OnModeWidth()
{
if (m_nShowType != ST_FIXWIDTH)
{
m_nShowType = ST_FIXWIDTH;
FixOffset();
Invalidate();
}
}
void CMagicHouseView::OnModeHeight()
{
if (m_nShowType != ST_FIXHEIGHT)
{
m_nShowType = ST_FIXHEIGHT;
FixOffset();
Invalidate();
}
}
void CMagicHouseView::OnModeScreen()
{
if (m_nShowType != ST_FIXSCREEN)
{
m_nShowType = ST_FIXSCREEN;
FixOffset();
Invalidate();
}
}
void CMagicHouseView::OnUpdateModeNormal(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nShowType == ST_NORMAL);
}
void CMagicHouseView::OnUpdateModeWidth(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nShowType == ST_FIXWIDTH);
}
void CMagicHouseView::OnUpdateModeHeight(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nShowType == ST_FIXHEIGHT);
}
void CMagicHouseView::OnUpdateModeScreen(CCmdUI *pCmdUI)
{
pCmdUI->SetCheck(m_nShowType == ST_FIXSCREEN);
}
void CMagicHouseView::OnImagePrev()
{
if (m_nPos <= 0)
return;
m_nPos--;
PreDrawImage();
ClearOffset();
FixOffset();
RefreshIndicator();
m_bEffectDraw = true;
Invalidate();
}
void CMagicHouseView::OnImageNext()
{
if (m_nPos >= m_nPicNum - 1)
return;
m_nPos++;
PreDrawImage();
ClearOffset();
FixOffset();
RefreshIndicator();
m_bEffectDraw = true;
Invalidate();
}
void CMagicHouseView::OnImageFirst()
{
m_nPos = 0;
PreDrawImage();
ClearOffset();
FixOffset();
RefreshIndicator();
m_bEffectDraw = true;
Invalidate();
}
void CMagicHouseView::OnImageLast()
{
m_nPos = m_nPicNum - 1;
PreDrawImage();
ClearOffset();
FixOffset();
RefreshIndicator();
m_bEffectDraw = true;
Invalidate();
}
void CMagicHouseView::OnUpdateImagePrev(CCmdUI *pCmdUI)
{
if (m_nPos <= 0 || m_bIsEditMode)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CMagicHouseView::OnUpdateImageNext(CCmdUI *pCmdUI)
{
if ((m_nPos < 0) || m_nPos >= m_nPicNum - 1 || m_bIsEditMode)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CMagicHouseView::OnUpdateImageFirst(CCmdUI *pCmdUI)
{
if (m_nPos < 0 || m_bIsEditMode)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CMagicHouseView::OnUpdateImageLast(CCmdUI *pCmdUI)
{
if (m_nPos < 0 || m_bIsEditMode)
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
void CMagicHouseView::OnEffectNone()
{
m_nEffectDisplayType = EDT_NONE;
}
void CMagicHouseView::OnEffectRand()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -