mfc 图片控件旋转问题,一次旋转90°

问题描述

mfc 图片控件旋转问题,一次旋转90°

mfc 图片控件旋转,这个可以旋转么?怎么写代码?求大神指导,菜鸟一个

解决方案

控件没有办法旋转,但是上面绘制的图形或者文字是可以得。

解决方案二:

第一步,你必须知道位图即BMP格式的文件的结构.

??????????????位图(bmp)文件由以下几个部分组成:

?????????????????????1.BITMAPFILEHEADER,它的定义如下:

?????????????????????????typedef?struct?tagBITMAPFILEHEADER?{?
????????????????????????????WORD????bfType;?????????//必须为BM
????????????????????????????DWORD???bfSize;?????????//文件大小
????????????????????????????WORD????bfReserved1;?//必须为0
????????????????????????????WORD????bfReserved2;?//必须为0
????????????????????????????DWORD???bfOffBits;????//从ITMAPFILEHEADER到存放bmp数据的偏移量???????????????????????????????????

?????????????????????????}?BITMAPFILEHEADER,?*PBITMAPFILEHEADER;?

???????????????????2.BITMAPINFOHEADER,它的定义如下:

???????????????????????typedef?struct?tagBITMAPINFOHEADER{
???????????????????????????????????DWORD??biSize;??//此结构的大小,可用sizeof(BITMAPINFOHEAER)得到
???????????????????????????????????LONG???biWidth;?//位图宽度,以象素为单位
???????????????????????????????????LONG???biHeight;?//位图高度,以象素为单位
???????????????????????????????????WORD???biPlanes;?//必须为1
???????????????????????????????????WORD???biBitCount;//位图象素位数,可为0,1,4,8,24,32?
???????????????????????????????????DWORD??biCompression;?
???????????????????????????????????DWORD??biSizeImage;?//(仅用于压缩)
???????????????????????????????????LONG???biXPelsPerMeter;?//一米横向象素数
???????????????????????????????????LONG???biYPelsPerMeter;?//一米纵向象素数
???????????????????????????????????DWORD??biClrUsed;//?(非零用语短颜色表)
???????????????????????????????????DWORD??biClrImportant;?
??????????????????????}?BITMAPINFOHEADER,?*PBITMAPINFOHEADER;?

???????由于以上信息可以直接从MSDN上查到,所以只做简单介绍,你可以自己查看NSDN帮助,上面有很详细的介绍.

??????????????3.DIB位图像.这里放的是真正的位图数据.

????????知道了位图的存放格式,下面我们就可以很容易的把它读如内存.

???????第二步,读入bmp图像

???????LPCTSTR?lpszFileName4=untitled.bmp;???//文件路径
??????CFile?file;?????????????????????????????????????//用于读取BMP文件
??????BITMAPFILEHEADER?bfhHeader;//bmp文件头

?????BITMAPINFOHEADER?bmiHeader;?//bmp格式头?

??????LPBITMAPINFO?lpBitmapInfo;????//bmp格式具体信息
??????int?bmpWidth=0;?????????????????????????//图片宽度
??????int?bmpHeight?=?0;??????????????????????//图片高度????????????

??????if(!file.Open(lpszFileName,CFile::modeRead))
??????????????return?;??????????????????????????????//打开文件
??????file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));//读取文件头
??????if(bfhHeader.bfType!=((WORD)?(M<<8)|B))???????????//判断是否是BM
??????????????return?;
??????if(bfhHeader.bfSize!=file.GetLength())
??????????????return?;
???????????????????????????????
?????if?(file.Read((LPSTR)&bmiHeader,?sizeof(bmiHeader))?!=?sizeof(bmiHeader))
??????????????return?;
?????bmpHeight?=?bmiHeader.biHeight;//得到高度和宽度
?????bmpWidth?=?bmiHeader.biWidth;
?????file.SeekToBegin();
?????file.Read(&bfhHeader,sizeof(BITMAPFILEHEADER));?
?????UINT?uBmpInfoLen=(UINT)?bfhHeader.bfOffBits-sizeof(BITMAPFILEHEADER);
?????lpBitmapInfo=(LPBITMAPINFO)?new?BYTE[uBmpInfoLen];
?????file.Read((LPVOID)?lpBitmapInfo,uBmpInfoLen);
?????if((*?(LPDWORD)(lpBitmapInfo))!=sizeof(BITMAPINFOHEADER))
??????????????return?;
?????DWORD?dwBitlen=bfhHeader.bfSize?-?bfhHeader.bfOffBits;
?????LPVOID?lpSrcBits=new?BYTE[dwBitlen];??????????//将数据读入lpSrcBits数组
?????file.ReadHuge(lpSrcBits,dwBitlen);
?????file.Close();?????????????????????????????????????????????????????//关闭文件

?????下面我们将图片显示在屏幕上:

?????第三步,显示图片

?????CClientDC??hDC(this);?
?????StretchDIBits(hDC,0,0,bmpWidth,bmpHeight,0,0,bmpWidth,bmpHeight,

??????????????????????????lpSrcBits,lpBitmapInfo,DIB_RGB_COLORS,SRCCOPY);

?????第四步,将图片读入内存设备环境

??????HDC?dcSrc;
??????HBITMAP?bitmap;
??????dcSrc=CreateCompatibleDC(hDC);//得到一个内存设备环境
??????bitmap?=?CreateCompatibleBitmap(hDC,bmpWidth,bmpHeight);
??????SelectObject(dcSrc,bitmap);
??????BitBlt(dcSrc,0,0,bmpWidth,bmpHeight,hDC,0,0,SRCCOPY);//这一步很重要

??????第五步,实现位图旋转

??????我们假设旋转位图的函数原形如下:

??????void?RotateBitmap(HDC?dcSrc,int?SrcWidth,int?SrcHeight,double?angle,HDC?pDC);

?????/*参数解释如下://///////////////////////////////////////////////////////////////////////////

????????HDC?dcSrc:要旋转的位图的内存设备环境,就是第四步创建的

????????int?SrcWidth:要旋转位图的宽度

????????int?SrcHeight:要旋转位图的高度

???????double?angle:所要旋转的角度,以弧度为单位???

???????HDC?pDC:第三步得到的当前屏幕设备环境

*///////////////////////////////////////////////////////////////////////////////////////////////////////

//以下是函数实现细节

void?RotateAnyAngle(HDC?dcSrc,int?SrcWidth,int?SrcHeight,double?angle)
{
?double?x1,x2,x3;
?double?y1,y2,y3;
?double?maxWidth,maxHeight,minWidth,minHeight;
?double?srcX,srcY;
?double?sinA,cosA;
?double?DstWidth;
?double?DstHeight;
?HDC?dcDst;//旋转后的内存设备环境
?HBITMAP?newBitmap;
?sinA?=?sin(angle);
?cosA?=?cos(angle);
?x1?=?-SrcHeight?*?sinA;
????y1?=?SrcHeight?*?cosA;
????x2?=?SrcWidth?*?cosA?-?SrcHeight?*?sinA;
????y2?=?SrcHeight?*?cosA?+?SrcWidth?*?sinA;
????x3?=?SrcWidth?*?cosA;
????y3?=?SrcWidth?*?sinA;
?minWidth?=?x3>(x1>x2?x2:x1)?(x1>x2?x2:x1):x3;
?minWidth?=?minWidth>0?0:minWidth;
?minHeight?=?y3>(y1>y2?y2:y1)?(y1>y2?y2:y1):y3;
?minHeight?=?minHeight>0?0:minHeight;
?maxWidth?=?x3>(x1>x2?x1:x2)?x3:(x1>x2?x1:x2);
?maxWidth?=?maxWidth>0?maxWidth:0;
?maxHeight?=?y3>(y1>y2?y1:y2)?y3:(y1>y2?y1:y2);
?maxHeight?=?maxHeight>0?maxHeight:0;
?DstWidth?=?maxWidth?-?minWidth;
????DstHeight?=?maxHeight?-?minHeight;
?dcDst?=?CreateCompatibleDC(dcSrc);
?newBitmap?=?CreateCompatibleBitmap(dcSrc,(int)DstWidth,(int)DstHeight);
?SelectObject(dcDst,newBitmap);
?for(?int?I?=?0?;I
?{
????for(int?J?=?0?;J
????{
???????srcX?=?(J?+?minWidth)?*?cosA?+?(I?+?minHeight)?*?sinA;
???????srcY?=?(I?+?minHeight)?*?cosA?-?(J?+?minWidth)?*?sinA;
???????if(?(srcX?>=?0)?&&?(srcX?<=?SrcWidth)?&&(srcY?>=?0)?&&?(srcY?<=?SrcHeight))
??????{
??????????????BitBlt(dcDst,?J,?I,?1,?1,?dcSrc,(int)srcX,?(int)srcY,?SRCCOPY);
??????}
???}
?}

???//显示旋转后的位图

???BitBlt(hDC,200,200,(int)DstWidth,(int)DstHeight,dcDst,0,0,SRCCOPY);

???DeleteObject(newBitmap);

???DeleteDC(dcDst);

}

??????最后我们调用就可以了:

??????double?angle?=?(45/180.0)*3.14159;//旋转45Degree,可为任意角度

??????RotateAnyAngle(dcSrc,bmpWidth,bmpHeight,angle,);

?????到这里就大功告成了.

解决方案三:

图片旋转的MFC程序

时间: 2024-09-12 09:57:17

mfc 图片控件旋转问题,一次旋转90°的相关文章

MFC 对话框Picture Control(图片控件)中静态和动态显示Bmp图片

        最近有同学问我如何实现MFC基于对话框在图片控件中加载图片?其实使用MFC显示图片的方法各种各样,但是还是有些同学不知道怎样显示.以前在<数字图像处理>课程中完成的软件都是基于单文档的程序,这里介绍两种在对话框picthre控件中显示BMP图片的最简单基础的方法.       ~~方法可能并不完美,高手忽略,但是提供一种能运行的方法,希望对刚接触这方面知识的同学有所帮助.可能你觉得文章过于简单或者有些过于详细叙述(点到即可我并不反对),但也为哪些入门同学想想,当初自己也是一头雾

如何从数据库中读取图片并显示在MFC picture控件当中?

问题描述 如何从数据库中读取图片并显示在MFC picture控件当中? 如何从sqlite读取图片并显示在MFC picture控件当中?新手啊,不知道大概怎么弄,如果能给几行代码,感激不尽! 解决方案 参考:http://blog.csdn.net/zhangyulin54321/article/details/8098484 解决方案二: MFC picture控件中显示图片MFC picture控件中显示图片MFC picture控件显示图片(新手)

绘图-MFC界面新手提问:对话框背景图片和图片控件 的速度问题

问题描述 MFC界面新手提问:对话框背景图片和图片控件 的速度问题 新手美工,正在做前台,想知道在做一个全部由自绘和贴图完成的MFC对话框界面的时候,是直接用大图做背景图片好,还是将图片裁开成小图一个个用图片控件好? 在速度或者其它方面有什么影响吗?真心求教,膜拜大神们!!! 解决方案 关键看你这些图片需要不需要变化,如果不需要变化,还是整个一个背景好,比较简单.2d绘图对于现在级别的显卡,根本没有性能的差异. 解决方案二: 控件越多越慢.但是也要看你的图有多大(比如几M也不行).MFC(第一代

MFC如何改变图片控件大小?

问题描述 MFC如何改变图片控件大小? 如图,我想改变图片控件大小到方框那么大,好让图片适应控件显示,不知道怎么样才能做到?谢谢(很奇怪为什么不能拖动改变大小) 解决方案 你放的是什么控件,试试看picturebox或者static.另外你当前选定的是那个按钮,你先要选择图片控件,让它四周出现8个小方块 解决方案二: MFC的控件大小如何随对话框改变MFC控件大小随窗体大小而改变MFC控件大小随窗体大小而改变 解决方案三: 你VC的资源管理器中选中图片控件,然后拖动它的边框到对应的大小 或者你用

MFC 树形控件CTreeCtrl显示文件路径及文件

在上篇文章中简单讲述了"MFC单文档分割窗口显示图片",但是我想实现的是左边显示图片的路径,右边显示图片的情况,所以这里需要讲述如何使用控件List Control和Tree Control.    CListCtrl(列表控件):可以用大图标.小图标.列表.报表四种不同方式显示一组信息.    CTreeCtrl(树形控件):用树结构显示一组信息,并能反映这些信息的层次关系.首先声明:该文章主要是数字图形处理知识并结合liujiannan_1987的上传资源讲述,在此感谢该作者:ht

VS2010 MFC ocx控件 button隐藏

问题描述 VS2010 MFC ocx控件 button隐藏 我的代码如下: 1.在初始化函数OnInitDialog中给按钮添加位图 if (m_button1.GetBitmap()==NULL) { m_button1.SetBitmap(::LoadBitmap(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAP22))); //旋转90° ·······} 2.给菜单项"隐藏工具栏"添加事件处理程序,代码如下: void M

c++-MFC Tab控件下的page与page的控件冲突

问题描述 MFC Tab控件下的page与page的控件冲突 我在MFC下做了4个对话框,其中一个是主对话框,内有一个Tab控件,然后剩下的三个对话框作为子对话框,也就是tab控件的三个page. 我在第一个page(子对话框)中添加了一些控件,如listctrl控件,同时关联了变量. 程序运行没有问题. 接着我在其他两个page(子对话框)中添加了相同的控件,同时关联了变量,接下来就是令我不解的地方,程序崩溃了.我什么都没做,只是关联了一下控件变量,不知道为什么程序会崩溃. 在线等,求大神指导

EyesBaby功能实现之图片控件上添加字符

其实普通的图片控件上显示字符很简单,拖个图片控件再拽个Label就ok了.但是这样可能达不到我们的要求,比如EyesBaby休息窗口中要求隐藏倒计秒数,如果按照之前的做法Label部分背景会有阴影效果.下面就是主要怎末让Label的背景透明,让字符感觉跟图片溶为一体: 代码实现: 方式1: pictureBox1.SendToBack(); // 设置Label背景为透明色 lblMsg.BackColor = Color.Transparent; lblMsg.Parent = picture

MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法

MFC 定制控件(Customize Control) 及 MFC CWnd和WIN32 HWND关联方法  <参考资料 MSDN MFC TNO 15>  文档将概述MFC中定制自定义控件的3种方法: 拥有者绘制控件(Owner Drawing Control and Menu)   自绘制控件(self drawing control and menu)  和子集化(subclass)  1  使用MFC方法定制控件必备的几个基本概念:  控制定制风格的控件的几个标准Windows消息: