我自定义一个可以显示BMP图片的控件(派生CStatic),是从剪切板里读取的图片
void CGMapCtrl::GetGMapCtrlMapFmClipBd()
{
if(!toClipboard(m_pWebCtrl->m_hWnd))
return;
CPaintDC dc(this);
CRect rect;
GetClientRect(rect); CPaintDC* pDC = &dc;
pDC->SetViewportOrg(0,0);
if (IsClipboardFormatAvailable(CF_DIB))
// if (IsClipboardFormatAvailable(CF_BITMAP))
{
// a DIB is in the clipboard, draw it out
GLOBALHANDLE hGMem;
LPBITMAPINFO lpBI;
BYTE* pDIBBits;
CDC memdc; OpenClipboard();
hGMem = GetClipboardData(CF_DIB);
// hGMem = GetClipboardData(CF_BITMAP);
lpBI = (LPBITMAPINFO)GlobalLock(hGMem);
// point to DIB bits after BITMAPINFO object
pDIBBits = (BYTE*)(lpBI);
pDIBBits += sizeof(BITMAPINFO) -4;
if (m_hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight); memdc.CreateCompatibleDC(&dc);
HANDLE pOld = memdc.SelectObject(m_hBitmap);
memdc.SetMapMode(MM_TEXT); ::StretchDIBits(memdc.m_hDC,
0, 0, lpBI->bmiHeader.biWidth/*rect.Width()*/, lpBI->bmiHeader.biHeight/*rect.Height()*/,
0, 0, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight,
pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY); GlobalUnlock(hGMem);
CloseClipboard();
memdc.SelectObject(pOld); }
Invalidate();}void CGMapCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CPaintDC* pDC = &dc; CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
// pDC->SetViewportOrg(0,0);
if (!m_hBitmap)
return; CBitmap bitMap;
bitMap.Attach(m_hBitmap); BITMAP bmpInfo;
bitMap.GetBitmap(&bmpInfo); HANDLE pOld = MemDC.SelectObject(m_hBitmap); pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
bitMap.Detach(); MemDC.SelectObject(pOld);
}虽然图片能显示出来,但整体向左移了几个象素,在这几个象素的区域却填充了图片最右边的几排象素的图像,百思不得其解。
void CGMapCtrl::GetGMapCtrlMapFmClipBd()
{
if(!toClipboard(m_pWebCtrl->m_hWnd))
return;
CPaintDC dc(this);
CRect rect;
GetClientRect(rect); CPaintDC* pDC = &dc;
pDC->SetViewportOrg(0,0);
if (IsClipboardFormatAvailable(CF_DIB))
// if (IsClipboardFormatAvailable(CF_BITMAP))
{
// a DIB is in the clipboard, draw it out
GLOBALHANDLE hGMem;
LPBITMAPINFO lpBI;
BYTE* pDIBBits;
CDC memdc; OpenClipboard();
hGMem = GetClipboardData(CF_DIB);
// hGMem = GetClipboardData(CF_BITMAP);
lpBI = (LPBITMAPINFO)GlobalLock(hGMem);
// point to DIB bits after BITMAPINFO object
pDIBBits = (BYTE*)(lpBI);
pDIBBits += sizeof(BITMAPINFO) -4;
if (m_hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight); memdc.CreateCompatibleDC(&dc);
HANDLE pOld = memdc.SelectObject(m_hBitmap);
memdc.SetMapMode(MM_TEXT); ::StretchDIBits(memdc.m_hDC,
0, 0, lpBI->bmiHeader.biWidth/*rect.Width()*/, lpBI->bmiHeader.biHeight/*rect.Height()*/,
0, 0, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight,
pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY); GlobalUnlock(hGMem);
CloseClipboard();
memdc.SelectObject(pOld); }
Invalidate();}void CGMapCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CPaintDC* pDC = &dc; CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
// pDC->SetViewportOrg(0,0);
if (!m_hBitmap)
return; CBitmap bitMap;
bitMap.Attach(m_hBitmap); BITMAP bmpInfo;
bitMap.GetBitmap(&bmpInfo); HANDLE pOld = MemDC.SelectObject(m_hBitmap); pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
bitMap.Detach(); MemDC.SelectObject(pOld);
}虽然图片能显示出来,但整体向左移了几个象素,在这几个象素的区域却填充了图片最右边的几排象素的图像,百思不得其解。
解决方案 »
- 求助啊!关于加载动态库内存泄露
- 对话框主程序hang up,但是为什么还可以拖动对话框呢?
- vc中怎么建立一个 动态的矩阵的类啊
- CRecordset::GetFieldValue()提示"无效的描述符索引"错误怎么解决? ,急!!分不够再加!!!
- 因重复定票,现多出一张4号下午17:36广州到柳州K36硬卧的火车票:途经韶关,坪石,衡阳,永州,东安,桂林,柳州.票价290大洋(原价)。需
- 初学者的菜问题
- 奇怪,CHotKeyCtrl的问题
- 关于ntohs()问题?
- 自定义消息的参数,马上给分!!!!
- 不知道怎么用opengl,从何入手?
- 线程插入问题。
- 如何编写代码读取电脑的机器码或读取硬盘码?
pDIBBits += sizeof(BITMAPINFO) -4;
???????????????
偏移不对.