华罗庚和丘成桐:vc图形旋转?
来源:百度文库 编辑:杭州交通信息网 时间:2024/05/11 15:06:44
我用VC编了一个程序对图象做任意角度的旋转.但我编写的程序可以进行图象的旋转,但旋转的角度要大于1度,小于1度的不能进行旋转.
不知道怎么回事?请大虾指点
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
HDIB hDIB=pDoc->GetHDIB();
if (hDIB==NULL) return;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的旋转!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 缩放比率
double iRotateAngle;
// 创建对话框
CDlgGeoRota dlgPara;
// 初始化变量值
dlgPara.m_iRotateAngle=0;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
//iRotateAngle=dlgPara.m_iRotateAngle;
// 获取用户设定的平移量
iRotateAngle=360-dlgPara.m_iRotateAngle;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用RotateDIB()函数旋转DIB
hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle);
// 判断旋转是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
不知道怎么回事?请大虾指点
// 获取文档
CCh1_1Doc* pDoc = GetDocument();
// 指向DIB的指针
LPSTR lpDIB;
HDIB hDIB=pDoc->GetHDIB();
if (hDIB==NULL) return;
// 锁定DIB
lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHDIB());
// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推)
if (::DIBNumColors(lpDIB) != 256)
{
// 提示用户
MessageBox("目前只支持256色位图的旋转!", "系统提示" , MB_ICONINFORMATION | MB_OK);
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 返回
return;
}
// 缩放比率
double iRotateAngle;
// 创建对话框
CDlgGeoRota dlgPara;
// 初始化变量值
dlgPara.m_iRotateAngle=0;
// 显示对话框,提示用户设定旋转角度
if (dlgPara.DoModal() != IDOK)
{
// 返回
return;
}
// 获取用户设定的平移量
//iRotateAngle=dlgPara.m_iRotateAngle;
// 获取用户设定的平移量
iRotateAngle=360-dlgPara.m_iRotateAngle;
// 删除对话框
delete dlgPara;
// 创建新DIB
HDIB hNewDIB = NULL;
// 更改光标形状
BeginWaitCursor();
// 调用RotateDIB()函数旋转DIB
hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle);
// 判断旋转是否成功
if (hNewDIB != NULL)
{
// 替换DIB,同时释放旧DIB对象
pDoc->ReplaceHDIB(hNewDIB);
// 更新DIB大小和调色板
pDoc->InitDIBData();
// 设置脏标记
pDoc->SetModifiedFlag(TRUE);
// 重新设置滚动视图大小
SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
// 更新视图
pDoc->UpdateAllViews(NULL);
}
else
{
// 提示用户
MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK);
}
// 解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB());
// 恢复光标
EndWaitCursor();
复杂。。。