hur.cn - 华软网

 热门搜索

请教一个关于CDib类指针的问题。

  作者:未知    来源:网络    更新时间:2011/1/13
void CDynSplitView2::OnCanny()
{
// TODO: 在此增加命令措置惩罚程序代码
clearmem();
//获得文档类指针
CDSplitDoc *pDoc = (CDSplitDoc *)this->GetDocument();
//获得CDib类指针
CDib *pDib = pDoc->m_pDibInit;
LPBITMAPINFOHEADER lpBMIH = pDib->m_lpBMIH;
CSize sizeImage = pDib->GetDimensions();
int nWidth = sizeImage.cx;
int nHeight = sizeImage.cy;
int nSaveWidth = pDib->GetDibSaveDim().cx;
          ……
}
这是用Canny算子提取图像边缘的部份程序。
请问我该如何来定义m_pDibInit?
定义pDib指针后,如果不初始化,系统不会报错,然则运行后得不到原图像的数据指针(CDib *pDib = pDoc->m_pDibInit;)
我该怎么办,着急~~

#ifndef __CDIB_H
#define __CDIB_H

class CDib : public CObject
{
public:
    RGBQUAD* m_pRGB;
    BYTE* m_pData;
    UINT m_numberOfColors;
BOOL m_valid;
    BITMAPFILEHEADER bitmapFileHeader;

    BITMAPINFOHEADER* m_pBitmapInfoHeader;
    BITMAPINFO* m_pBitmapInfo;
int byBitCount;
DWORD dwWidthBytes;

LPBYTE m_lpImage; // DIB位图数据块地址
LPBITMAPINFOHEADER m_lpBMIH; // DIB信息头指针
    
public:
    CDib();
    ~CDib();

char m_fileName[256];
    char* GetFileName();
    BOOL IsValid();
    DWORD GetSize();
    UINT GetWidth();
    UINT GetHeight();
    UINT GetNumberOfColors();
    RGBQUAD* GetRGB();
    BYTE* GetData();
    BITMAPINFO* GetInfo();
DWORD GetDibWidthBytes();

WORD PaletteSize(LPBYTE lpDIB);
WORD DIBNumColors(LPBYTE lpDIB);
    void SaveFile(const CString filename);
CSize GetDimensions(); // 猎取以象素表示的DIB的宽度和高度
CSize GetDibSaveDim(); // 猎取DIB位图数据块的存储尺寸

public:
    void LoadFile(const char* dibFileName);

};

#endif
以上是我自己构造的CDib类的头资料。在线期待解答

---华软 网友回答---
  class="deleted_message"> 该回复于2011-01-13 15:35:57被版主删除
---华软网友回复---
我这有点代码看看对你有用不,懒的看你代码了,呵呵
C++">
HGLOBAL hDIB = pDoc->GetHObject();
if (hDIB != NULL)     // 判断DIB是否为空
{
LPSTR lpDibSection = (LPSTR) ::GlobalLock(hDIB);
int cxDIB = (int) pDoc->m_dib.GetWidth(lpDibSection); // 猎取DIB宽度
int cyDIB = (int) pDoc->m_dib.GetHeight(lpDibSection); // 猎取DIB高度
::GlobalUnlock(hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest= rcDIB;
pDoc->m_dib.DrawDib(pDC->m_hDC, &rcDest, pDoc->GetHObject(),// 重画DIB
&rcDIB, pDoc->GetDocPal());
}
else
{
pDC->TextOut(30,30,"能够通过资料菜单打开BMP资料,并显示,也可实现存储BMP资料!");
}

---华软网友回复---
一下是我CDib类头资料
C++">
// 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_)

---华软网友回复---
m_pDibInit.LoadFile(图像资料名);
---华软网友回复---
引用 4 楼 guanhuoz 的回复:
m_pDibInit.LoadFile(图像资料名);


请问m_pDibInit是CDSplitDoc中的一个什么参数?我该如何来定义它?
//获得CDib类指针
CDib *pDib = pDoc->m_pDibInit;像我这么定义和初始化,系统报错,提醒m_pDibInit未定义。我该怎么来定义m_pDibInit,让它指向当前打开图像的指针呢?
如果我只定义pDib指针,然后不初始化,系统不会报错,然则没法获得原图像的数据指针,所以没法对打开的图像举行措置惩罚。


---华软网友回复---
你得先在你的文档类定义一个CDib对象吧
CDib m_pDibInit;
然后你得用这个对象读取资料吧
m_pDibInit.LoadFile("XXXX");
然后你才能用吧CDib *pDib = pDoc->m_pDibInit;
---华软网友回复---
引用 6 楼 fqzlala 的回复:
你得先在你的文档类定义一个CDib对象吧
CDib m_pDibInit;
然后你得用这个对象读取资料吧
m_pDibInit.LoadFile("XXXX");
然后你才能用吧CDib *pDib = pDoc->m_pDibInit;


这么做的话,很明显系统会报错吧。m_pDibInit是CDib类型的,而pDib是CDib类型的指针,赋值时肯定会犯错的。
---华软网友回复---
哦,对,忘了是个*了,再取个地址      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。