华罗庚和丘成桐: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();

复杂。。。