小弟参照MSDN中的liblook源代码,添加了根据鼠标移动来复制粘贴位图。
liblook源代码的功能包括打开位图,复制,粘贴
代码如下:
void CDibView::OnEditCopy()
{
CDibDoc* pDoc = GetDocument();
// Clean clipboard of contents, and copy the DIB.
if (OpenClipboard())
{
BeginWaitCursor();
EmptyClipboard();
SetClipboardData (CF_DIB, CopyHandle((HANDLE) pDoc->GetHDIB()) );
CloseClipboard();
EndWaitCursor();
}
}void CDibView::OnEditPaste()
{
HDIB hNewDIB = NULL;
if (OpenClipboard())
{
BeginWaitCursor();
hNewDIB = (HDIB) CopyHandle(::GetClipboardData(CF_DIB));
CloseClipboard();
if (hNewDIB != NULL)
{
CDibDoc* pDoc = GetDocument();
pDoc->ReplaceHDIB(hNewDIB); // and free the old DIB
pDoc->InitDIBData();    // set up new size & palette
pDoc->SetModifiedFlag(TRUE); SetScrollSizes(MM_TEXT, pDoc->GetDocSize());
OnDoRealize((WPARAM)m_hWnd,0);  // realize the new palette
pDoc->UpdateAllViews(NULL);
}
EndWaitCursor();
}}
-----------------------------------------------------------------------------
以下是我添加的,添加了鼠标左键按下,移动,松开,鼠标右键双击截图功能
void CDibView::OnLButtonDown(UINT nFlags, CPoint point) 
{
cp1.x = point.x;
cp1.y = point.y;
state = 1;
CScrollView::OnLButtonDown(nFlags, point);
}void CDibView::OnMouseMove(UINT nFlags, CPoint point) 
{
if(nFlags == MK_LBUTTON)
{
cp2.x = point.x;
cp2.y = point.y;
Invalidate();
CView::OnMouseMove(nFlags, point);
}
CScrollView::OnMouseMove(nFlags, point);
}void CDibView::OnLButtonUp(UINT nFlags, CPoint point) 
{
state=0;
CScrollView::OnLButtonUp(nFlags, point);
}void CDibView::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
state = 0;
Invalidate();
ClientToScreen(&cp1);
ClientToScreen(&cp2);
CRect rc(cp1.x-1,cp1.y-1,cp2.x-1,cp2.y-1);
hBitmap=CopyScreenToBitmap(&rc); if (OpenClipboard())
{
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard(); }
CView::OnRButtonDblClk(nFlags, point);
CScrollView::OnRButtonDblClk(nFlags, point);
}
其中CopyScreenToBitmap函数网上有现成代码。我有再添加了一个功能就是轮廓提取,问题就是:比如,我打开一张256色位图,截取其中一个区域,粘贴,此时轮廓提取功能不能实现,不知是何解?如果将截取下来的区域粘贴到系统自带的画图工具里面,保存起来,再打开,就能实现其轮廓提取功能。
如果不清楚,本人邮箱[email protected],提供源代码。