我做了个类,主要是负责管理几幅图片及其在客户区的显示,代码如下:class Lights  
{
public:
void LDraw(int num, int x, int y,int k);
void LCreat(CDC* pDC);
Lights();
virtual ~Lights();
public:
CBitmap Lbmp[3];
CRect LObmp[4];
CDC LDC[3];
CDC* LCDC;
bool LCreated;};Lights::Lights()//在构造函数中先把图放进去
{
Lbmp[0].LoadBitmap(IDB_LMASK);
Lbmp[1].LoadBitmap(IDB_L1);
Lbmp[2].LoadBitmap(IDB_L2);
LObmp[0].SetRect(0,0,75,100);
LObmp[1].SetRect(75,0,150,100);
LObmp[2].SetRect(150,0,225,100);
LObmp[3].SetRect(225,0,300,100); LCreated=0;//标记未与视类DC同步
}Lights::~Lights()
{}void Lights::LCreat(CDC* pDC)//问题在这!!!
{
if(LCreated==0)//如果未与view类DC同步则进行同步,否则跳过
{ for(int i=0;i<=2;i++)
{LDC[i].CreateCompatibleDC(pDC);}
LCreated=1;
}
for(int i=0;i<=2;i++)//把图选进源DC中
{LDC[i].SelectObject(&Lbmp[i]);}
LCDC=pDC;
}void Lights::LDraw(int num, int x, int y,int k)//显示图,问题并不出在这,不说了。
{
int t;
switch(num)
{
case 0: t=2;break;
case 1: t=0;break;
case 2: t=3;break;
case 3: t=1;break;
}
LCDC->BitBlt(75*x-75,100*y-50,75*x,100*y+50,&LDC[0],LObmp[t].left,LObmp[t].top,MERGEPAINT);
LCDC->BitBlt(75*x-75,100*y-50,75*x,100*y+50,&LDC[k+1],LObmp[t].left,LObmp[t].top,SRCAND);}
问题是我如果在view类中放入一个Lights类成员,那么对这个成员的函数使用都没问题;
但假如我再做一个类(且称其为A类),在A类钟放一个public的lights类成员,再把A类成员放在view类时,在调用
A.light.LCreat(CDC* pDC)函数时就会除错,就是那个“终止、重试、忽略”的消息框,这是为什么啊???
不就是套了层“皮”而已吗??????

解决方案 »

  1.   

    出现这种错误时一般会告诉你在哪个函数做什么事情时出错的
    retry后直接看当时在做什么。
      

  2.   

    单步跟踪一下,LCreat(CDC* pDC)是不是被调用多次了???
      

  3.   

    即使被多次调用也不该出错啊,因为里面对if(LCreated==0)的条件判断保证了LDC[i].CreateCompatibleDC(pDC);} 只执行一次
      

  4.   

    可能是你Create时 pDC 都没准备好。
      

  5.   

    应该没问题啊,在OnDraw函数里用的,pDC肯定有啊!
      

  6.   

    好像到这里有问题了
    BOOL CDC::Attach(HDC hDC)
    {
    ASSERT(m_hDC == NULL);      // only attach once, detach on destroy
    ASSERT(m_hAttribDC == NULL);    // only attach to an empty DC if (hDC == NULL)
    return FALSE;
    CHandleMap* pMap = afxMapHDC(TRUE); // create map if not exist
    ASSERT(pMap != NULL);
    pMap->SetPermanent(m_hDC = hDC, this);-》 SetAttribDC(m_hDC);     // Default to same as output
    return TRUE;
    }
    但我对MFC源代码不太了解,请大家帮我看看吧!
      

  7.   

    CreateCompatibleDC()函数会调用Attach,
    单步调试一下,看看LDC[i]是不是在其它地方也调用了CreateCompatibleDC???
      

  8.   

    void Lights::LCreat(CDC* pDC)//问题在这!!! 

    if(LCreated==0)//如果未与view类DC同步则进行同步,否则跳过 
    { for(int i=0;i <=2;i++) 
    {LDC[i].CreateCompatibleDC(pDC);} 
    LCreated=1; 

    for(int i=0;i <=2;i++)//把图选进源DC中 
    {LDC[i].SelectObject(&Lbmp[i]);} 
    LCDC=pDC; // <--这个pDC如果是GetDC() Get回来的,则尽量不要保存这些临时的指针,因为它可能会被释放或者析构掉,而引起莫名其妙的错误.
      

  9.   

    可以改改你的LDraw(),从而避免上面的问题..void Lights::LDraw(CDC *pDC, int num, int x, int y,int k)//显示图,问题并不出在这,不说了。 

    int t; 
    switch(num) 

    case 0: t=2;break; 
    case 1: t=0;break; 
    case 2: t=3;break; 
    case 3: t=1;break; 

    pDC->BitBlt(75*x-75,100*y-50,75*x,100*y+50,&LDC[0],LObmp[t].left,LObmp[t].top,MERGEPAINT); 
    pDC->BitBlt(75*x-75,100*y-50,75*x,100*y+50,&LDC[k+1],LObmp[t].left,LObmp[t].top,SRCAND); } 要显示调用时,传给它个DC就行了..
      

  10.   

    谢谢各位,不过我不明白为什么CreateCompatibleDC(pDC);} 只让用一次呢?
    如果我又想把这图向另一DC上贴该怎么做呢?
      

  11.   

    CreateCompatibleDC()会调用Attach,而Attach只能一次,
    ASSERT(m_hDC == NULL);      // only attach once, detach on destroy 
    ASSERT(m_hAttribDC == NULL);    // only attach to an empty DC 

    如果又想把这图向另一DC上贴,用CreateCompatibleDC(NULL),一次就够了