基本代码:
INT i;
PAINTSTRUCT ps;
HDC hdc, hdcMem,hdcMemCopy;
HBITMAP hBmp, hBmpOld,hBmpCopy,hBmpCopyOld;
HFONT hFont,hOldFont;
POINT pt;
hdc = BeginPaint(hWnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
hdcMemCopy = CreateCompatibleDC(hdc);
SetBkMode(hdcMem, TRANSPARENT);
hBmpCopy = CreateCompatibleBitmap(hdc,BG_WIDTH,BG_HEIGHT);
//Draw Main background
hBmp = g_ExploreWallPaper;
hBmpCopyOld = (HBITMAP)SelectObject(hdcMemCopy, hBmp);
hBmpOld = (HBITMAP)SelectObject(hdcMem,hBmpCopy);
BitBlt(hdcMem, 0, 0,
BG_WIDTH,
BG_HEIGHT,
hdcMemCopy, 0, 0,
SRCCOPY);
pt.x = ps.rcPaint.left ;
pt.y = ps.rcPaint.top;
SetTextColor(hdcMem, TITLE_COLOR);
hFont = MyCreateFont(24,FW_HEAVY);
hOldFont = (HFONT)SelectObject(hdcMem,hFont);
DrawFileBrowseTitle(hdcMem);
SelectObject(hdcMem,hOldFont);
DeleteObject(hFont);
hFont = MyCreateFont(LITTLE_FONT_SIZE,FW_NORMAL);
SelectObject(hdcMem,hFont);
for(i = 0;i < NORMAL_EXPLORE_DRAW_COUNT;i ++)
Explore_DrawButton(hdcMem,hdcMemCopy,i,TRUE);
#if (INTSON_APP_TYPE == INTSON_SEL_EBOOK)
if(g_curFuncType == FUNCTION_EBOOK)
{
for(i = 0; i< BROWSE_NUMBER; i++)
{
if(m_ebookIndexInScreen == i)
continue;
DrawItemIcon(hdcMem,hdcMemCopy,i);
}
DrawItemIcon(hdcMem,hdcMemCopy,m_ebookIndexInScreen);
}
BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right - ps.rcPaint.left,
ps.rcPaint.bottom - ps.rcPaint.top,
hdcMem, pt.x, pt.y,
SRCCOPY);
SelectObject(hdcMem,hOldFont);
DeleteObject(hFont);
SelectObject(hdcMem,hBmpOld);
SelectObject(hdcMemCopy,hBmpCopyOld);
DeleteObject(hBmpCopy);
DeleteDC(hdcMemCopy);
DeleteDC(hdcMem);
EndPaint(hWnd, &ps);
代码分析:
1 步踌:
1) 创建内存dc:hdcMem, hdcMemcopy,为什么我门要创建两个在以上的代码中,原因是:一个全屏显示的也面中,可能有不同图片组成,如何把在同一个页面中的所有图片合成一张图片,第一个hdcMem就是一整张图片,hdcMemcopy就将不同的图片数据写入到hdcMem中。
2) 创建一个空的bitmap 大小跟屏幕大小一致, hBmpCopy = CreateCompatibleBitmap(hdc,BG_WIDTH,BG_HEIGHT);
3) 将数据写入内存dc : BitBlt(hdcMem, 0, 0, BG_WIDTH,BG_HEIGHT, hdcMemCopy, 0, 0,SRCCOPY);hdcMemCopy 里面数据的来源是通过: hBmpCopyOld = (HBITMAP)SelectObject(hdcMemCopy, hBmp)得到 。
4) 将内存dc的数据显示出来: BitBlt(ps.hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom,ps.rcPaint.top,hdcMem, pt.x, pt.y,SRCCOPY);
5) 恢复设备dc
6) 删除资源。