关于位图的几个问题,请各位指教

SKJG 2003-09-29 07:59:21
1.如何把一个CBitmap内的位图复制到剪切板
2.如何快速的,无闪烁的把CBitmap内的位图显示在CScrollView上
3.我用StretchBlt放缩显示图片时,显示的结果很差,如何解决。
请各位赐教!
...全文
39 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
eejeff 2004-03-26
  • 打赏
  • 举报
回复
你应该把你的BMP数据复制一份
然后把复制的数据放到剪切板
romanticist 2003-10-14
  • 打赏
  • 举报
回复
HBITMAP CopyScreenToBitmap(LPRECT lpRect)
//lpRect 代表选定区域
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return NULL;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect- >left;
nY = lpRect- >top;
nX2 = lpRect- >right;
nY2 = lpRect- >bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX 〈0)
nX = 0;
if (nY 〈 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}

SKJG 2003-10-12
  • 打赏
  • 举报
回复
不至于吧!!!
各位老大,帮帮忙,想想办法呀!!!!
wangzi163 2003-10-11
  • 打赏
  • 举报
回复
显卡,内存有问题?
SKJG 2003-10-11
  • 打赏
  • 举报
回复
"你居然是做日本软件的" 什么意思啊????

HBITMAP 没有问题
我就是用这个handle在CView上画图的
daylight1980 2003-10-10
  • 打赏
  • 举报
回复
根本就没复制到图/

你可以打开画图版粘贴以下就知道了。

不说了,你居然是做日本软件的。

买身求荣啊!!!
mct1025 2003-10-10
  • 打赏
  • 举报
回复
肯定是复制时,HBITMAP 的问题,检查一下代码
SKJG 2003-10-10
  • 打赏
  • 举报
回复
我就是在画图里面粘贴的
结果是一片黑!!!
romanticist 2003-10-03
  • 打赏
  • 举报
回复
22.如何快速的,无闪烁的把CBitmap内的位图显示在CScrollView上
BOOL m_VScroll
BOOL m_HScroll;
int m_nYSrc;
int m_nXSrc;
int m_iHScroll;
int m_iVScroll;
HBITMAP m_hbitmap;
HBITMAP m_hSrcbitmap;
DisplayImage()
{
BITMAP bmp;
GetObject(m_hSrcbitmap,sizeof(BITMAP),&bmp);
int iBMPWidth = bmp.bmWidth;
int iBMPHeight = bmp.bmHeight;
DeleteObject(&bmp);
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(m_hSrcbitmap);
CDC *dc =m_Static_Picture.GetDC();
CDC TempDC;
TempDC.CreateCompatibleDC(NULL);
HBITMAP hmemBMP = CreateCompatibleBitmap ( dc->m_hDC,m_SRCClientRect.Width(),m_SRCClientRect.Height());
TempDC.SelectObject(hmemBMP);
//画像の表示
//表示領域の背景色を白に設定する
TempDC.FillRect(m_SRCClientRect, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
TempDC.BitBlt(m_nXSrc,m_nYSrc,iBMPWidth,iBMPHeight,&MemDC,m_iHScroll,m_iVScroll,SRCCOPY);
DeleteDC(MemDC);
CDC SaveDC;
SaveDC.CreateCompatibleDC(NULL);
HBITMAP hmemBM = CreateCompatibleBitmap ( dc->m_hDC,m_SRCClientRect.Width(),m_SRCClientRect.Height());
HBITMAP oldBit = (HBITMAP)SaveDC.SelectObject(hmemBM);
SaveDC.BitBlt(0,0,m_SRCClientRect.Width(),m_SRCClientRect.Height(),&TempDC,0,0,SRCCOPY);
if(m_hbitmap != NULL)
DeleteObject(m_hbitmap);
m_hbitmap = (HBITMAP)SaveDC.SelectObject(oldBit);
if(m_hbitmap == NULL)
return -1;
m_Static_Picture.SetBitmap(m_hbitmap);
m_Static_Picture.ReleaseDC(dc);

DeleteObject(hmemBMP);
DeleteDC(TempDC);
DeleteDC(SaveDC);
DeleteObject(oldBit);
return NO_ERR;
}
:OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
m_iVScroll = GetScrollPos(SB_VERT);

switch(nSBCode)
{
case SB_THUMBTRACK:
m_iVScroll = nPos;
break;
case SB_LINEUP:
m_iVScroll -= 2;
break;
case SB_LINEDOWN:
m_iVScroll += 2;
break;
case SB_PAGEUP:
m_iVScroll -= 4;
break;
case SB_PAGEDOWN:
m_iVScroll += 4;
break;
}

SetScrollPos(SB_VERT, m_iVScroll);
Invalidate();
DisplayImage();
COleControl::OnVScroll(nSBCode, nPos, pScrollBar);
}
OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: この位置にメッセージ ハンドラ用のコードを追加するかまたはデフォルトの処理を呼び出してください
m_iHScroll = GetScrollPos(SB_HORZ);
switch(nSBCode)
{
case SB_THUMBTRACK:
m_iHScroll = nPos;
break;
case SB_LINEUP:
m_iHScroll -= 2;
break;
case SB_LINEDOWN:
m_iHScroll += 2;
break;
case SB_PAGEUP:
m_iHScroll -= 4;
break;
case SB_PAGEDOWN:
m_iHScroll += 4;
break;
}
SetScrollPos(SB_HORZ, m_iHScroll);
DisplayImage();
Invalidate();

COleControl::OnHScroll(nSBCode, nPos, pScrollBar);
}
可以参考一下
romanticist 2003-10-03
  • 打赏
  • 举报
回复
3.我用StretchBlt放缩显示图片时,显示的结果很差,如何解决。
先用CopyImage放缩,然后用BitBlt显示
wangzi163 2003-10-01
  • 打赏
  • 举报
回复
还是用DIB 吧
mct1025 2003-10-01
  • 打赏
  • 举报
回复
复制好像没有问题
你可以用windows的画图程序,粘贴检查一下

取出的时候,使用
CBitmap bmp;
bmp.Attach(GetClipboardData(CF_BITMAP));
SKJG 2003-09-30
  • 打赏
  • 举报
回复
复制位图老是有问题。
复制是没事,
但是粘贴的结果却是黑白图。
我的图形是JPEG格式的,
我用IPicture把他载入内存,
取得位图Handle
这些过程肯定没错
载入的图形可以在通过Handle使用BitBlt在CScrollView中显示出来,
以下是我的复制代码
我不知道错在那里
//m_BMPX,m_BMPY是位图的高度和宽度
//m_pMemDC是载有位图的CDC指针
//m_pMemDC和m_BMPX和m_BMPY肯定没问题,我就是用他们在ScrollView上显示图片的
CBitmap Bitmap;
CDC MemDC;
MemDC.CreateCompatibleDC(GetDC());
Bitmap.CreateCompatibleBitmap(&MemDC,m_BMPX,m_BMPY);

MemDC.SelectObject(&Bitmap);
MemDC.BitBlt(0,0,m_BMPX,m_BMPY,m_pMemDC,0,0,SRCCOPY);
OpenClipboard();
EmptyClipboard();
SetClipboardData (CF_BITMAP, Bitmap.GetSafeHandle() ) ;
CloseClipboard () ;
MemDC.DeleteDC();

Bitmap.Detach();
mct1025 2003-09-29
  • 打赏
  • 举报
回复
1, if ( !OpenClipboard() )
{
AfxMessageBox( "Cannot open the Clipboard" );
return;
}
// Remove the current Clipboard contents
if( !EmptyClipboard() )
{
AfxMessageBox( "Cannot empty the Clipboard" );
return;
}
// Get the currently selected data
// HBITMAP hbmp;
if ( ::SetClipboardData( CF_BITMAP, hbmp ) == NULL )//复制到剪贴板
{
AfxMessageBox( "Unable to set Clipboard data" );
// CloseClipboard();
}
hbmp = (HBITMAP)::GetClipboardData(CF_BITMAP);//取出
// ...
CloseClipboard();

2, CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);

// Select the bitmap into the in-memory DC
CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
SetStretchBltMode
StretchBlt
dcMemory.SelectObject(pOldBitmap);

3,StretchBlt前,加一句dc.SetStretchBltMode(COLORONCOLOR);

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧