Q:如下拷屏代码错在何处?

liulee 2002-08-02 08:48:05
// 起始位置是通过 GetCursorPos得到的鼠标位置,目的是拷贝鼠标所在位置附近区域,并拷入TImage中。

int RectWidth,RectHeight,LeftPos,TopPos;
HDC SourceDC,DestDC;
LeftPos = StrToInt(Label_cx->Caption);
TopPos = StrToInt(Label_cy->Caption);
RectWidth =200;
RectHeight =200 ;
// 创建屏幕设备
SourceDC = CreateDC("DISPLAY",NULL,NULL,NULL);
// 目的设备
DestDC = Image1->Canvas->Handle;
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,LeftPos,TopPos,SRCCOPY))
DeleteDC(SourceDC);
Image1->Canvas->Refresh();

问题是:
第一次执行上述脚本没问题,能够正确截取,第二次就没反应了,但不返回错误信息,提示命令正确执行。

刚学两天,各位多指教~~

...全文
17 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
有哥 2002-08-03
  • 打赏
  • 举报
回复
怎么我做的没那么复杂,奇怪了。CopyRect不是挺好用的吗?
liulee 2002-08-03
  • 打赏
  • 举报
回复
改进了,pass
POINT lpPoint;
if (! GetCursorPos(&lpPoint)) return;

int LeftPos,TopPos;
HDC SourceDC,DestDC;
LeftPos = lpPoint.x - 15;
TopPos = lpPoint.y - 15;

// 创建屏幕设备
SourceDC = CreateDC("DISPLAY",NULL,NULL,NULL);
// 目的设备
TCanvas *dtCanvas = new TCanvas;
dtCanvas->Handle=GetDC(Handle);

if (BitBlt(dtCanvas->Handle,Bevel1->Left+5,Bevel1->Top +5,30,30,SourceDC,LeftPos,TopPos,SRCCOPY ))
{
}

DeleteDC(SourceDC);
dtCanvas ->Free();

没有 BCB_FANS的 洗练.

画线条的程序还在琢磨中,主要是截获的proc而不是mouseproc,因此有些事件难处理。

其实我写这个程序的目的就是:
1.捕获进程;
2.截获图像,得到某球体中心点,譬如斯诺克的白球,若能截获事件或内存映射得到,那当然好了。
3.定义路线.画球体撞击路线
4.指挥鼠标动作
...

就是这个过程,目前仅仅完成了截获图像,正在搞识别算法。

困难很大,刚开始学bcb。
bcb_fans 2002-08-03
  • 打赏
  • 举报
回复
真正难的是算法,而不是BCB的使用。可以到“数据和算法”版去问一问。
huzhangyou 2002-08-02
  • 打赏
  • 举报
回复
可能是image的问题
gk0205 2002-08-02
  • 打赏
  • 举报
回复
@_@....
bcb_fans 2002-08-02
  • 打赏
  • 举报
回复
另: 那个画线条的程序理解了没有?
bcb_fans 2002-08-02
  • 打赏
  • 举报
回复
给你一段代码
-----------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
TPoint p;
TRect sr,pr;
TCanvas* TempC;
int offset;

offset = 200;//StrToInt(Edit1->Text);
GetCursorPos(&p);

sr.Left = p.x - offset;
sr.Right = p.x + offset;
sr.Top = p.y - offset;
sr.Bottom = p.y + offset;

TempC=new Graphics::TCanvas();
TempC->Handle = GetDC(0);
Image1->Canvas->CopyRect(Rect(0,0,sr.Width(),sr.Height()),temp,sr);
ReleaseDC(0,TempC->Handle);

delete TempC;
}

jishiping 2002-08-02
  • 打赏
  • 举报
回复
你是不是在Win98上运行的啊。前两天看到两个人,说是在Win98下,如果
TImage为空的话,直接用Image1->Canvas好象有问题。我没有Win98,没有
在Win98上测试过。如果是这样的话,你可以先自己产生Image1->Picture
->Bitmap。
SourceDC = GetWindowDC(NULL);
Image1->Picture->Bitmap->Width = Image1->Width;
Image1->Picture->Bitmap->Height = Image1->Height;
DestDC = Image1->Picture->Bitmap->Canvas->Handle;
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
ReleaseDC(NULL, SourceDC);
Image1->Canvas->Refresh();
liulee 2002-08-02
  • 打赏
  • 举报
回复
总觉得什么地方有问题。
不然不会截不到的。
tiantianpb 2002-08-02
  • 打赏
  • 举报
回复
看不出什么毛病的呀

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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