中秋节打扰大家真不好意思,但我实在不知道这个问题高怎么弄,谢谢各位了。单文档MFC程序,在滚动视图的客户区画了一条直线,要将这条直线复制到word,但是只能选中可见部分而不能通过滚动来选中全部,代码是这样的
void CCopyView::OnDraw(CDC* pDC)
{
CCopyDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
//画一条直线
pDC->MoveTo(20,20);
pDC->LineTo(80,1000);
}
void CCopyView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate(); // 设置滚动范围
SetScrollSizes(MM_TEXT,CSize(1000,1600));
}
鼠标选中void CCopyView::OnLButtonDown(UINT nFlags, CPoint point)
{

m_Anchor.x=point.x;
m_Anchor.y=point.y;
//重置原点位置
m_OldPoint.x=m_Anchor.x;
m_OldPoint.y=m_Anchor.y;
m_FirstPoint.x=point.x;
m_FirstPoint.y=point.y;
m_bLeftButtonDown=TRUE;
CScrollView::OnLButtonDown(nFlags, point);


}
void CCopyView::OnMouseMove(UINT nFlags, CPoint point)
{
//在状态栏上显示鼠标坐标
    CString xStr,yStr;
xStr.Format(_T("当前X坐标:%d"),point.x);
yStr.Format(_T("当前Y坐标:%d"),point.y);
CMainFrame *pWnd=(CMainFrame*)AfxGetMainWnd();
pWnd->m_wndStatusBar.SetPaneInfo(1,ID_SEPARATOR,SBPS_NORMAL,100);
pWnd->m_wndStatusBar.SetPaneInfo(2,ID_SEPARATOR,SBPS_NORMAL,100);
pWnd->m_wndStatusBar.SetPaneText(1,xStr,TRUE);
pWnd->m_wndStatusBar.SetPaneText(2,yStr,TRUE);
if(m_bLeftButtonDown==TRUE)
{
//实现矩形拉伸效果
int nOldMode;
CClientDC *pDC=new CClientDC(this);
nOldMode=pDC->GetROP2();
pDC->SetROP2(R2_NOT);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(m_OldPoint.x,m_OldPoint.y,m_Anchor.x,m_Anchor.y);
pDC->Rectangle(m_Anchor.x,m_Anchor.y,point.x,point.y);
m_OldPoint.x=point.x;
m_OldPoint.y=point.y;
pDC->SetROP2(nOldMode);
delete pDC;
}

CScrollView::OnMouseMove(nFlags, point);
}void CCopyView::OnLButtonUp(UINT nFlags, CPoint point)
{


m_bLeftButtonDown=FALSE;
m_SecondPoint.x=point.x;
m_SecondPoint.y=point.y;
    if(MessageBox(_T("是否立即清除选择矩形的边框线?"),_T("信息提示"),MB_ICONWARNING+MB_YESNO+MB_DEFBUTTON2)==IDYES)
{
Invalidate();
UpdateWindow();
}
MessageBox(_T("请立即执行复制操作"),_T("信息提示"),MB_OK);

CScrollView::OnLButtonUp(nFlags, point);
}复制void CCopyView::OnEditCopy()
{ CRect m_SelectRect=CRect(m_FirstPoint,m_SecondPoint);
CBitmap ClipBmp;
CClientDC dc(this);
CDC  memDC;
memDC.CreateCompatibleDC(&dc);
ClipBmp.CreateCompatibleBitmap(&dc,m_SelectRect.Width()-1,m_SelectRect.Height()-1);
CBitmap *pOldBmp=memDC.SelectObject(&ClipBmp);
memDC.BitBlt(0,0,m_SelectRect.Width()-1,m_SelectRect.Height()-1,&dc,m_SelectRect.left+1,m_SelectRect.top+1,SRCCOPY);
if(!this->OpenClipboard())
{
MessageBox(_T("不能打开系统剪贴板!"),_T("信息提示"),MB_OK);
return;
}
if(!::EmptyClipboard())
{
MessageBox(_T("不能清空系统剪贴板!"),_T("信息提示"),MB_OK);
return;
}
SetClipboardData(CF_BITMAP,ClipBmp.GetSafeHandle());
if(!::CloseClipboard())
{
MessageBox(_T("不能关闭系统剪贴板!"),_T("信息提示"),MB_OK);
return;
}
memDC.SelectObject(pOldBmp);
ClipBmp.Detach();

}要怎样才能选中全部呢?
谢谢啦,祝大家中秋节快乐

解决方案 »

  1.   

    我看了你的写法后,感觉你只是针对一个屏幕的截图。
    如果你想跨屏幕的截图,你一定要引入和建立绝对坐标系。
    通常我们脑子里只有2个系,控件坐标系和屏幕坐标系。有函数可以互相转换,ClientToScreen之类的
    如果你想全部选中超越CView的视图,就要把3个坐标系互相转换。因为我之前做GIS,涉及到这个,正好可以给你出点点子。
      

  2.   

    我说的详细点吧,你现在不是抓屏都是在一个屏幕内的吧,你的需求是截取屏幕以外的内容吧。首先,你整个ScrollView是一个画图板显示当前的图像,但是实际上,我们画的图片远远超过ScrollView所能显示的,所以它自动会添加滚动条,来满足显示功能。整个ScrollView的显示的内容,你依靠DC存进内存的BMP之中吧,
    这张BMP依靠之前说的绝对坐标来定位。你操控的屏幕坐标根据ScrollView的滚动轴位置可以计算出定位的绝对坐标。然后根据你鼠标框的范围,来截取BMP,最后传送到剪贴版上。这下你OK了么?