| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1107 人关注过本帖
标题:关于获取矩形句柄的问题
只看楼主 加入收藏
yaoguai2005
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2005-9-11
收藏
 问题点数:0 回复次数:9 
关于获取矩形句柄的问题

是这样的,获得整个窗口,或者鼠标位置的窗口句柄我已经会了,
可是那样的抓取的图象数据好大,
我想在鼠标点击的时候,在桌面上抓取一个自己定义的矩形区域,
然后把它保存起来,我用CreateRectRgn新建这个矩形区域的时候,它的返回句柄
是HRGN矩形句柄,不是HWND窗口句柄,导致无法选入设备,到这里又不会了,
好请大家指点啊,如何定义选定一个矩形,和如何获得她的窗口句柄呢,
谢谢了~~~~~~~~
WM_LBUTTONDOWN:
HRGN hrgn;
hrgn=CreateRectRgn(10,10,200,200);//创建了一个矩形区域,下来该咋做呢?它形成不了 一个窗口句柄,我无法对它进行操作啊,好难办啊,

case WM_LBUTTONDOWN:
hdc=GetDC(hwnd);
hh=CreateCompatibleDC(hdc);

hrgn=CreateRectRgn(10,10,200,200);
SelectObject(hh,hrgn);
BitBlt(hdc,180,80,100,100,hh,0,0,SRCCOPY);

break;
//这样也不行,请大家指点一下把

[此贴子已经被作者于2006-4-22 12:01:54编辑过]

搜索更多相关主题的帖子: 句柄 矩形 获取 
2006-04-22 10:04
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
试试强制转换成窗口句柄。

天行健,君子以自强不息!!QQ:68660681
2006-04-22 12:30
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
但是我觉得要实现你的功能的话
仅仅这样就行了:
case WM_LBUTTONDOWN:
HDC hdc,hh;
hdc=GetDC(hwnd);
hh=GetDC(hwnd);
BitBlt(hdc,180,80,100,100,hh,0,0,SRCCOPY);
break;



天行健,君子以自强不息!!QQ:68660681
2006-04-22 13:22
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 

如果你只想单纯地改变你保存的位图的区域,
可在红色的那几行代码下手。

HDC hdc = ::GetWindowDC(m_hwndFoundWindow);
HDC memDC=CreateCompatibleDC(hdc);
RECT r;
GetWindowRect(m_hwndFoundWindow,&r);
HBITMAP bm=CreateCompatibleBitmap(hdc, r.right-r.left, r.bottom-r.top);
HBITMAP oldbm = (HBITMAP)SelectObject(memDC,bm);
BitBlt(memDC,0, 0, r.right-r.left, r.bottom-r.top, hdc, 0, 0, SRCCOPY);

if(SaveBitmapToFile((HBITMAP)bm,"c:\\11.bmp"))
MessageBox(NULL,"位图保存成功!","Ok",MB_OK);
else
MessageBox(NULL,"位图保存失败!","Error",MB_OK);

SelectObject(memDC,oldbm);
DeleteDC(memDC);


=×&D o I p R e E n C g T l X&×=
2006-04-22 13:36
yaoguai2005
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2005-9-11
收藏
得分:0 

把自定义矩形区域句柄(HRGN)强制转换成窗口句柄(HWND)
我下午实验一下,
---------------------
case WM_LBUTTONDOWN:
HDC hdc,hh;
hdc=GetDC(hwnd);
hh=GetDC(hwnd);
BitBlt(hdc,180,80,100,100,hh,0,0,SRCCOPY);
break;
-----------------------
这个我实验过了,不行呀,我要的是把我自定义的那个矩形区域里的图抓下来,然后保存为BMP文件,你这个代码不行啊,我就是不知道,如何处理矩形区域,,
谢谢你了~~~~~~~~~~~~

----------------------------

强制转换,能不能告诉我如何转换呢,(HWND)hrgn,是这个样子吗,把区域句柄转换成窗口句柄,

[此贴子已经被作者于2006-4-22 14:44:52编辑过]


2006-04-22 13:44
yaoguai2005
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2005-9-11
收藏
得分:0 
以下是引用Bjarne在2006-4-22 13:36:00的发言:

如果你只想单纯地改变你保存的位图的区域,
可在红色的那几行代码下手。

HDC hdc = ::GetWindowDC(m_hwndFoundWindow);
HDC memDC=CreateCompatibleDC(hdc);
RECT r;
GetWindowRect(m_hwndFoundWindow,&r);
HBITMAP bm=CreateCompatibleBitmap(hdc, r.right-r.left, r.bottom-r.top);
HBITMAP oldbm = (HBITMAP)SelectObject(memDC,bm);
BitBlt(memDC,0, 0, r.right-r.left, r.bottom-r.top, hdc, 0, 0, SRCCOPY);

if(SaveBitmapToFile((HBITMAP)bm,"c:\\11.bmp"))
MessageBox(NULL,"位图保存成功!","Ok",MB_OK);
else
MessageBox(NULL,"位图保存失败!","Error",MB_OK);

SelectObject(memDC,oldbm);
DeleteDC(memDC);

可我想的是要以鼠标点击时的坐标为中心点,制定一个矩形区域,然后把这个区域中的图象保存为BMP文件,我在想,画了以后,如何取得矩形的(窗口HWND)句柄呢,如果从那2句下手,它们只包含了宽和高度,可却实现不了以鼠标点击时的坐标为参照点的目的。
-----------------------------------------------
case WM_LBUTTONDOWN:
GetCursorPos(&pt);
KillTimer(hWnd,WM_MYTIMER);
SaveFile();
m_bStartSnapWindow = FALSE;
break;
............................................
GetWindowRect(m_hwndFoundWindow,&r);
HBITMAP bm=CreateCompatibleBitmap(hdc, 300, 300);
HBITMAP oldbm = (HBITMAP)SelectObject(memDC,bm);
BitBlt(memDC,0, 0,300, 300, hdc, pt.x-150,pt.y-150, SRCCOPY);

我想在鼠标点击的时候,获得它在用户窗口的光标位置,然后X和Y坐标各减150,
这样截取的图象就是以鼠标坐标为中心,抓取了一个300*300的矩形图象,可我
最后抓取的结果却是,不是以鼠标点击坐标为中心抓取的,而是已鼠标点击为最左上角的
坐标抓取的,这又是咋回事情呢,和我想的根本不一样啊,
请老大指点啊,

[此贴子已经被作者于2006-4-22 16:03:57编辑过]


2006-04-22 13:56
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
得到按下的鼠标的位置,再以这个位置确定要选取的区域。这时就可把选好的区域与那几行重整。

=×&D o I p R e E n C g T l X&×=
2006-04-22 15:56
yaoguai2005
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2005-9-11
收藏
得分:0 
case WM_LBUTTONDOWN:
GetCursorPos(&pt);
KillTimer(hWnd,WM_MYTIMER);
SaveFile();
m_bStartSnapWindow = FALSE;
break;
............................................
GetWindowRect(m_hwndFoundWindow,&r);
HBITMAP bm=CreateCompatibleBitmap(hdc, 300, 300);
HBITMAP oldbm = (HBITMAP)SelectObject(memDC,bm);
BitBlt(memDC,0, 0,300, 300, hdc, pt.x-150,pt.y-150, SRCCOPY);

我想在鼠标点击的时候,获得它在用户窗口的光标位置,然后X和Y坐标各减150,
这样截取的图象就是以鼠标坐标为中心,抓取了一个300*300的矩形图象,可我
最后抓取的结果却是,不是以鼠标点击坐标为中心抓取的,而是已鼠标点击为最左上角的
坐标抓取的,这又是咋回事情呢,和我想的根本不一样啊,
请老大指点啊,

2006-04-22 16:05
踏魔狼
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:1322
专家分:33
注 册:2005-9-22
收藏
得分:0 
修改成如下红色的行。
void SetCurrentWindow()
{
if(m_bStartSnapWindow)
{
POINT CursorPoint;
HWND hwndFoundWindow = NULL;
GetCursorPos(&CursorPoint);
//hwndFoundWindow = ::WindowFromPoint(CursorPoint);
hwndFoundWindow=::GetDesktopWindow();
if (CheckWindow(hwndFoundWindow))
{
if (m_hwndFoundWindow)
{
RefreshWindow(m_hwndFoundWindow);
}
m_hwndFoundWindow = hwndFoundWindow;
HighlightWindow(m_hwndFoundWindow);
}
}
}
在这里得到的是鼠标相对于整个屏幕的坐标。(也就是GetDesktopWindow())
case WM_LBUTTONDOWN:
GetCursorPos(&pt);
而这里是对子窗口的操作。
GetWindowRect(m_hwndFoundWindow,&r);
HBITMAP bm=CreateCompatibleBitmap(hdc, 300, 300);
HBITMAP oldbm = (HBITMAP)SelectObject(memDC,bm);
BitBlt(memDC,0, 0,300, 300, hdc, pt.x-150,pt.y-150, SRCCOPY);
这样当然不会是你想要的。

=×&D o I p R e E n C g T l X&×=
2006-04-22 18:43
yaoguai2005
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2005-9-11
收藏
得分:0 

这个题目到终于做好了,
非常感谢老大的指点,

不过我还的在看几天,才能领会你给的程序的意思,



2006-04-23 09:11
快速回复:关于获取矩形句柄的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011958 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved