我的画连续直线程序总闪烁,图像放大不能实现开窗放大,请问大家有没有好的解决方法? 画线原理是onmousemove()函数判断一移动,就画点!放大之后要求能继续修改原图(增删改原图像上的像素) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 else if((m_flag==5)&&PushNumb==1) //如果是增加线操作,并且已经按下鼠标开始拖动 { if(point!=m_PointOld) //如果鼠标移动点与上一个移动点不同 { //获取文档 CCh1_1Doc* pDoc=GetDocument(); //指向DIB的指针 LPSTR lpDIB; //指向DIB像素指针 LPSTR lpDIBBits; //锁定DIB lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHDIB()); //找到DIB图像像素起始位置 lpDIBBits=::FindDIBBits(lpDIB); //判断是否是8-bpp位图 //(为了方便,只处理8-bpp位图,其他的可类推) if(::DIBNumColors(lpDIB)!=256) { //提示用户 MessageBox("目前只支持反色","系统提示", MB_ICONINFORMATION|MB_OK); //解除锁定 ::GlobalUnlock((HGLOBAL)pDoc->GetHDIB()); //返回 return; } //更改光标形状 BeginWaitCursor(); //调用AddPixel()函数 ::AddPixel(lpDIBBits,point,::DIBWidth(lpDIB),::DIBHeight(lpDIB),1,m_xstart,m_ystart); //设置脏标记 pDoc->SetModifiedFlag(TRUE); //更新视图 pDoc->UpdateAllViews(NULL); //解除锁定 ::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //恢复光标 EndWaitCursor(); } } 我自己的放大函数,不能实现开窗放大,只能左上角放大!HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio, float x,float y){ // 源图像的宽度和高度 LONG lWidth; LONG lHeight; // 缩放后图像的宽度和高度 LONG lNewWidth; LONG lNewHeight; // 缩放后图像的宽度(lNewWidth',必须是4的倍数) LONG lNewLineBytes; // 指向源图像的指针 LPSTR lpDIBBits; // 指向源象素的指针 LPSTR lpSrc; // 缩放后新DIB句柄 HDIB hDIB; // 指向缩放图像对应象素的指针 LPSTR lpDst; // 指向缩放图像的指针 LPSTR lpNewDIB; LPSTR lpNewDIBBits; // 指向BITMAPINFO结构的指针(Win3.0) LPBITMAPINFOHEADER lpbmi; // 指向BITMAPCOREINFO结构的指针 LPBITMAPCOREHEADER lpbmc; // 循环变量(象素在新DIB中的坐标) LONG i; LONG j; // 象素在源DIB中的坐标 LONG i0; LONG j0; // 图像每行的字节数 LONG lLineBytes; // 找到源DIB图像象素起始位置 lpDIBBits = ::FindDIBBits(lpDIB); // 获取图像的宽度 lWidth = ::DIBWidth(lpDIB); // 计算图像每行的字节数 lLineBytes = WIDTHBYTES(lWidth * 8); // 获取图像的高度 lHeight = ::DIBHeight(lpDIB); // 计算缩放后的图像实际宽度 // 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分 lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5); // 计算新图像每行的字节数 lNewLineBytes = WIDTHBYTES(lNewWidth * 8); // 计算缩放后的图像高度 lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5); // 分配内存,以保存新DIB hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 判断是否内存分配失败 if (hDIB == NULL) { // 分配内存失败 return NULL; } // 锁定内存 lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB); // 复制DIB信息头和调色板 memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); // 找到新DIB象素起始位置 lpNewDIBBits = ::FindDIBBits(lpNewDIB); // 获取指针 lpbmi = (LPBITMAPINFOHEADER)lpNewDIB; lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; // 更新DIB中图像的高度和宽度 if (IS_WIN30_DIB(lpNewDIB)) { // 对于Windows 3.0 DIB lpbmi->biWidth = lNewWidth; lpbmi->biHeight = lNewHeight; } else { // 对于其它格式的DIB lpbmc->bcWidth = (unsigned short) lNewWidth; lpbmc->bcHeight = (unsigned short) lNewHeight; } // 针对图像每行进行操作 for(i = 0; i < lNewHeight; i++) { // 针对图像每列进行操作 for(j = 0; j < lNewWidth; j++) { // 指向新DIB第i行,第j个象素的指针 // 注意此处宽度和高度是新DIB的宽度和高度 lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j; // 计算该象素在源DIB中的坐标 i0 = (LONG) (i / fYZoomRatio + 0.5); j0 = (LONG) (j / fXZoomRatio + 0.5); // 判断是否在源图范围内 if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)) { // 指向源DIB第i0行,第j0个象素的指针 lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; // 复制象素 *lpDst = *lpSrc; } else { // 对于源图中没有的象素,直接赋值为255 * ((unsigned char*)lpDst) = 255; } } } // 返回 return hDIB;} 晕呵,窗口再怎么大,也不能大过屏幕吧?(大过屏幕的窗口有意义吗?)2,图像放大有窗口放大有联系吗?窗口放大需要你自己来实现!(MoveWindoa或SetWindowPos都行)3,闪烁是没有用双缓冲。另外不要在mousemove用UpdateAllViews之类刷视图的函数,铁闪!效率也不好。正确的做法:自己得DC自己画,自得要双缓! 有media player classic activex 控件吗 创建弹出式菜单 请大仙指点一下这三个容易混淆的定义 希望前辈给我的毕业设计一点建议 在线揭贴---等待ing 怎样把jpeg或bmp图片设置成桌面背景并立即生效? 求《Visual C++图形用户界面开发指南》随书代码 关于屏蔽网卡的问题 Help!About Codec 自定义消息问题: 请问:关于postmessage [改错] 这段代码我改了好多次还是错误,狂郁闷
//如果是增加线操作,并且已经按下鼠标开始拖动
{
if(point!=m_PointOld) //如果鼠标移动点与上一个移动点不同
{
//获取文档
CCh1_1Doc* pDoc=GetDocument(); //指向DIB的指针
LPSTR lpDIB; //指向DIB像素指针
LPSTR lpDIBBits; //锁定DIB
lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)pDoc->GetHDIB()); //找到DIB图像像素起始位置
lpDIBBits=::FindDIBBits(lpDIB); //判断是否是8-bpp位图
//(为了方便,只处理8-bpp位图,其他的可类推)
if(::DIBNumColors(lpDIB)!=256)
{
//提示用户
MessageBox("目前只支持反色","系统提示",
MB_ICONINFORMATION|MB_OK); //解除锁定
::GlobalUnlock((HGLOBAL)pDoc->GetHDIB()); //返回
return;
} //更改光标形状
BeginWaitCursor(); //调用AddPixel()函数
::AddPixel(lpDIBBits,point,::DIBWidth(lpDIB),::DIBHeight(lpDIB),1,m_xstart,m_ystart); //设置脏标记
pDoc->SetModifiedFlag(TRUE); //更新视图
pDoc->UpdateAllViews(NULL);
//解除锁定
::GlobalUnlock((HGLOBAL) pDoc->GetHDIB()); //恢复光标
EndWaitCursor(); }
}
HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB, float fXZoomRatio, float fYZoomRatio, float x,float y)
{
// 源图像的宽度和高度
LONG lWidth;
LONG lHeight;
// 缩放后图像的宽度和高度
LONG lNewWidth;
LONG lNewHeight;
// 缩放后图像的宽度(lNewWidth',必须是4的倍数)
LONG lNewLineBytes;
// 指向源图像的指针
LPSTR lpDIBBits;
// 指向源象素的指针
LPSTR lpSrc;
// 缩放后新DIB句柄
HDIB hDIB;
// 指向缩放图像对应象素的指针
LPSTR lpDst;
// 指向缩放图像的指针
LPSTR lpNewDIB;
LPSTR lpNewDIBBits;
// 指向BITMAPINFO结构的指针(Win3.0)
LPBITMAPINFOHEADER lpbmi;
// 指向BITMAPCOREINFO结构的指针
LPBITMAPCOREHEADER lpbmc;
// 循环变量(象素在新DIB中的坐标)
LONG i;
LONG j;
// 象素在源DIB中的坐标
LONG i0;
LONG j0;
// 图像每行的字节数
LONG lLineBytes;
// 找到源DIB图像象素起始位置
lpDIBBits = ::FindDIBBits(lpDIB);
// 获取图像的宽度
lWidth = ::DIBWidth(lpDIB);
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 获取图像的高度
lHeight = ::DIBHeight(lpDIB);
// 计算缩放后的图像实际宽度
// 此处直接加0.5是由于强制类型转换时不四舍五入,而是直接截去小数部分
lNewWidth = (LONG) (::DIBWidth(lpDIB) * fXZoomRatio + 0.5);
// 计算新图像每行的字节数
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
// 计算缩放后的图像高度
lNewHeight = (LONG) (lHeight * fYZoomRatio + 0.5);
// 分配内存,以保存新DIB
hDIB = (HDIB) ::GlobalAlloc(GHND, lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
// 判断是否内存分配失败
if (hDIB == NULL)
{
// 分配内存失败
return NULL;
}
// 锁定内存
lpNewDIB = (char * )::GlobalLock((HGLOBAL) hDIB);
// 复制DIB信息头和调色板
memcpy(lpNewDIB, lpDIB, *(LPDWORD)lpDIB + ::PaletteSize(lpDIB));
// 找到新DIB象素起始位置
lpNewDIBBits = ::FindDIBBits(lpNewDIB);
// 获取指针
lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
lpbmc = (LPBITMAPCOREHEADER)lpNewDIB;
// 更新DIB中图像的高度和宽度
if (IS_WIN30_DIB(lpNewDIB))
{
// 对于Windows 3.0 DIB
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
}
else
{
// 对于其它格式的DIB
lpbmc->bcWidth = (unsigned short) lNewWidth;
lpbmc->bcHeight = (unsigned short) lNewHeight;
}
// 针对图像每行进行操作
for(i = 0; i < lNewHeight; i++)
{
// 针对图像每列进行操作
for(j = 0; j < lNewWidth; j++)
{
// 指向新DIB第i行,第j个象素的指针
// 注意此处宽度和高度是新DIB的宽度和高度
lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j;
// 计算该象素在源DIB中的坐标
i0 = (LONG) (i / fYZoomRatio + 0.5);
j0 = (LONG) (j / fXZoomRatio + 0.5);
// 判断是否在源图范围内
if( (j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
// 指向源DIB第i0行,第j0个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;
// 复制象素
*lpDst = *lpSrc;
}
else
{
// 对于源图中没有的象素,直接赋值为255
* ((unsigned char*)lpDst) = 255;
}
}
}
// 返回
return hDIB;
}