| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2173 人关注过本帖
标题:加载位图代码,帮看一下
只看楼主 加入收藏
jacklee
Rank: 7Rank: 7Rank: 7
来 自:XAplus
等 级:贵宾
威 望:32
帖 子:1769
专家分:104
注 册:2006-11-3
结帖率:100%
收藏
 问题点数:0 回复次数:4 
加载位图代码,帮看一下

郁闷,每一次打开位图进程里看都长4M内在,就是不下去,这样会内存用完啊。
帮看看啊。用过的指针我都DELETE了。。郁闷ING...
第一个函数是选择位图
第二个函数是从文件读位图数据(里面有两个全局变量)
第三个函数是显示位图

void CLoadBMPDlg::LoadBMP ()
{
///读入位图
//Use OpenFileDialog to open a bitmap
CFileDialog selectfile(TRUE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"BMP File (*.bmp)|*.bmp|All Files (*.*)|*.*||");
if(selectfile.DoModal ()==IDCANCEL)return;
CString FileName=selectfile.GetPathName ();
//Declar a file class
CFile file;
BITMAPFILEHEADER header;//bitmap head info
bool rval=file.Open (FileName.GetBuffer(0),CFile::modeRead |CFile::typeBinary ,NULL);
if(!rval)
{
MessageBox("Wrong File","Waring",MB_OK);
return;
}
/////////////////////////////
//Read bmp file head data
//a member of header must be "BM" that mean this file is bmp file(value=0x4d42)
/////////////////////////////
file.Read (&header,sizeof(header));
if(header.bfType!=0x4d42)
{
MessageBox("Wrong File","Waring",MB_OK);
file.Close ();
return;
}
/////////////////////////////
//Read bmp datas
////////////////////////////
rval=OpenBMPFile(&file);
if(rval==false)
{
MessageBox("Wrong File Or not 24 bitcount file","Waring",MB_OK);
return;
}
}
BOOL CLoadBMPDlg::OpenBMPFile (CFile *pfile)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
BITMAPINFO* pBMPInfo=NULL;
RGBQUAD* pColorTab=NULL;//Color Table
BYTE* pData=NULL;
DWORD dwSize=0;

pfile->SeekToBegin ();//go to front of file
pfile->Read((void*)&bfh,sizeof(BITMAPFILEHEADER));//read head data
pfile->Read((void*)&bih,sizeof(BITMAPINFOHEADER));//read head info

//////bitmap is 24 bitcout bmpfile
if(bih.biBitCount ==24)
{
pBMPInfo=(BITMAPINFO*)new char[sizeof(BITMAPINFOHEADER)];//give info buffer
memcpy(pBMPInfo,&bih,sizeof(BITMAPINFOHEADER));
if(pBMPInfo==NULL)return FALSE;
if(m_pBMPInfo!=NULL)//emputy extern info value
{
m_pBMPInfo=NULL;
delete m_pBMPInfo;
}
if(m_pDIBData!=NULL)//emputy extern bmp data
{
m_pDIBData=NULL;
delete m_pDIBData;
}
//get file size from header
dwSize=bfh.bfSize -bfh.bfOffBits ;
pData=(BYTE*)new char[dwSize];
if(pData==NULL)return FALSE;
//read bmp data
pfile->ReadHuge(pData,dwSize);
//Read Data
m_pBMPInfo=pBMPInfo;
m_pDIBData=(BYTE*)new char[dwSize];
memcpy(m_pDIBData,pData,dwSize);
//free used space
if(pBMPInfo!=NULL)pBMPInfo=NULL;delete pBMPInfo;
if(pData!=NULL)pData=NULL;delete pData;
return TRUE;
}
else
{
///////bitmap is 8 bitcount file
return FALSE;
}
return TRUE;
}

void CLoadBMPDlg::OnLoad()
{
// TODO: Add your control notification handler code here
this->LoadBMP ();
if(m_pBMPInfo==NULL || m_pDIBData==NULL)
return;
HRESULT rval=0;
CPoint point;
COLORREF color=0;
//Read size and bmp data
long bmp_w=m_pBMPInfo->bmiHeader .biWidth ;
long bmp_h=m_pBMPInfo->bmiHeader .biHeight;
USHORT bmp_bits=m_pBMPInfo->bmiHeader .biBitCount ;
//Show map
CClientDC dc(this);
dc.SetStretchBltMode (COLORONCOLOR);
::StretchDIBits(dc.GetSafeHdc (),
0,0,bmp_w,bmp_h,
0,0,bmp_w,bmp_h,
m_pDIBData,m_pBMPInfo,
DIB_RGB_COLORS,SRCCOPY);
}

搜索更多相关主题的帖子: 位图 加载 内存 bmp 代码 
2007-01-16 09:53
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
收藏
得分:0 

CDIB类对DIB操作函数进行了封装。发出来给你参考,以下是DIB.h头文件
// Dib.h: interface for the CDib class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)
#define AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define PalVersion 0x300 // 调色板版本

class CDib : public CObject
{
public:
CDib();
virtual ~CDib();
//operations
public:
// 用于操作DIB的函数声明
BOOL DrawDib(HDC, LPRECT,HGLOBAL, LPRECT,CPalette*);//显示位图
BOOL ConstructPalette(HGLOBAL,CPalette* ); //构造逻辑调色板
LPSTR GetBits(LPSTR); //取得位图数据的入口地址
DWORD GetWidth(LPSTR); //取得位图的宽度
DWORD GetHeight(LPSTR); //取得位图的高度
WORD GetPalSize(LPSTR); //取得调色板的大小
WORD GetColorNum(LPSTR); //取得位图包含的颜色数目
WORD GetBitCount(LPSTR); //取得位图的颜色深度
HGLOBAL CopyObject(HGLOBAL); //用于复制位图对象

BOOL SaveFile(HGLOBAL , CFile&); //存储位图为文件
HGLOBAL LoadFile(CFile&); //从文件中加载位图


// 在对图象进行处理时,针对位图的字节宽度必须是4的倍数的这一要求,
// 我们设计了函数GetRequireWidth,来处理这种比较特殊的情况
int GetReqByteWidth(int ); //转换后的字节数GetRequireByteWidth
long GetRectWidth(LPCRECT ); //取得区域的宽度
long GetRectHeight(LPCRECT); //取得区域的高度
public:
void ClearMemory();
void InitMembers();
public:
LPBITMAPINFO lpbminfo; // 指向BITMAPINFO结构的指针
LPBITMAPINFOHEADER lpbmihrd; //指向BITMAPINFOHEADER结构的指针
BITMAPFILEHEADER bmfHeader; //BITMAPFILEHEADER结构
LPSTR lpdib; //指向DIB的指针
LPSTR lpDIBBits; // DIB像素指针
DWORD dwDIBSize; //DIB大小

HGLOBAL m_hDib;//DIB对象的句柄

RGBQUAD* lpRgbQuag;//指向颜色表的指针
};

#endif // !defined(AFX_DIB_H__AC952C3A_9B6B_4319_8D6E_E7F509348A88__INCLUDED_)


”我游啊游”,“那边才是C边啊”,“哦”
2007-01-18 09:49
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
收藏
得分:0 

以下是CDIB类的CPP文件
// MyDib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Dib.h"

#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

/*
* Dib文件头标志(字符串"BM")
*/
#define DIB_MARKER ((WORD) ('M' << 8) | 'B')
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDib::CDib()
{
InitMembers();
}

CDib::~CDib()
{
ClearMemory();
}

/*************************************************************************
* 函数名称:DrawDib()
* 参数说明:
* HDC hDC,输出设备DC
* LPRECT lpDCRect,绘制矩形区域
* HGLOBAL hDIB ,DIB对象的句柄
* LPRECT lpDIBRect ,DIB的输出区域
* CPalette* pPal,调色板的指针
* 函数类型:BOOL
* 函数功能:该函数主要用来绘制DIB对象
************************************************************************/

BOOL CDib::DrawDib(HDC hDC,
LPRECT lpDCRect,
HGLOBAL hDIB,
LPRECT lpDIBRect,
CPalette* pPal)
{
BOOL bSuccess=FALSE; // 重画成功标志
HPALETTE hOldPal=NULL; // 以前的调色板
if (hDIB == NULL)// 判断是否是有效的DIB对象
{
return FALSE;// 不是,则返回
}
lpdib = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);// 锁定DIB
lpDIBBits = GetBits(lpdib);// 找到DIB图象像素起始位置
if (pPal != NULL)// 获取DIB调色板,并选取到设备环境中它
{
HPALETTE hPal = (HPALETTE) pPal->m_hObject;
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
}
::SetStretchBltMode(hDC, COLORONCOLOR);// 设置显示模式
bSuccess = ::StretchDIBits(hDC, // 设备环境句柄
lpDCRect->left, //目标X坐标
lpDCRect->top, // 目标Y坐标
GetRectWidth(lpDCRect), // 目标宽度
GetRectHeight(lpDCRect), // 目标高度
lpDIBRect->left, // 源X坐标
lpDIBRect->top, // 源Y坐标
GetRectWidth(lpDIBRect), // 源宽度
GetRectHeight(lpDIBRect), // 源高度
lpDIBBits, // 指向dib像素的指针
(LPBITMAPINFO)lpdib, // 指向位图信息结构的指针
DIB_RGB_COLORS, // 使用的颜色数目
SRCCOPY); // 光栅操作类型
::GlobalUnlock(hDIB); // 解除锁定
if (hOldPal != NULL)// 恢复系统调色板
{
::SelectPalette(hDC, hOldPal, TRUE);
}
return bSuccess;
}

/*************************************************************************
* 函数名称:ConstructPalette(HGLOBAL hDIB, CPalette* pPal)
* 函数参数:
* HGLOBAL hDIB,DIB对象的句柄
* CPalette* pPal,调色板的指针
* 函数类型:BOOL
* 函数说明:该函数按照DIB创建一个逻辑调色板
************************************************************************/

BOOL CDib::ConstructPalette(HGLOBAL hDIB, CPalette* pPal)
{

HANDLE hLogPal;// 逻辑调色板的句柄
int iLoop;// 循环变量
BOOL bSuccess = FALSE;// 创建结果
if (hDIB == NULL)//判断是否是有效的DIB对象
{
return FALSE;// 返回FALSE
}
lpdib = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);// 锁定DIB
lpbminfo= (LPBITMAPINFO)lpdib;
long wNumColors =GetColorNum(lpdib);// 获取DIB中颜色表中的颜色数目
if (wNumColors != 0)
{
hLogPal = ::GlobalAlloc(GHND, sizeof(LOGPALETTE)// 分配为逻辑调色板内存
+ sizeof(PALETTEENTRY)
* wNumColors);
if (hLogPal == 0)// 如果失败则退出
{
::GlobalUnlock((HGLOBAL) hDIB);// 解除锁定
return FALSE;
}
LPLOGPALETTE lpPal = (LPLOGPALETTE) ::GlobalLock((HGLOBAL) hLogPal);

lpPal->palVersion = PalVersion;// 设置调色板版本号
lpPal->palNumEntries = (WORD)wNumColors;// 设置颜色数目
for (iLoop=0; iLoop<(int)wNumColors;iLoop++)// 读取调色板
{
lpPal->palPalEntry[iLoop].peRed =lpbminfo->bmiColors[iLoop].rgbRed;// 读取三原色分量
lpPal->palPalEntry[iLoop].peGreen =lpbminfo->bmiColors[iLoop].rgbGreen;
lpPal->palPalEntry[iLoop].peBlue =lpbminfo->bmiColors[iLoop].rgbBlue;
lpPal->palPalEntry[iLoop].peFlags =0;// 保留位
}
bSuccess=pPal->CreatePalette(lpPal);// 按照逻辑调色板创建调色板,并返回指针
::GlobalUnlock((HGLOBAL) hLogPal);// 解除锁定
::GlobalFree((HGLOBAL) hLogPal);// 释放逻辑调色板
}
::GlobalUnlock((HGLOBAL) hDIB);// 解除锁定
return bSuccess;// 返回结果
}

/*************************************************************************
* 函数名称:GetBits(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib,指向DIB对象的指针
* 函数类型:LPSTR
* 函数功能:计算DIB像素的起始位置,并返回指向它的指针
************************************************************************/

LPSTR CDib::GetBits(LPSTR lpdib)
{
return (lpdib + ((LPBITMAPINFOHEADER)lpdib)->biSize+GetPalSize(lpdib));
// return (lpdib + *(LPDWORD)lpdib+GetPalSize(lpdib));
}

/*************************************************************************
* 函数名称:GetWidth(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib,指向DIB对象的指针
* 函数类型:DWORD
* 函数功能:该函数返回DIB中图象的宽度
************************************************************************/

DWORD CDib::GetWidth(LPSTR lpdib)
{
return ((LPBITMAPINFOHEADER)lpdib)->biWidth;//返回DIB宽度
}


/*************************************************************************
* 函数名称:GetHeight(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib ,指向DIB对象的指针
* 函数类型:DWORD
* 函数功能:该函数返回DIB中图象的高度
************************************************************************/


DWORD CDib::GetHeight(LPSTR lpdib)
{
return ((LPBITMAPINFOHEADER)lpdib)->biHeight;//返回DIB高度

}
/*************************************************************************
* 函数名称:GetPalSize(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib,指向DIB对象的指针
* 函数类型:WORD
* 函数功能:该函数返回DIB中调色板的大小
************************************************************************/

WORD CDib::GetPalSize(LPSTR lpdib)
{
return (WORD)(GetColorNum(lpdib) * sizeof(RGBQUAD));// 计算DIB中调色板的大小
}

/*************************************************************************
* 函数名称:GetColorNum(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib,指向DIB对象的指针
* 函数类型:WORD
* 函数功能:该函数返回DIB中调色板的颜色的种数
************************************************************************/
WORD CDib::GetColorNum(LPSTR lpdib)
{
long dwClrUsed = ((LPBITMAPINFOHEADER)lpdib)->biClrUsed; // 读取dwClrUsed值
if (dwClrUsed != 0)
{
return (WORD)dwClrUsed;// 如果dwClrUsed不为0,直接返回该值
}
WORD wBitCount = ((LPBITMAPINFOHEADER)lpdib)->biBitCount;// 读取biBitCount值
switch (wBitCount)// 按照像素的位数计算颜色数目
{
case 1:
return 2;

case 4:
return 16;

case 8:
return 256;

default:
return 0;
}
}

/*************************************************************************
* 函数名称:GetBitCount(LPSTR lpdib)
* 函数参数:
* LPSTR lpdib,指向DIB对象的指针
* 函数类型:WORD
* 函数功能:该函数返回DIBBitCount
************************************************************************/
WORD CDib::GetBitCount(LPSTR lpdib)
{
return ((LPBITMAPINFOHEADER)lpdib)->biBitCount;// 返回位宽
}

/*************************************************************************
* 函数名称:CopyObject (HGLOBAL hGlob)
* 函数参数:
* HGLOBAL hGlob ,要复制的内存区域
* 函数类型:HGLOBAL
* 函数功能:该函数复制指定的内存区域
************************************************************************/

HGLOBAL CDib::CopyObject (HGLOBAL hGlob)
{
if (hGlob== NULL)
return NULL;
DWORD dwLen = ::GlobalSize((HGLOBAL)hGlob);// 获取指定内存区域大小
HGLOBAL hTemp = ::GlobalAlloc(GHND, dwLen);// 分配新内存空间
if (hTemp!= NULL)// 判断分配是否成功
{
void* lpTemp = ::GlobalLock((HGLOBAL)hTemp);// 锁定
void* lp = ::GlobalLock((HGLOBAL) hGlob);
memcpy(lpTemp, lp, dwLen);// 复制
::GlobalUnlock(hTemp);// 解除锁定
::GlobalUnlock(hGlob);
}
return hTemp;
}

/*************************************************************************
* 函数名称:SaveFile(HGLOBAL hDib, CFile& file)
* 函数参数:
* HGLOBAL hDib,要保存的DIB
* CFile& file,保存文件CFile
* 函数类型:BOOL
* 函数功能:将指定的DIB对象保存到指定的CFile中
*************************************************************************/

BOOL CDib::SaveFile(HGLOBAL hDib, CFile& file)
{
if (hDib == NULL)
{
return FALSE;// 如果DIB为空,返回FALSE
}
lpbmihrd = (LPBITMAPINFOHEADER) ::GlobalLock((HGLOBAL) hDib);// 读取BITMAPINFO结构,并锁定
if (lpbmihrd == NULL)
{
return FALSE;// 为空,返回FALSE
}
bmfHeader.bfType = DIB_MARKER; // 填充文件头
dwDIBSize = *(LPDWORD)lpbmihrd + GetPalSize((LPSTR)lpbmihrd);// 文件头大小+颜色表大小
DWORD dwBmBitsSize;// 像素的大小
dwBmBitsSize =GetReqByteWidth((lpbmihrd->biWidth)*((DWORD)lpbmihrd->biBitCount)) * lpbmihrd->biHeight;// 大小为Width * Height
dwDIBSize += dwBmBitsSize;// 计算后DIB每行字节数为4的倍数时的大小
lpbmihrd->biSizeImage = dwBmBitsSize;// 更新biSizeImage
bmfHeader.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);// 文件大小
bmfHeader.bfReserved1 = 0;// 两个保留字
bmfHeader.bfReserved2 = 0;
bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpbmihrd->biSize// 计算偏移量bfOffBits
+ GetPalSize((LPSTR)lpbmihrd);
TRY
{
file.Write(&bmfHeader, sizeof(BITMAPFILEHEADER));// 写文件头
file.WriteHuge(lpbmihrd, dwDIBSize);// 写DIB头和像素
}
CATCH (CFileException, e)
{
::GlobalUnlock((HGLOBAL) hDib);// 解除锁定
THROW_LAST();// 抛出异常
}
END_CATCH
::GlobalUnlock((HGLOBAL) hDib);// 解除锁定
return TRUE;// 返回TRUE
}


/*************************************************************************
* 函数名称:LoadFile(CFile& file)
* 函数参数:
* CFile& file,要读取得文件文件CFile
* 函数类型:HGLOBAL
* 函数功能:将指定的文件中的DIB对象读到指定的内存区域中
*************************************************************************/

HGLOBAL CDib::LoadFile(CFile& file)
{

DWORD dwFileSize;

dwFileSize= file.GetLength();// 获取文件大小
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))// 读取DIB文件头
{
return NULL;// 大小不一致,返回NULL。
}
if (bmfHeader.bfType != DIB_MARKER)// 判断是否是DIB对象
{
return NULL;// 如果不是则返回NULL。
}
m_hDib= (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwFileSize-sizeof(BITMAPFILEHEADER));// 分配DIB内存
if (m_hDib== 0)
{
return NULL;// 分配失败,返回NULL
}
/////////////////////////////////////////////////////////////////////////
//给CDib类的成员变量赋值
lpdib = (LPSTR) ::GlobalLock((HGLOBAL) m_hDib);// 锁定
lpbminfo=(BITMAPINFO*)lpdib;
lpbmihrd=(BITMAPINFOHEADER*)lpdib;
lpRgbQuag=(RGBQUAD*)(lpdib+lpbmihrd->biSize);
int m_numberOfColors =GetColorNum((LPSTR)lpbmihrd);
if (lpbmihrd->biClrUsed == 0)
lpbmihrd->biClrUsed =m_numberOfColors;
DWORD colorTableSize = m_numberOfColors *sizeof(RGBQUAD);
lpDIBBits=lpdib+lpbmihrd->biSize+colorTableSize;
/////////////////////////////////////////////////////////////////////////

if (file.ReadHuge(lpdib, dwFileSize - sizeof(BITMAPFILEHEADER)) !=// 读像素
dwFileSize - sizeof(BITMAPFILEHEADER) )//大小不一致
{
::GlobalUnlock((HGLOBAL) m_hDib); // 解除锁定
::GlobalFree((HGLOBAL) m_hDib); // 释放内存
return NULL;
}
::GlobalUnlock((HGLOBAL) m_hDib);// 解除锁定
return m_hDib;// 返回DIB句柄
}

/*************************************************************************
* 函数名称:GetReqByteWidth(int bits)
* 函数参数:
* int bits,位数
* 函数类型:int
* 函数功能:获取需要的行字节数,应为4的倍数
*************************************************************************/
int CDib::GetReqByteWidth(int bits)
{
int getBytes=(bits + 31) / 32 * 4;
return getBytes;
}

/*************************************************************************
* 函数名称:GetRectWidth(LPCRECT lpRect)
* 函数参数:
* LPCRECT lpRect,指向矩形区域的指针
* 函数类型:long
* 函数功能:获取矩形区域的宽度
*************************************************************************/

long CDib::GetRectWidth(LPCRECT lpRect)
{
long nWidth=lpRect->right - lpRect->left;
return nWidth;
}
/*************************************************************************
* 函数名称:GetRectHeight(LPCRECT lpRect)
* 函数参数:
* LPCRECT lpRect,指向矩形区域的指针
* 函数类型:long
* 函数功能:获取矩形区域的高度
*************************************************************************/
long CDib::GetRectHeight(LPCRECT lpRect)
{
long nHeight=lpRect->bottom - lpRect->top;
return nHeight;
}

/*************************************************************************
* 函数名称:InitMembers()
* 函数类型: void
* 函数功能:初始化类的成员变量
*************************************************************************/
void CDib::InitMembers()
{
m_hDib=NULL;
lpbmihrd=NULL; // 指向BITMAPINFO结构的指针
lpdib=NULL;
lpDIBBits=NULL;
dwDIBSize=0;
lpRgbQuag=NULL;
}

/*************************************************************************
* 函数名称:ClearMemory()
* 函数类型: void
* 函数功能:复位类的成员变量
*************************************************************************/
void CDib::ClearMemory()
{
if(m_hDib!=NULL)
::GlobalFree(m_hDib);
lpbmihrd=NULL; // 指向BITMAPINFO结构的指针
lpdib=NULL;
dwDIBSize=0;
lpRgbQuag=NULL;
dwDIBSize=0;
}


”我游啊游”,“那边才是C边啊”,“哦”
2007-01-18 09:55
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
收藏
得分:0 

以下是调试CDIB类的对话框的头文件。
// txDlg.h : header file
//
#include "Dib.h"
#if !defined(AFX_TXDLG_H__3EDB2A5C_96A5_4A07_9EB6_58E72F1C1CF3__INCLUDED_)
#define AFX_TXDLG_H__3EDB2A5C_96A5_4A07_9EB6_58E72F1C1CF3__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CTxDlg dialog

class CTxDlg : public CDialog
{
// Construction
public:
CTxDlg(CWnd* pParent = NULL); // standard constructor
HGLOBAL GetHObject() const //获取Dib对象的句柄
{ return m_hDIB; }
CPalette* GetDocPal() const //获取调色板指针
{ return m_palDIB; }
CSize GetDocDimension() const//获取调色板大小
{ return m_sizeDoc; }
// Dialog Data
//{{AFX_DATA(CTxDlg)
enum { IDD = IDD_TX_DIALOG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTxDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
HICON m_hIcon;
HGLOBAL m_hDIB;
CSize m_sizeDoc;
CPalette *m_palDIB;
CDib mypic;
CFile picfile;
CDC *mydc;
HDC myh;
CRect rc1,rc2;
bool havepic;
// Generated message map functions
//{{AFX_MSG(CTxDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK();
afx_msg void OnButton1();
afx_msg void OnButton2();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_TXDLG_H__3EDB2A5C_96A5_4A07_9EB6_58E72F1C1CF3__INCLUDED_)


”我游啊游”,“那边才是C边啊”,“哦”
2007-01-18 09:57
sanjin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2005-12-14
收藏
得分:0 

调试CDIB类的对话框的CPP文件。
// txDlg.cpp : implementation file
//

#include "stdafx.h"
#include "tx.h"
#include "txDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
CAboutDlg();

// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA

// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL

// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTxDlg dialog

CTxDlg::CTxDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTxDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTxDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTxDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTxDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTxDlg, CDialog)
//{{AFX_MSG_MAP(CTxDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTxDlg message handlers

BOOL CTxDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
havepic=false;
return TRUE; // return TRUE unless you set the focus to a control
}

void CTxDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CTxDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
if(havepic==true)
mypic.DrawDib(myh,&rc1,this->GetHObject(),&rc2,this->GetDocPal());
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTxDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void CTxDlg::OnOK()
{
// TODO: Add extra validation here
// HGLOBAL m_hDIB;
//picfile.SetFilePath((LPCTSTR)"C:\\1.BMP");
picfile.Open((LPCTSTR)"c:\\1.bmp",CFile::modeRead | CFile::shareDenyWrite);
m_hDIB=mypic.LoadFile(picfile);
LPSTR IpDIB=(LPSTR)::GlobalLock((HGLOBAL)m_hDIB);
DWORD picwidth=mypic.GetWidth(IpDIB);
DWORD picheight=mypic.GetHeight(IpDIB);
m_sizeDoc = CSize((int)mypic.GetWidth(IpDIB), (int)mypic.GetHeight(IpDIB));// 设置文档大小
::GlobalUnlock((HGLOBAL) m_hDIB);
m_palDIB=new CPalette;
mypic.ConstructPalette(m_hDIB,m_palDIB);
rc1.left=0;
rc2.left=0;
rc1.right=picwidth;
rc2.right=picwidth;
rc1.top=0;
rc2.top=0;
rc1.bottom=picheight;
rc2.bottom=picheight;
mydc=this->GetDC();
myh=mydc->GetSafeHdc();
mypic.DrawDib(myh,&rc1,this->GetHObject(),&rc2,this->GetDocPal());
havepic=true;
}

void CTxDlg::OnButton1()
{
// TODO: Add your control notification handler code here

}

void CTxDlg::OnButton2()
{
// TODO: Add your control notification handler code here

}


”我游啊游”,“那边才是C边啊”,“哦”
2007-01-18 10:01
快速回复:加载位图代码,帮看一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016695 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved