@@高手去那里了,如何截取局部屏幕保存@@

toxyboy 2006-04-25 10:07:10
全屏截图好截取,现在是不知道如何让程序等待鼠标在屏幕拉框局部截取保存。。。
最好有案例,实在不行,给个思路也行。。。
...全文
266 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
吹雪 2006-04-26
  • 打赏
  • 举报
回复
关于那个矩形框,可以这样解决。
OnLButtonDown:
ptStart = ptEnd = point;
yangxingkuan 2006-04-26
  • 打赏
  • 举报
回复
看了下,基本能看懂,下次自己试试,up
toxyboy 2006-04-25
  • 打赏
  • 举报
回复
就是我鼠标在拉框选择的时候,对角就会出现一个和顶点对称的矩形框。和用鼠标拉的框一样。你那边没有吗?有点奇怪,我换台机器试试
pomelowu 2006-04-25
  • 打赏
  • 举报
回复
你说的是什么样的矩形框?
toxyboy 2006-04-25
  • 打赏
  • 举报
回复
呵呵,仔细看了看也明白了。。谢谢兄台!!不过,好像有点瑕疵,不知道兄台发现没,就是每次鼠标选取的时候在屏幕左上角也会出现个矩形框。这有办法去掉吗??
pomelowu 2006-04-25
  • 打赏
  • 举报
回复
tigDlg你不用管了。。。我只是在别人取消了选取操作的时候给了一个提示而已。:)
toxyboy 2006-04-25
  • 打赏
  • 举报
回复
楼上老兄,那个tigDlg是什么dlg。能再细点吗?
pomelowu 2006-04-25
  • 打赏
  • 举报
回复
全屏截图贴到一个全屏的对话框上,然后想怎么截局部还不随便你?^_^
这是我以前写的,可以参考一下:

void CSCRDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ptStart = point;
SetCapture();
}

CRect MakeRect(CPoint pt1, CPoint pt2)
{
POINT ptLeftUp, ptRightDown;
if (pt2.x == 0 && pt2.y == 0)
return CRect(0, 0, 0, 0);

ptLeftUp.x = (pt1.x < pt2.x) ? pt1.x : pt2.x;
ptLeftUp.y = (pt1.y < pt2.y) ? pt1.y : pt2.y;

ptRightDown.x = (pt1.x > pt2.x) ? pt1.x : pt2.x;
ptRightDown.y = (pt1.y > pt2.y) ? pt1.y : pt2.y;

return CRect(ptLeftUp, ptRightDown);
}

void CSCRDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags==MK_LBUTTON)
{
CDC *pDC = GetDC();

pDC->DrawFocusRect(MakeRect(ptStart, ptEnd));
pDC->DrawFocusRect(MakeRect(ptStart, point));

ptEnd = point;
ReleaseDC(pDC);
}

CDialog::OnMouseMove(nFlags, point);
}

BOOL CSCRDlg::OnInitDialog()
{
CDialog::OnInitDialog();

GetDesktopWindow()->GetWindowRect(crDesktop);

CDC dc;
CBitmap *pBmp = NULL;
dc.CreateDC("DISPLAY", NULL, NULL, NULL);

pMemDC = new CDC;
if (!pMemDC)
return FALSE;
pMemDC->CreateCompatibleDC(&dc);

pBmp = new CBitmap;
if (!pBmp)
return FALSE;

pBmp->CreateCompatibleBitmap(&dc, crDesktop.Width(), crDesktop.Height());
pMemDC->SelectObject(pBmp);
ShowWindow(SW_HIDE);

pMemDC->BitBlt(0, 0, crDesktop.Width(), crDesktop.Height(), &dc, 0, 0, SRCCOPY);

dc.DeleteDC();
delete pBmp;

ShowWindow(SW_MAXIMIZE);
POINT point;
GetCursorPos(&point);

return TRUE;
}

void CSCRDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
ReleaseCapture();
CRect rcCopy = MakeRect(ptStart, point);

if (MessageBox("Press \'OK\' to copy the region to clip board & return to main window.\nPress \'Cancel\' button to reselect.",
"CaptureAny Confirmation", MB_OKCANCEL) == IDOK)
{

CDC dcCopy;
CBitmap bmpCopy;
dcCopy.CreateCompatibleDC(pMemDC);
bmpCopy.CreateCompatibleBitmap(pMemDC, rcCopy.Width(), rcCopy.Height());
dcCopy.SelectObject(&bmpCopy);
dcCopy.BitBlt(0, 0, rcCopy.Width(), rcCopy.Height(),
pMemDC, rcCopy.left, rcCopy.top, SRCCOPY);

OpenClipboard() ;
EmptyClipboard();
SetClipboardData(CF_BITMAP, (HBITMAP)bmpCopy.m_hObject);
CloseClipboard();

dcCopy.DeleteDC();

CDC *pDC = GetDC();
pDC->DrawFocusRect(MakeRect(ptStart, point));
ReleaseDC(pDC);
ptEnd = (0, 0);

OnCancel();
return;
}

CDC *pDC = GetDC();
pDC->DrawFocusRect(MakeRect(ptStart, point));
ReleaseDC(pDC);

tipDlg.SetWindowPos(&wndTopMost, point.x + 15, point.y, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE);
tipDlg.SetScrDlg(this);
ptEnd = (0, 0);
}

void CSCRDlg::OnPaint()
{
CPaintDC dc(this);

dc.BitBlt(0,0,crDesktop.Width(), crDesktop.Height(), pMemDC, 0, 0, SRCCOPY);
}
baibai1983 2006-04-25
  • 打赏
  • 举报
回复
先全屏截图,然后在指定要截取得子图的位置成么?
QuickGo 2006-04-25
  • 打赏
  • 举报
回复
我编写绘图软件的时候,都是把整个图像保存在内存中,所以,所以截图的时候没有困难。
hifan 2006-04-25
  • 打赏
  • 举报
回复
关于那个矩形框,可以这样解决。
再加一个变量 CPoint ptLast;
ptLast.x = -1;
ptLast.y = -1;
以上为初始化。

将下面
CDC *pDC = GetDC();
pDC->DrawFocusRect(MakeRect(ptStart, ptEnd));
pDC->DrawFocusRect(MakeRect(ptStart, point));
ptEnd = point;
改为
ptEnd = point;
CDC *pDC = GetDC();
if(!(ptLast.x==-1 && ptLast.y==-1))
pDC->DrawFocusRect(MakeRect(ptStart, ptLast));
pDC->DrawFocusRect(MakeRect(ptStart, ptEnd));
ptLast = ptEnd;

然后在MouseUp的时候,再将
ptLast.x = -1;
ptLast.y = -1;

15,976

社区成员

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

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