VC6,单文档,程序出现一个登录窗口,输入用户名等.和QQ那样的.
为了让程序最开始就显示一个登录窗口,我在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中首先调用一个对话框,对话框程序中用了OnEraseBkgnd(CDC* pDC) 调用一个256色图片作背景.一切都成功.问题:
启动程序后,出现登录窗口,显示正常.当我不输入,打开别的程序,如IE后,再点击登录窗口,只有上面的EDIT,BUTTN控件可见,再就程序一个大黑框框,图片就不见了.不知道如何下手了,是不是需要桌面DC?
为了让程序最开始就显示一个登录窗口,我在CMainFrame::PreCreateWindow(CREATESTRUCT& cs)中首先调用一个对话框,对话框程序中用了OnEraseBkgnd(CDC* pDC) 调用一个256色图片作背景.一切都成功.问题:
启动程序后,出现登录窗口,显示正常.当我不输入,打开别的程序,如IE后,再点击登录窗口,只有上面的EDIT,BUTTN控件可见,再就程序一个大黑框框,图片就不见了.不知道如何下手了,是不是需要桌面DC?
===
不需要在这里加的,在OnInitInstance中调用登陆界面就可以了
{
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
SetBitmap(IDB_BITMAP3); 显示图片
}
==========================================
class CStrat : public CDialog, public CBackgroundUtil
RECT rect;
GetClientRect(&rect);
m_bmpBk.Render(&dc, rect);
m_bmpBk是背景图片句柄。