// 获取当前窗体对应区域的图片 HBITMAP QnDC::GetBitmap(CWnd* pWnd) { CRect rect; pWnd->GetWindowRect(rect); m_pWnd->ScreenToClient(rect); return GetBitmapFromDC(rect); }
bool platform_support::load_img_from_dc(unsigned idx, HDC hdc) { if(idx < max_images) { #ifndef _MG_MINIMALGRAF if(m_specific->m_surf_img[idx]) UnloadBitmap(m_specific->m_surf_img[idx]); else m_specific->m_surf_img[idx] = (PBITMAP)calloc(1, sizeof(BITMAP)); #endif #if 0 if (LoadBitmapFromMem(m_specific->m_surf_window, m_specific->m_surf_img[idx], (const void *)LockDC(hdc, NULL, NULL, NULL, NULL), 0, "bmp") != 0) #else HDC tmpdc = CreateCompatibleDC(m_specific->m_surf_window); if(tmpdc == HDC_INVALID) return false; BitBlt(hdc, 0, 0, 0, 0, tmpdc, 0, 0, 0); if ( !GetBitmapFromDC(tmpdc, 0, 0, 240, 320, m_specific->m_surf_img[idx]) ) #endif { DeleteCompatibleDC(tmpdc); return false; } DeleteCompatibleDC(tmpdc); #if 0 FillBoxWithBitmap(HDC_SCREEN, 350, 0, 0, 0, m_specific->m_surf_img[idx]); //BitBlt(hdc, 0, 0, 0, 0, HDC_SCREEN, 500, 0, true); #endif #if 0 printf("load img: w=%d, h=%d, pitch=%d, pixels=%x\n", m_specific->m_surf_img[idx]->bmWidth, m_specific->m_surf_img[idx]->bmHeight, m_specific->m_surf_img[idx]->bmPitch, m_specific->m_surf_img[idx]->bmBits); #endif m_rbuf_img[idx].attach(m_specific->m_surf_img[idx]->bmBits, m_specific->m_surf_img[idx]->bmWidth, m_specific->m_surf_img[idx]->bmHeight, m_flip_y?(-m_specific->m_surf_img[idx]->bmPitch): m_specific->m_surf_img[idx]->bmPitch); return true; } return false; }
void GetCaretBitmaps (PCARETINFO pCaretInfo) { int i; int sx, sy; // convert to screen coordinates sx = pCaretInfo->x; sy = pCaretInfo->y; ClientToScreen (pCaretInfo->hOwner, &sx, &sy); // save normal bitmap first. #ifdef _USE_NEWGAL pCaretInfo->caret_bmp.bmBits = pCaretInfo->pNormal; GetBitmapFromDC (HDC_SCREEN, sx, sy, pCaretInfo->caret_bmp.bmWidth, pCaretInfo->caret_bmp.bmHeight, &pCaretInfo->caret_bmp); #else SaveScreenBox (sx, sy, pCaretInfo->nEffWidth, pCaretInfo->nEffHeight, pCaretInfo->pNormal); #endif // generate XOR bitmap. if (pCaretInfo->pBitmap) { BYTE* normal; BYTE* bitmap; BYTE* xored; normal = pCaretInfo->pNormal; bitmap = pCaretInfo->pBitmap->bmBits; xored = pCaretInfo->pXored; for (i = 0; i < pCaretInfo->nBytesNr; i++) xored[i] = normal[i] ^ bitmap[i]; } else { BYTE* normal; BYTE* xored; BYTE xor_byte; if (BITSPERPHYPIXEL < 8) xor_byte = 0x0F; else xor_byte = 0xFF; normal = pCaretInfo->pNormal; xored = pCaretInfo->pXored; for (i = 0; i < pCaretInfo->nBytesNr; i++) xored[i] = normal[i] ^ xor_byte; } }
bool platform_support::load_img_from_bitmap(unsigned idx, PBITMAP pbmp) { if(idx < max_images) { int ret = FALSE; #ifndef _MG_MINIMALGRAF if(m_specific->m_surf_img[idx]) UnloadBitmap(m_specific->m_surf_img[idx]); else m_specific->m_surf_img[idx] = (PBITMAP)calloc(1, sizeof(BITMAP)); #endif HDC tmpdc = CreateCompatibleDC(m_specific->m_surf_window); HDC tmpdc2 = CreateCompatibleDC(HDC_SCREEN); if(tmpdc == HDC_INVALID) return false; FillBoxWithBitmap(tmpdc2, 0, 0, pbmp->bmWidth, pbmp->bmHeight, pbmp); BitBlt(tmpdc2, 0, 0, 0, 0, tmpdc, 0, 0, 0); do { if (!GetBitmapFromDC(tmpdc, 0, 0, 240, 320, m_specific->m_surf_img[idx])) { ret = FALSE; break; } m_rbuf_img[idx].attach(m_specific->m_surf_img[idx]->bmBits, m_specific->m_surf_img[idx]->bmWidth, m_specific->m_surf_img[idx]->bmHeight, m_flip_y?(-m_specific->m_surf_img[idx]->bmPitch): m_specific->m_surf_img[idx]->bmPitch); ret = TRUE; } while(FALSE); DeleteCompatibleDC(tmpdc); DeleteCompatibleDC(tmpdc2); return ret; } return false; }