📄 cdib.cpp
字号:
// 选择调色板到设备上下文
::SelectPalette(hdc, m_hPalette, bBackground);
// 实现该调色板
return ::RealizePalette(hdc);
}
BOOL CDib::DrawDDB(CDC* pDC,CRect* rect)
{
CBitmap Bitmap,*pBitmap,*pOldBitmap;
BITMAP bm;
CDC MemDC;
int width=m_lpBMIH->biWidth;
int height=m_lpBMIH->biHeight;
int plane=m_lpBMIH->biPlanes;
int bitcount=8;
const void* lpbits=m_lpImage;
//if(!Bitmap.CreateBitmap(width,height,plane,bitcount,m_lpImage))
//return false;
HBITMAP m_hBitmap = ::CreateDIBSection(pDC->GetSafeHdc(), (LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, (LPVOID*) &m_lpImage, NULL, 0);
pBitmap=Bitmap.FromHandle(m_hBitmap);
if(!MemDC.CreateCompatibleDC(pDC))
return false;
pOldBitmap=(CBitmap*)MemDC.SelectObject(pBitmap);
pDC->StretchBlt(rect->left,rect->top,rect->Width(),rect->Height(),
&MemDC,0,0,width,height,SRCCOPY);
//pDC->BitBlt(rect->left,rect->top,rect->Width(),rect->Height(),&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(pOldBitmap);
return true;
}
void CDib::DrawAllROI(CDC* pDC,CRect rect,float zoomx,float zoomy,bool bgraph)
{
CPoint start,end;
ROITYPE* pt;
int i;
if(!bgraph) return;
if(m_ROIArray.GetSize()==0) return;
for(i=m_ROIArray.GetSize()-1;i>=0;i--){
pt=(ROITYPE*)m_ROIArray.GetAt(i);
start.x=(float)(pt->rect.left)/zoomx;
start.y=(float)(pt->rect.top)/zoomy;
end.x=(float)(pt->rect.right)/zoomx;
end.y=(float)(pt->rect.bottom)/zoomy;
DrawROI(pDC,rect,pt->shape,start,end);
/*
if(btext){
CClientDC dc(this);
dc.TextOut(rectSelected.left+start.x,rectSelected.top+start.y,pt->tag);
}
*/
}
}
void CDib::DrawROI(CDC* pDC,CRect rect,int shape,CPoint start,CPoint end)
{
if(end.x<0) return;
CPen *oldPen;
CBrush *oldBrush;
int oldMode;
oldPen =(CPen *)pDC->SelectStockObject(WHITE_PEN);
oldBrush =(CBrush *)pDC->SelectStockObject(NULL_BRUSH);
//oldMode =pDC->.SetROP2(R2_XORPEN);
CRect block;
if(start.x<end.x){
block.left=rect.left+start.x;
block.right=rect.left+end.x;
}
else{
block.left=rect.left+end.x;
block.right=rect.left+start.x;
}
if(start.y<end.y){
block.top=rect.top+start.y;
block.bottom=rect.top+end.y;
}
else{
block.top=rect.top+end.y;
block.bottom=rect.top+start.y;
}
switch(shape){
case 1:
pDC->Ellipse(&block);
break;
case 2:
pDC->Rectangle(&block);
break;
case 3:
pDC->MoveTo(block.left,block.top+block.Height()/2);
pDC->LineTo(block.left+block.Width()/2,block.top);
pDC->LineTo(block.right,block.top+block.Height()/2);
pDC->LineTo(block.left+block.Width()/2,block.bottom);
pDC->LineTo(block.left,block.top+block.Height()/2);
break;
}
pDC->SelectObject(oldPen);
pDC->SelectObject(oldBrush);
//pDC->.SetROP2(oldMode);
}
/*************************************************************************
*
* \函数名称:
* Draw()
*
* \输入参数:
* CDC* pDC - 指向将要接收DIB图象的设备上下文指针
* CPoint origin - 显示DIB的逻辑坐标
* CSize size - 显示矩形的宽度和高度
*
* \返回值:
* BOOL - 如果成功,则为TRUE,
*
* \说明:
* 通过调用Win32 SDK的StretchDIBits函数将CDib对象输出到显示器(或者打印机)。
* 为了适合指定的矩形,位图可以进行必要的拉伸
*
************************************************************************
*/
BOOL CDib::Draw(CDC* pDC, CPoint origin, CSize size)
{
// 如果信息头为空,表示尚未有数据,返回FALSE
if(m_lpBMIH == NULL) return FALSE;
// 设置显示模式
pDC->SetStretchBltMode(COLORONCOLOR);
// 在设备的origin位置上画出大小为size的图象
StretchDIBits(pDC->GetSafeHdc(), origin.x, origin.y,size.cx,size.cy,
0, 0, m_lpBMIH->biWidth, m_lpBMIH->biHeight,
m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
// 返回
return TRUE;
}
BOOL CDib::Draw(CDC* pDC,CRect source,CRect dest)
{
// 如果信息头为空,表示尚未有数据,返回FALSE
if(m_lpBMIH == NULL) return FALSE;
// 设置显示模式
pDC->SetStretchBltMode(COLORONCOLOR);
source.top=m_lpBMIH->biHeight-source.top;
source.bottom=m_lpBMIH->biHeight-source.bottom;
// 在设备的origin位置上画出大小为size的图象
StretchDIBits(pDC->GetSafeHdc(), dest.left, dest.top,dest.Width(),dest.Height(),
source.left,source.top,source.Width(),source.Height(),
m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
// 返回
return TRUE;
}
BOOL CDib::Draw(CDC* pDC, CRect dest)
{
// 如果信息头为空,表示尚未有数据,返回FALSE
if(m_lpBMIH == NULL) return FALSE;
/* //========妈的!注释的部分不能加上,否则时间长了会死机(03.8.27)========
// 如果调色板不为空,则将调色板选入设备上下文
if(m_hPalette != NULL) {
::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
}
*/
// 设置显示模式
pDC->SetStretchBltMode(COLORONCOLOR);
// 在设备的origin位置上画出大小为size的图象
// StretchDIBits(pDC->GetSafeHdc(), rect.left, rect.top,rect.Width(),rect.Height(),
// 0, 0, m_lpBMIH->biWidth, m_lpBMIH->biHeight,
// m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
CRect source;
source.top=m_lpBMIH->biHeight;
source.bottom=0;
source.left=0;
source.right=m_lpBMIH->biWidth-1;
StretchDIBits(pDC->GetSafeHdc(), dest.left, dest.top,dest.Width(),dest.Height(),
source.left,source.top,source.Width(),source.Height(),
m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY);
// 返回
return TRUE;
}
/*************************************************************************
*
* \函数名称:
* CreateSection()
*
* \输入参数:
* CDC* pDC - 设备上下文指针
*
* \返回值:
* HBITMAP - 到GDI位图的句柄。如果不成功,则为NULL。
* - 该句柄也是作为公共数据成员存储的
*
* \说明:
* 通过调用Win32 SDK的CreateDIBSection函数创建一个DIB段。图象内存将不被初始化
*
************************************************************************
*/
HBITMAP CDib::CreateSection(CDC* pDC /* = NULL */)
{
// 如果信息头为空,不作任何处理
if(m_lpBMIH == NULL) return NULL;
// 如果图象数据不存在,不作任何处理
if(m_lpImage != NULL) return NULL;
// 创建一个DIB段
m_hBitmap = ::CreateDIBSection(pDC->GetSafeHdc(), (LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, (LPVOID*) &m_lpImage, NULL, 0);
ASSERT(m_lpImage != NULL);
// 返回HBIMAP句柄
return m_hBitmap;
}
/*************************************************************************
*
* \函数名称:
* MakePalette()
*
* \输入参数:
* 无
*
* \返回值:
* BOOL - 如果成功,则为TRUE
*
* \说明:
* 如果颜色表存在的话,该函数将读取它,并创建一个Windows调色板。
* HPALETTE存储在一个数据成员中。
*
************************************************************************
*/
BOOL CDib::MakePalette()
{
// 如果不存在调色板,则返回FALSE
if(m_nColorTableEntries == 0) return FALSE;
if(m_hPalette != NULL) ::DeleteObject(m_hPalette);
TRACE("CDib::MakePalette -- m_nColorTableEntries = %d\n", m_nColorTableEntries);
// 给逻辑调色板分配内存
LPLOGPALETTE pLogPal = (LPLOGPALETTE) new char[2 * sizeof(WORD) +
m_nColorTableEntries * sizeof(PALETTEENTRY)];
// 设置逻辑调色板的信息
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = m_nColorTableEntries;
// 拷贝DIB中的颜色表到逻辑调色板
LPRGBQUAD pDibQuad = (LPRGBQUAD) m_lpvColorTable;
for(int i = 0; i < m_nColorTableEntries; i++) {
pLogPal->palPalEntry[i].peRed = pDibQuad->rgbRed;
pLogPal->palPalEntry[i].peGreen = pDibQuad->rgbGreen;
pLogPal->palPalEntry[i].peBlue = pDibQuad->rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
pDibQuad++;
}
// 创建逻辑调色板
m_hPalette = ::CreatePalette(pLogPal);
// 删除临时变量并返回TRUE
delete pLogPal;
return TRUE;
}
/*************************************************************************
*
* \函数名称:
* SetSystemPalette()
*
* \输入参数:
* CDC* pDC - 设备上下文指针
*
* \返回值:
* BOOL - 如果成功,则为TRUE,
*
* \说明:
* 如果16bpp、24bpp或32bppDIB不具备调色板,则该函数可以为CDib对象创建一个逻辑调色板,
* 它与由CreatehalftonePalette函数返回的调色板相匹配。如果程序在256色调色板显示器上
* 运行,而你又没有调用SetSystemPalette,那么,你将不具有任何调色板,只有20中标准的
* Windows颜色出现在DIB中
*
************************************************************************
*/
BOOL CDib::SetSystemPalette(CDC* pDC)
{
// 如果DIB不具备调色板,则需要利用系统的调色板
if(m_nColorTableEntries != 0) return FALSE;
// 为设备上下文创建中间调色板,并将其与CPalette对象连接
m_hPalette = ::CreateHalftonePalette(pDC->GetSafeHdc());
// 返回
return TRUE;
}
/*************************************************************************
*
* \函数名称:
* CreateBitmap()
*
* \输入参数:
* CDC* pDC - 设备上下文指针
*
* \返回值:
* HBITMAP - 到GDI位图的句柄;如果不成功,则为NULL
* - 该句柄不是作为公共数据成员存储的
*
* \说明:
* 从已有的DIB中创建DDB位图。不要将这个函数与CreateSection
* 弄混了,后者的作用是生成DIB并保存句柄
*
************************************************************************
*/
HBITMAP CDib::CreateBitmap(CDC* pDC)
{
// 如果不存在图象数据,则返回NULL
if (m_dwSizeImage == 0) return NULL;
// 用指定的DIB来创建DDB,并用DIB信息初始化位图的图象位
HBITMAP hBitmap = ::CreateDIBitmap(pDC->GetSafeHdc(), m_lpBMIH,
CBM_INIT, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS);
ASSERT(hBitmap != NULL);
// 返回DDB位图句柄
return hBitmap;
}
/*************************************************************************
*
* \函数名称:
* ConvertDDBToDIB()
*
* \输入参数:
* HBITMAP hBitmap - 指向源数据的BITMAP句柄
* CDib* pDibDst - 指向转换目标的CDib对象指针
*
* \返回值:
* BOOL - 如果操作成功,则返回TRUE
*
* \说明:
* 该函数将源BITMAP类pDibSrc中的数据拷贝到pDibDst中,并对相应的数据成员赋值
*
*************************************************************************
*/
/*
BOOL CDib::ConvertFromDDB(HBITMAP hBitmap, HPALETTE hPal)
{
// 声明一个BITMAP结构
BITMAP bm;
// 设备上下文
HDC hDC;
// 象素位数
WORD biBitCount;
// 调色板表项数
int nColorTableEntries;
// 如果hBitmap句柄无效,则返回
if(!hBitmap){
return FALSE;
}
// 释放已分配的内存
Empty();
// 填充图象数据到bm中,其中最后一个参数表示接收这个指定的对象的指针
if(!GetObject(hBitmap,sizeof(BITMAP),(LPBYTE)&bm)){
return FALSE;
}
// 计算象素位数
biBitCount=bm.bmPlanes*bm.bmBitsPixel;
if(biBitCount<=1)
biBitCount=1;
else if(biBitCount<=4)
biBitCount=4;
else if(biBitCount<=8)
biBitCount=8;
else
biBitCount=24;
// 计算调色板的尺寸
// 如果biClrUsed为零,则用到的颜色数为2的biBitCount次方
switch(biBitCount) {
case 1:
nColorTableEntries = 2;
break;
case 4:
nColorTableEntries = 16;
break;
case 8:
nColorTableEntries = 256;
break;
case 16:
case 24:
case 32:
nColorTableEntries = 0;
break;
default:
ASSERT(FALSE);
}
ASSERT((nColorTableEntries >= 0) && (nColorTableEntries <= 256));
m_nColorTableEntries = nColorTableEntries;
// 分配DIB信息头和调色板的内存
m_lpBMIH = (LPBITMAPINFOHEADER) new char
[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * nColorTableEntries];
m_nBmihAlloc = m_nImageAlloc = crtAlloc;
m_lpBMIH->biSize = sizeof(BITMAPINFOHEADER);
m_lpBMIH->biWidth = bm.bmWidth;
m_lpBMIH->biHeight = bm.bmHeight;
m_lpBMIH->biPlanes = 1;
m_lpBMIH->biBitCount = biBitCount;
m_lpBMIH->biCompression = BI_RGB;
m_lpBMIH->biSizeImage = 0;
m_lpBMIH->biXPelsPerMeter = 0;
m_lpBMIH->biYPelsPerMeter = 0;
m_lpBMIH->biClrUsed = nColorTableEntries;
m_lpBMIH->biClrImportant = nColorTableEntries;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -