我自己写的一个activeX控件,实现用鼠标框一个矩形框然后将里面的屏幕内容截下来放入剪贴板中,但是出现冲突错误和提示“获取剪贴板内容出错!”,请有经验的高手解答!多谢! 代码如下: //定义4个全局属性,存储矩形框的坐标
public:
enum {
};
// //鼠标框开始点的X坐标
long x_start;
// //鼠标框开始点的y坐标
long y_start;
// //鼠标框终止点的X坐标
long x_end;
// //鼠标框终止点的y坐标
long y_end; //鼠标左键按下,获取矩形框起点坐标
void CScr_ForfexCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
x_start = point.x;
y_start = point.y;
COleControl::OnLButtonDown(nFlags, point);
} //鼠标左键放开,获取矩形框终点坐标,截图,写入剪贴板
void CScr_ForfexCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
x_end = point.x;
y_end = point.y;
CRect rect1 = new CRect(x_start,y_start,x_end,y_end);
HBITMAP l_HBMP = CopyToBmp(rect1);
OpenClipboard() ; //打开剪贴板,并将位图拷到剪贴板上
EmptyClipboard();
SetClipboardData(CF_DIB,l_HBMP);
CloseClipboard(); //关闭剪贴板
COleControl::OnLButtonUp(nFlags, point);
} //截图核心代码
// //把Rect中的屏幕存到bmp中并返回BMP图像对象句柄
HBITMAP CScr_ForfexCtrl::CopyToBmp(CRect Rect)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC; // 位图句柄
HBITMAP hBitmap, hOldBitmap;
// 选定区域坐标
int nX, nY, nX2, nY2; // 位图宽度和高度
int nWidth, nHeight; // 屏幕分辨率
int xScrn, yScrn; // 确保选定区域不为空矩形
if (IsRectEmpty(&Rect))
return NULL; //为屏幕创建设备描述表
hScrDC = CreateDC( _T("DISPLAY"), NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标
nX = Rect.left;
nY = Rect.top;
nX2 = Rect.right;
nY2 = Rect.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 = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除
DeleteDC(hScrDC);
DeleteDC(hMemDC); // 返回位图句柄
return HBITMAP();
} 错误提示如下:
当完成鼠标拖拽放开鼠标左键时提示错误:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed! Program: C:\Program Files\Internet Explorer\iexplore.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl
Line: 315 For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
--------------------------- 此时点击[忽略]
到画笔中去粘贴,显示:
“获取剪贴板内容出错!” 这问题该如何解决?请高手解答!
public:
enum {
};
// //鼠标框开始点的X坐标
long x_start;
// //鼠标框开始点的y坐标
long y_start;
// //鼠标框终止点的X坐标
long x_end;
// //鼠标框终止点的y坐标
long y_end; //鼠标左键按下,获取矩形框起点坐标
void CScr_ForfexCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
x_start = point.x;
y_start = point.y;
COleControl::OnLButtonDown(nFlags, point);
} //鼠标左键放开,获取矩形框终点坐标,截图,写入剪贴板
void CScr_ForfexCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
x_end = point.x;
y_end = point.y;
CRect rect1 = new CRect(x_start,y_start,x_end,y_end);
HBITMAP l_HBMP = CopyToBmp(rect1);
OpenClipboard() ; //打开剪贴板,并将位图拷到剪贴板上
EmptyClipboard();
SetClipboardData(CF_DIB,l_HBMP);
CloseClipboard(); //关闭剪贴板
COleControl::OnLButtonUp(nFlags, point);
} //截图核心代码
// //把Rect中的屏幕存到bmp中并返回BMP图像对象句柄
HBITMAP CScr_ForfexCtrl::CopyToBmp(CRect Rect)
{
// 屏幕和内存设备描述表
HDC hScrDC, hMemDC; // 位图句柄
HBITMAP hBitmap, hOldBitmap;
// 选定区域坐标
int nX, nY, nX2, nY2; // 位图宽度和高度
int nWidth, nHeight; // 屏幕分辨率
int xScrn, yScrn; // 确保选定区域不为空矩形
if (IsRectEmpty(&Rect))
return NULL; //为屏幕创建设备描述表
hScrDC = CreateDC( _T("DISPLAY"), NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标
nX = Rect.left;
nY = Rect.top;
nX2 = Rect.right;
nY2 = Rect.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 = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); //得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //清除
DeleteDC(hScrDC);
DeleteDC(hMemDC); // 返回位图句柄
return HBITMAP();
} 错误提示如下:
当完成鼠标拖拽放开鼠标左键时提示错误:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed! Program: C:\Program Files\Internet Explorer\iexplore.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl
Line: 315 For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
--------------------------- 此时点击[忽略]
到画笔中去粘贴,显示:
“获取剪贴板内容出错!” 这问题该如何解决?请高手解答!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货