CPalette调色板使用
//把Picture控件的背景画为白色
CLine m_Line;//自定义的类CLine
CClientDC dc(this); // device context for painting
CRect rc = GetRect(IDC_STATIC_RECT);
m_Line.DrawBackGround(&dc,rc);
void CLine::DrawBackGround(CDC *pDC, CRect rect)
{
CBrush brushCtl;
brushCtl.CreateSolidBrush(GetBkColor());
pDC->Rectangle(rect);
pDC->FillRect(rect,&brushCtl) ;
brushCtl.DeleteObject();
}
上面是题外话
创建调色板的一般步骤:
1 建立一个LOGPALETTE结构和PALETTEENTRY数组
2 对PALETTEENTRY数组进行赋值,即创建调色板颜色表
3 建立CPalette对象并使用CreatePalette函数初始化调色板对象
4 使用SelectPalette函数将设备描述表和调色板联系起来
5 使用CDC中的RealizePalette函数使调色板生效
如果某一个窗口要显示特殊的颜色,那么一般应该在处理WM_PAINT消息时实现自己的逻辑调色板,也就是说,在OnPaint或OnDraw函数中重绘以前,要调用SelectPalette和RealizePalette,如果窗口显示的颜色比较重要,则要在调用SelectPalette时指定bForceBackground参数为FALSE.
为了协调各个窗口对系统调色板的使用,Windows在必要的时候会向顶层窗口和重绘窗口发送消息WM_QUERYNEWPALETTE和WM_PALETTECHANGED.
当某一顶层或重叠窗口被激活时,会收到WM_QUERYNEWPALETTE消息,在窗口的创建之处也会收到该消息,该消息先于WM_PAINT消息到达窗口,如果活动窗口要使用特殊的颜色,则在收到该消息时应该实现自己的逻辑调色板并重绘窗口.
void CTestStoreObjectDlg::OnButton3()
{
// TODO: Add your control notification handler code here
//LOGPALETTE结构,并利用该逻辑调色板结构初始化调色板对象。
const int nColors=24; BYTE R[nColors],G[nColors],B[nColors];
UINT nSize=sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY)*(nColors-1)); //计算逻辑调色板所需空间
LOGPALETTE *pLP=(LOGPALETTE*) new BYTE[nSize];
//初始化逻辑调色板,假设R,G,B 保存的是调色板各颜色红,绿,蓝三个分量的数组
pLP->palVersion=0x300; //固定值
pLP->palNumEntries=nColors;
for(int i=0;i<nColors;i++)
{
pLP->palPalEntry[i].peRed=R[i];
pLP->palPalEntry[i].peGreen=G[i];
pLP->palPalEntry[i].peBlue=B[i];
pLP->palPalEntry[i].peFlags=0;
}
//创建调色板
CPalette m_palette;
m_palette.CreatePalette(pLP);
CClientDC *pDC=new CClientDC(this);
CPalette *pOldPalette=pDC->SelectPalette(&m_palette,FALSE);
pDC->RealizePalette();
//图像显示或画图操作
pDC->SelectPalette(pOldPalette,FALSE);
}
CPalette是MFC封装的调色板类。CPalette的操作如下:
1. 创建调色板。要创建一个调色板,需要首先知道要创建的调色板对象所包含的颜色数nColors,然后创建一个逻辑调色板
LOGPALETTE结构,并利用该逻辑调色板结构初始化调色板对象。
UINT nSize=sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY)*(nColors-1)); //计算逻辑调色板所需空间
LOGPALETTE *pLP=(LOGPALETTE*) new BYTE[nSize];
//初始化逻辑调色板,假设R,G,B 保存的是调色板各颜色红,绿,蓝三个分量的数组
pLP->palVersion=0x300; //固定值
pLP->palNumEntries=nColors;
for(int i=0;i<nColors;i++)
{
pLP->palPalEntry[i].peRed=R[i];
pLP->palPalEntry[i].peGreen=G[i];
pLP->palPalEntry[i].peBlue=B[i];
pLP->palPalEntry[i].peFlags=0;
}
//创建调色板
CPalette m_palette;
m_palette.CreatePalette(pLP);
2.从位图创建调试版。假设m_bitmap是一个CBitmap对象。
DIBSECTION ds;
m_bitmap.GetObject(sizeof(DIBSECTION),&ds);
//计算颜色数
int nColors;
if(ds.dsBmih.biClrUsed!=0)
{
nColors=ds.dsBmih.biClrUsed;
}
else
{
nColors=1<<ds.dsBmih.biBitCount;
}
//创建调色板
if(nColors>256)
m_palette.CreateHalftonePalette(&dc);
else
{
RGBQUAD *pRGB=new RGBQUAD[nColors];
//得到位图颜色列表
CDC memDC;
memDC.CreateCompatibleDC(&dc);
CBitmap *pOldBitmap=memDC.SelectObject(&m_bitmap);
::GetDIBColorTable((HDC)memDC,0,nColors,pRGB); //得到颜色列表
memDC.SelectObject(pOldBitmap);
//初始化逻辑调色板
UINT nSize=sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY)*(nColors-1));
LOGPALETTE *pLP=(LOGPALETTE*) new BYTE[nSize];
pLP->palVersion=0x300;
pLP->palNumEntries=nColors;
for(int i=0;i<nColors;i++)
{
pLP->palPalEntry[i].peRed=pRGB[i].rgbRed;
pLP->palPalEntry[i].peGreen=pRGB[i].rgbGreen;
pLP->palPalEntry[i].peBlue=pRGB[i].rgbBlue;
pLP->palPalEntry[i].peFlags=0;
}
//创建调色板
m_palette.CreatePalette(pLP);
}
3.使用调色板:
要使用以创建好的调试版m_palette,需要在画图前选如调色板,并实现之。
CPalette *pOldPalette=pDC->SelectPalette(&m_palette,FALSE);
pDC->RealizePalette();
... //图像显示或画图操作
pDC->SelectPalette(pOldPalette,FALSE);
CBitmap是MFC封装的一个位图类,这个位图可以使DDB或DIB,即设备相关位图或设备无关位图。
关于CBitmap的操作如下:
1. 位图读取。如果从文件读取一幅位图并保持在m_bitmap对象中,操作如下:
HBITMAP hBitmap;
hBitmap=(HBITMAP)::LoadImag (NULL, lpszPathName, IMAGE_BITMAP, 0,0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION);
if(!hBitmap)
m_bitmap.Attach(hBitmap);
如果从资源载入一幅位图直接用m_bitmap.LoadBitmap( nIDResource );
2.位图显示。首先如果位图有调色板,把位图调色板选人DC并实现之
CPalette *pOldPalette=pDC->SelectPalette(pPalette,FALSE);
pDC->RealizePalette();
然后再用BitBlt或StretchBlt显示
CDC* memDC;
memDC->CreateCompatibleDC(pDC);
CBitmap *pOldBitmap=memDC->SelectObject(&m_bitmap);
pDC->BitBlt(0,0,bitmapWidth,bitmapHeight, &memDC,0,0,SRCCOPY);//显示图像
DIB又叫设备无关位图,顾名思义,像素的颜色独立于系统调色板,因此可以用来在不同的系统之间或不同的应用程序之间交流,或永久性地保存图象。
DIB文件是以BITMAPFILEHEADER结构开头的,紧随该结构的是一个BITMAPINFOHEADER结构,然后是RGBQUAD结构组成的颜色表(对于2、8、16、256色位图而言,24位真彩色位图没有),文件最后存储的是DIB的像素阵列。BITMAPFILEHEADER结构的定义为:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型,必须为"BM"
DWORD bfSize; //文件的大小
WORD bfReserved1; //为0
WORD bfReserved2; //为0
DWORD bfOffBits; //存储的像素阵列相对于文件头的偏移量
} BITMAPFILEHEADER;
在内存中,一个完整的DIB由两部分组成:一个BITMAPINFO结构和一个存储像素阵列的数组。BITMAPINFO 描述了位图的大小,颜色模式和调色板等各种属性,其定义为:
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1]; //颜色列表,在此只是占位,如果位图没有颜色列表,该数组为空。
} BITMAPINFO;
其中BITMAPINFOHEADER结构包含了DIB的各种信息,其定义为:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //该结构的大小
LONG biWidth; //位图的宽度(以像素为单位)
LONG biHeight; //位图的高度(以像素为单位)
WORD biPlanes; //必须为1
WORD biBitCount //每个像素的位数(1、4、8、16、24或32)
DWORD biCompression; //压缩方式,一般为0或BI_RGB (未压缩)
DWORD biSizeImage; //以字节为单位的图象大小(仅用于压缩位图)
LONG biXPelsPerMeter; //以目标设备每米的像素数来说明位图的水平分辨率
LONG biYPelsPerMeter; //以目标设备每米的像素数来说明位图的垂直分辨率
DWORD biClrUsed; //颜色表的颜色数,若为0则位图使用由biBitCount指定的最大颜色数
DWORD biClrImportant; //重要颜色的数目,若该值为0则所有颜色都重要
} BITMAPINFOHEADER;
RGBQUAD结构用来描述颜色,其定义为:
typedef struct tagRGBQUAD
{
BYTE rgbBlue; //蓝色分量
BYTE rgbGreen; //绿色分量
BYTE rgbRed; //红色分量
BYTE rgbReserved; //保留字节,为0
} RGBQUAD;
DIB的字节数组是从图象的最下面一行开始的逐行向上存储的,也即等于把图象倒过来然后在逐行扫描。另外,字节数组中每个扫描行的字节数必需是4的倍数,如果不足要用0补齐。
CPalette调色板使用相关推荐
- 学习mfc的一些方法
"MFC 微软基础类 MFC,微软基础类(Microsoft Foundation Classes),同VCL类似,是一种Application Framework,随微软Visual C+ ...
- 新申请了一个博客 以后就要记录我的点滴生活了
本来比较懒,觉的似乎有些浪费时间.但是还是觉得应该把有些有意义的东西记下来.将来也好回顾复习下.温故而知新嘛 刚开始学编程,一切都很茫然.学校什么都没教,很多东西都要自己找着学 ,而自己知道的东西太有 ...
- MFC基本图形的绘制(一)设备环境类CDC、画笔和画刷
Windows的GDI(设备图形接口),提供了绘图的基本工具,如:画点.线.多边形.位图以及文本输出等.MFC的设备环境类CDC封装了全部的绘图函数,使得绘制的图形即可以显示,又可以打印. 概述 Vi ...
- vc的含义(与c的区别)
VC 一.VC是什么?学VC是学什么? 首先VC是一个软件(IDE集成开发环境)(编译.编辑.调试) C和C++.但C++中的有些特性是不用的,例如I/O流,多态继承 WindowsSDK(软件开发工 ...
- CClientDC类
类CClientDC派生于CDC,在构造时调用了Windows函数GetDC,在析构时调用了ReleaseDC.这意味着和CClientDC对象相关的设备上下文是窗口的客户区. 几种DC及区别 CCl ...
- VC实现卡拉OK字幕叠加
一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...
- 视频叠加字幕显示原理与实现方法
一. GDI编程基础 字幕叠加,应当是属于图形.图像处理的范畴.在Windows平台上,图形.图像处理的方法当然首选GDI(Graphics Device Interface,图形设备接口).GDI是 ...
- 计算机图形编程基础,Windows图形编程基础.ppt
Windows图形编程基础 软件教研室 计算机图形学 第三章 Window图形编程基础 一.设备描述表DC及相关的MFC类 二.图形设备接口(GDI : Graphics device Interfa ...
- HDC、CDC、CCLientDC的关系、MFC类库
DC概念: 当使用GDI函数比如MoveToEx.LineTo.TextOut时,只是告诉系统要画线或者写字了,但是用什么样的笔(HPEN),字是什么颜色(setTextColor),画在哪张'纸'( ...
最新文章
- 手撕面试题:多个线程交替打印问题
- Linux三剑客之grep详解
- Winform开发框架之通用人员信息管理实现代码介绍
- 简述一下extern C的小作用
- pymssql出现的错误
- support v4官方下载_掌心长兴客户端下载-掌心长兴ap下载v4.1.4 安卓官方版
- 人生苦短python作伴_“人生苦短,我用Python”
- php判断绝对路径文件是否存在,php – 如何确定文件路径是否绝对?
- UE3 移动设备主页
- yum源分类:Linux
- [NLP]OpenNLP标记器的使用
- thinkphp实现商城
- firefox如何下载播放的视频
- MIPS中的异常处理和系统调用
- win11设置开机自动打开chrome并最大化页面
- 2021年国考申论写作之如何快速改进作文书写
- Arduino (一)——面包板与固定导线长度
- 微信小程序 —— 考勤管理Demo(前后端及数据库)
- 41. 整合RabbitMQ发送短信
- c语言国际编码标准统一编码,88、国际C语言混乱代码大赛-2020.03.11