怎样让我的DIB图像显示在客户区?
在程序中加入一个Dib类,然后再C**View的OnDraw(CDC* pDC)函数中显示。可总没有显示,拜托哪位大侠帮我看下:
void C**View::OnDraw(CDC* pDC)
{
CMAP3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); pDoc->m_pDib->Draw(pDC,(0,0),(300,100));
} DIB的现实函数如下:
/*-----------------------------------------------------------------------------------
Draw(CDC* pDC, CPoint origin, CSize size)
函数功能: 该函数调用Win32函数StretchDIBits来将CDib对象输出到显示器(或打印机)上,
位图会被拉伸到给定的矩形。
参数:
pDC 指向显示器或打印机设备环境的指针,他将接受DIB图像。
origin CPoint对象,它保存了显示DIB时的逻辑坐标。
size CSize对象,它保存了显示DIB时的矩形的逻辑宽度和高度。
返回值 如果成功返回TRUE。
-----------------------------------------------------------------------------------*/
BOOL CDib::Draw(CDC* pDC, CPoint origin, CSize size)
{
if(m_lpBMIH == NULL) return FALSE;
if(m_hPalette != NULL) {
::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
}
pDC->SetStretchBltMode(COLORONCOLOR);
::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;
}附:CDIB类
// cdib.h declaration for Inside Visual C++ CDib class#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIBclass CDib : public CObject
{
enum Alloc {noAlloc, crtAlloc, heapAlloc};
DECLARE_SERIAL(CDib)
public:
LPVOID m_lpvColorTable;
HBITMAP m_hBitmap;
LPBYTE m_lpImage; // starting address of DIB bits
LPBITMAPINFOHEADER m_lpBMIH; // buffer containing the BITMAPINFOHEADER// HANDLE m_hFile;
private:
HGLOBAL m_hGlobal; // For external windows we need to free;
// could be allocated by this class or allocated externally
Alloc m_nBmihAlloc;
Alloc m_nImageAlloc;
DWORD m_dwSizeImage; // of bits -- not BITMAPINFOHEADER or BITMAPFILEHEADER
int m_nColorTableEntries;
HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
public:
CDib();
CDib(CSize size, int nBitCount); // builds BITMAPINFOHEADER
~CDib();
int GetSizeImage() {return m_dwSizeImage;}
int GetSizeHeader()
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
CSize GetDimensions();
BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE); BOOL CopyToMapFile(const char* strPathname);
BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
BOOL Draw(CDC* pDC, CPoint origin, CSize size); // until we implemnt CreateDibSection
HBITMAP CreateSection(CDC* pDC = NULL);
UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
BOOL MakePalette();
BOOL SetSystemPalette(CDC* pDC);
BOOL Compress(CDC* pDC, BOOL bCompress = TRUE); // FALSE means decompress
HBITMAP CreateBitmap(CDC* pDC);
BOOL Read(CFile* pFile);
BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
BOOL Write(CFile* pFile);
void Serialize(CArchive& ar);
void Empty();
private:
void DetachMapFile();
void ComputePaletteSize(int nBitCount);
void ComputeMetrics();
};
#endif // _INSIDE_VISUAL_CPP_CDIB
在程序中加入一个Dib类,然后再C**View的OnDraw(CDC* pDC)函数中显示。可总没有显示,拜托哪位大侠帮我看下:
void C**View::OnDraw(CDC* pDC)
{
CMAP3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); pDoc->m_pDib->Draw(pDC,(0,0),(300,100));
} DIB的现实函数如下:
/*-----------------------------------------------------------------------------------
Draw(CDC* pDC, CPoint origin, CSize size)
函数功能: 该函数调用Win32函数StretchDIBits来将CDib对象输出到显示器(或打印机)上,
位图会被拉伸到给定的矩形。
参数:
pDC 指向显示器或打印机设备环境的指针,他将接受DIB图像。
origin CPoint对象,它保存了显示DIB时的逻辑坐标。
size CSize对象,它保存了显示DIB时的矩形的逻辑宽度和高度。
返回值 如果成功返回TRUE。
-----------------------------------------------------------------------------------*/
BOOL CDib::Draw(CDC* pDC, CPoint origin, CSize size)
{
if(m_lpBMIH == NULL) return FALSE;
if(m_hPalette != NULL) {
::SelectPalette(pDC->GetSafeHdc(), m_hPalette, TRUE);
}
pDC->SetStretchBltMode(COLORONCOLOR);
::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;
}附:CDIB类
// cdib.h declaration for Inside Visual C++ CDib class#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIBclass CDib : public CObject
{
enum Alloc {noAlloc, crtAlloc, heapAlloc};
DECLARE_SERIAL(CDib)
public:
LPVOID m_lpvColorTable;
HBITMAP m_hBitmap;
LPBYTE m_lpImage; // starting address of DIB bits
LPBITMAPINFOHEADER m_lpBMIH; // buffer containing the BITMAPINFOHEADER// HANDLE m_hFile;
private:
HGLOBAL m_hGlobal; // For external windows we need to free;
// could be allocated by this class or allocated externally
Alloc m_nBmihAlloc;
Alloc m_nImageAlloc;
DWORD m_dwSizeImage; // of bits -- not BITMAPINFOHEADER or BITMAPFILEHEADER
int m_nColorTableEntries;
HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
public:
CDib();
CDib(CSize size, int nBitCount); // builds BITMAPINFOHEADER
~CDib();
int GetSizeImage() {return m_dwSizeImage;}
int GetSizeHeader()
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
CSize GetDimensions();
BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE); BOOL CopyToMapFile(const char* strPathname);
BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
BOOL Draw(CDC* pDC, CPoint origin, CSize size); // until we implemnt CreateDibSection
HBITMAP CreateSection(CDC* pDC = NULL);
UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
BOOL MakePalette();
BOOL SetSystemPalette(CDC* pDC);
BOOL Compress(CDC* pDC, BOOL bCompress = TRUE); // FALSE means decompress
HBITMAP CreateBitmap(CDC* pDC);
BOOL Read(CFile* pFile);
BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
BOOL Write(CFile* pFile);
void Serialize(CArchive& ar);
void Empty();
private:
void DetachMapFile();
void ComputePaletteSize(int nBitCount);
void ComputeMetrics();
};
#endif // _INSIDE_VISUAL_CPP_CDIB
解决方案 »
- windows程序中如何出现console窗口
- 关于用SOCKET实现广播功能的问题!求解
- 不知谁知道??
- 关于非MFC 创建窗体时入口函数申明的问题。
- 请问调用WSAGetOverlppedResult(),错误代码为10051是什么原因导致的?谢谢
- 如何得到CMD的返回信息???
- 菜鸟问题:如何将一个已生成的文件保存到指定的目录?
- 问一个菜问题,在创建了一个dc后,如果不让它selectObject 一个bitmap的句柄,为何就不能将画在这个dc上的东东bitblt 到别的dc里
- 我想给对话框添加WM_NCHITTEST消息处理函数,可是MFC WIZARD里没有,该怎么添加呢?
- win9x裝上winsock2,就能使用SOCK_RAW,和SIO_RCVALL选择吗? 然后就能抓包吗?
- 利用ACE库开发的程序出现link错误,请高手解答,谢谢
- VC6.0中,ADODC控件如何单纯用代码设置...
看m_lpImage 内存里的值是什么。
我也是新手,不清楚。
pDoc->m_pDib要加载位图吗? 不是直接在Menu里打开就可以了吗?
{
CMAP3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc); //pDoc->m_pDib->Draw(pDC,(0,0),(300,300)); CDC dcMemory;
CBitmap* pOldBmp;
dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(m_pBmp);
pDC->BitBlt(m_orgpoint.x,m_orgpoint.y,m_size.cx,m_size.cy,
&dcMemory,0,0,SRCCOPY);
dcMemory.SelectObject(pOldBmp);}
VC 可不同于BCB,在这里它只给了你一个框架,告诉你功能代码在哪儿填!但具体的功能代码是需要自己手工录入的!其实如果你直接在VIEW里面响应更好。