📄 geotransview.cpp
字号:
void CGeoTransView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
{
CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView);
if (bActivate)
{
ASSERT(pActivateView == this);
OnDoRealize((WPARAM)m_hWnd, 0); // same as SendMessage(WM_DOREALIZE);
}
}
void CGeoTransView::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
{
CScrollView::OnInitialUpdate();
ASSERT(GetDocument() != NULL);
SetScrollSizes(MM_TEXT, GetDocument()->GetDocSize());
}
void CGeoTransView::OnGeomRota()
{
// 图像旋转
CGeoTransDoc* pDoc = GetDocument();
int iRotateAngle; // 缩放比率
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的旋转!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
CGeoRotaDlg dlgPara;
dlgPara.m_iRotateAngle = 90;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
return;
}
iRotateAngle = dlgPara.m_iRotateAngle;
delete dlgPara;
HDIB hNewDIB = NULL;
BeginWaitCursor();
hNewDIB = (HDIB) pDoc->GetDibImage()->RotateDIB(lpDIB, iRotateAngle);
if (hNewDIB != NULL)
{
pDoc->ReplaceHDIB(hNewDIB); // 替换DIB,同时释放旧DIB对象
pDoc->InitDIBData(); // 更新DIB大小和调色板
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CGeoTransView::OnGeomMirh()
{
// 水平镜像
CGeoTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的水平镜像,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的水平镜像!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用MirrorDIB()函数水平镜像DIB
if(pDoc->GetDibImage()->MirrorDIB(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB), TRUE))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CGeoTransView::OnGeomMirv()
{
// 垂直镜像
CGeoTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的垂直镜像,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的垂直镜像!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用MirrorDIB()函数垂直镜像DIB
if(pDoc->GetDibImage()->MirrorDIB(lpDIBBits,pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB), FALSE))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CGeoTransView::OnGeomTran()
{
// 平移位图
CGeoTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
LPSTR lpDIBBits; // 指向DIB象素指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的平移!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
LONG lXOffset;
LONG lYOffset;
CGeoTransDlg dlgPara;
dlgPara.m_XOffset = 100;
dlgPara.m_YOffset = 100;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
return;
}
lXOffset = dlgPara.m_XOffset;
lYOffset = dlgPara.m_YOffset;
delete dlgPara;
BeginWaitCursor();
// 找到DIB图像象素起始位置
lpDIBBits = pDoc->GetDibImage()->FindDIBBits(lpDIB);
// 调用TranslationDIB()函数平移DIB
if (pDoc->GetDibImage()->TranslationDIB1(lpDIBBits,
pDoc->GetDibImage()->DIBWidth(lpDIB),
pDoc->GetDibImage()->DIBHeight(lpDIB), lXOffset, lYOffset))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CGeoTransView::OnGeomTrpo()
{
// 图像转置
CGeoTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的转置,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的转置!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
BeginWaitCursor();
if (pDoc->GetDibImage()->TransposeDIB(lpDIB))
{
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
pDoc->InitDIBData(); // 更新DIB大小和调色板
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
void CGeoTransView::OnGeomZoom()
{
// 图像缩放
CGeoTransDoc* pDoc = GetDocument();
LPSTR lpDIB; // 指向DIB的指针
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推)
if (pDoc->GetDibImage()->DIBNumColors(lpDIB) != 256)
{
MessageBox("目前只支持256色位图的缩放!", "系统提示" ,
MB_ICONINFORMATION | MB_OK);
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
return;
}
float fXZoomRatio;
float fYZoomRatio;
CGeoZoomDlg dlgPara;
dlgPara.m_XZoom = 0.5;
dlgPara.m_YZoom = 0.5;
// 显示对话框,提示用户设定平移量
if (dlgPara.DoModal() != IDOK)
{
return;
}
fXZoomRatio = dlgPara.m_XZoom;
fYZoomRatio = dlgPara.m_YZoom;
delete dlgPara;
HDIB hNewDIB = NULL;
BeginWaitCursor();
hNewDIB = (HDIB) pDoc->GetDibImage()->ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio);
if (hNewDIB != NULL)
{
pDoc->ReplaceHDIB(hNewDIB); // 替换DIB,同时释放旧DIB对象
pDoc->InitDIBData(); // 更新DIB大小和调色板
pDoc->SetModifiedFlag(TRUE); // 设置脏标记
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());// 重新设置滚动视图大小
pDoc->UpdateAllViews(NULL); // 更新视图
}
else
{
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
EndWaitCursor();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -