VC6,单文档,程序出现一个登录窗口,输入用户名等.和QQ那样的.
    为了让程序最开始就显示一个登录窗口,我在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中首先调用一个对话框,对话框程序中用了OnEraseBkgnd(CDC* pDC) 调用一个256色图片作背景.一切都成功.问题:
    启动程序后,出现登录窗口,显示正常.当我不输入,打开别的程序,如IE后,再点击登录窗口,只有上面的EDIT,BUTTN控件可见,再就程序一个大黑框框,图片就不见了.不知道如何下手了,是不是需要桌面DC?

解决方案 »

  1.   

    CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中首先调用一个对话框,对话框程序中用了OnEraseBkgnd(CDC* pDC) 调用一个256色图片作背景.一切都成功. 
    ===
    不需要在这里加的,在OnInitInstance中调用登陆界面就可以了
      

  2.   

    你在OnInitInstance函数的开头就调用登陆界面就行了。我的系统都是这么做的,没有任何问题。主窗口还没有开始创建之前调用就行了。
      

  3.   

    呵呵~~~~~,还是一样的,IE后,再点击登录窗口,只有上面的EDIT,BUTTN控件可见,再就程序一个大黑框框,应该是对话框点击后的显示问题,我查下对话框点击后的消息看看
      

  4.   

    把OnEraseBkgnd中的代码改到WM_PAINT消息中试试。
      

  5.   

    OnEraseBkgnd中的代码贴出来。另外听鹦鹉的,登录对话框放到OnInitInstance中。
    请大家支援灾区,积极捐款捐物。
      

  6.   

    BOOL CStrat::OnEraseBkgnd(CDC* pDC) 对话框类
    {
    CRect rc;
    GetClientRect(rc); m_pDC = pDC;
    if (TileBitmap(pDC, rc) == TRUE)
    return TRUE;
    else
    return CDialog::OnEraseBkgnd(pDC);
    } // End of OnEraseBkgnd
    *****************************************************************
    TileBitmap来自类 CBackgroundUtil  CBackgroundUtil代码:CBackgroundUtil.h
    class CBackgroundUtil  
    {
    public:
    BOOL SetBitmap(UINT uResourceID = 0);
    CBackgroundUtil();
    virtual ~CBackgroundUtil();protected:
    BOOL TileBitmap(CDC* pDC, CRect rc);
    BOOL GetBitmapAndPalette(UINT nIDResource, CBitmap& bitmap, CPalette& pal);
    // For background bitmap
    CBitmap m_BmpPattern;
    CPalette m_BmpPalette;
    int m_nBmpWidth;
    int m_nBmpHeight;
    };#endifCBackgroundUtil.CPP:
    CBackgroundUtil::CBackgroundUtil()
    {
    }
    CBackgroundUtil::~CBackgroundUtil()
    {
    m_BmpPattern.Detach();
    m_BmpPalette.Detach();
    }
    BOOL CBackgroundUtil::SetBitmap(UINT uResourceID)
    {
    BITMAP bm;
    BOOL bRet; // Detach previous resources
    m_BmpPattern.Detach();  
    m_BmpPalette.Detach();   // Default return value
    bRet = TRUE; // Load new bitmap
    if (uResourceID != 0)
    {
    bRet = GetBitmapAndPalette(uResourceID, m_BmpPattern, m_BmpPalette);
    // If all ok
    if (bRet == TRUE)
    {
    // Get dimension
    m_BmpPattern.GetBitmap(&bm);
    // Width of the bitmap
    m_nBmpWidth = bm.bmWidth;
    // Height of the bitmap
    m_nBmpHeight = bm.bmHeight;
    }
    } return bRet;
    } // End of SetBitmap
    BOOL CBackgroundUtil::GetBitmapAndPalette(UINT nIDResource, CBitmap & bitmap, CPalette & pal)
    {
    LPCTSTR lpszResourceName = (LPCTSTR)nIDResource; HBITMAP hBmp = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), 
    lpszResourceName, IMAGE_BITMAP, 0,0, LR_CREATEDIBSECTION); if (hBmp == NULL) return FALSE; bitmap.Attach(hBmp); // Create a logical palette for the bitmap
    DIBSECTION ds;
    BITMAPINFOHEADER &bmInfo = ds.dsBmih;
    bitmap.GetObject(sizeof(ds), &ds); int nColors = bmInfo.biClrUsed ? bmInfo.biClrUsed : 1 << bmInfo.biBitCount; // Create a halftone palette if colors > 256. 
    CClientDC dc(NULL); // Desktop DC if(nColors > 256)
    pal.CreateHalftonePalette(&dc);
    else
    {
    // Create the palette
    RGBQUAD *pRGB = new RGBQUAD[nColors];
    CDC memDC;
    memDC.CreateCompatibleDC(&dc);
    memDC.SelectObject( &bitmap );
    ::GetDIBColorTable( memDC, 0, nColors, pRGB );
    UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * nColors);
    LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
    pLP->palVersion = 0x300;
    pLP->palNumEntries = nColors;
    for (int i=0; i < nColors; i++)
    {
    pLP->palPalEntry[i].peRed = pRGB[i].rgbRed;
    pLP->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
    pLP->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
    pLP->palPalEntry[i].peFlags = 0;
    }
    pal.CreatePalette( pLP );
    delete[] pLP;
    delete[] pRGB;
    }
    return TRUE;
    } // End of GetBitmapAndPalette
    BOOL CBackgroundUtil::TileBitmap(CDC* pDC, CRect rc)
    {
    CDC MemDC; int x = 0, y = 0; // If there is a bitmap loaded
    if (m_BmpPattern.m_hObject != NULL)
    {
    MemDC.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = MemDC.SelectObject(&m_BmpPattern); // Tile the bitmap
    while (y < rc.Height()) 
    {
    while(x < rc.Width()) 
    {
    pDC->BitBlt(x, y, m_nBmpWidth, m_nBmpHeight, &MemDC, 0, 0, SRCCOPY);
    x += m_nBmpWidth;
    }
    x = 0;
    y += m_nBmpHeight;
    } MemDC.SelectObject(pOldBitmap); return TRUE;
    } return FALSE; // Normal behaviour
    } // End of TileBitmap
      

  7.   

    #include "BackgroundUtil.h"BOOL CStrat::OnInitDialog(){
       SetBitmap(IDB_BITMAP3); 显示图片
    }
      

  8.   

         SOS......
      

  9.   

    你这个CStrat是继承CBackgroundUtil的吗?
      

  10.   

    TO:你这个CStrat是继承CBackgroundUtil的吗?
    ==========================================
    class CStrat : public CDialog, public CBackgroundUtil
      

  11.   

    你用DC在窗体上画了东西.你打开IE或其它东西之后并没有对原来的窗口进行重绘当然会是哪样的效果了.在WM_PAINT消息哪里再做一下处理就OK了.每当窗口有变化时进行重绘,就不会黑黑的了.
      

  12.   

       在你的对话框的OnPaint函数里面这么处理:
           RECT rect;
    GetClientRect(&rect);
    m_bmpBk.Render(&dc, rect);
       m_bmpBk是背景图片句柄。