c++ 截屏问题
各位大牛:我碰到了c++ 截屏问题,请指点,谢谢。
我想把当前窗口的工作区截屏截下来,(如把下面代码的 hWnd 所表示的窗口的工作区截下来),而不截取标题栏和菜单栏(即把标题栏和菜单栏去掉),请问怎么办啊?谢谢
代码如下:
。。。。。
HWND hWnd = CreateWindow(g_szWindowClass, g_szTitle, WS_OVERLAPPEDWINDOW,
100, 100, 256, 256, NULL, NULL, hInstance, NULL);
//上面表示创建一个有标题栏和菜单栏的窗口,但是,我希望只把工作区的东西(不包括 标题栏和菜单栏)截下来,可是以下代码不行,请问怎么办??
CDC *pDC;//Screen DC
pDC = CDC::FromHandle(GetDC(NULL));//get the DC of screen
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//get color mode
RECT rectClient;
POINT pt1;
GetClientRect(hWnd, &rectClient);
//Get width/height of client windows
int Width = rectClient.right - rectClient.left;
int Height = rectClient.bottom - rectClient.top;
//convert client coords to screen coords
pt1.x = rectClient.left;
pt1.y = rectClient.top;
ClientToScreen(hWnd, &pt1);
rectClient.left = pt1.x;
rectClient.top = pt1.y;
CDC memDC;//memory DC
memDC.CreateCompatibleDC(pDC);
CBitmap memBitmap, *oldmemBitmap;
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);
oldmemBitmap = memDC.SelectObject(&memBitmap);
memDC.BitBlt(0, 0, Width, Height, pDC, rectClient.left, rectClient.left, SRCCOPY);//copy image of screen to DC
//Following code is for save the bitmap of memDC to file
。。。。。。。。。。。。。。
分数不够,可以再加。 --------------------编程问答-------------------- 是截自己建的窗口中客户区的部分吗。?
如果是这样, 就用GetClientDC()获取客户区DC,即
将pDC = CDC::FromHandle(GetDC(NULL));换为
pDC = CDC::FromHandle(GetClientDC())
这样应该可以。。
如果是截别的程序窗口中客户区的话。。要EnumChildWindows获得那个窗口
请确保你从dc中save成位图的代码正确 --------------------编程问答-------------------- 是截 自己建的窗口中客户区的部分,如下:
HWND hWnd = CreateWindow(g_szWindowClass, g_szTitle, WS_OVERLAPPEDWINDOW,
100, 100, 256, 256, NULL, NULL, hInstance, NULL);
//上面表示创建一个有标题栏和菜单栏的窗口,但是,我希望只把工作区的东西(不包括 标题栏和菜单栏)截下来,可是以下代码不行,请问怎么办??
但是 我没有找到 GetClientDC方法啊?请楼上的朋友再详细点,谢谢了 --------------------编程问答-------------------- 那你改为GetDC(hWnd), 获取当前窗口客户区的DC, 然后将这个dc中的图像save下来。。看看行不行
将pDC = CDC::FromHandle(GetDC(NULL));换为
pDC = CDC::FromHandle(GetDC(hWnd)), hWnd为当前窗口句柄 --------------------编程问答-------------------- 我的程序是能截取 当前窗口 (包括 标题栏,菜单栏等)
但是,我想只截取 窗口的 客户区,(不包括 标题栏,菜单栏等) --------------------编程问答-------------------- 留个脚印留个脚印留个脚印留个脚印屏关联 --------------------编程问答-------------------- 一个笨方法:
你把当前窗口 (包括 标题栏,菜单栏等)的位图保存在内存里OldMemDC
然后你再申请一个新的内存NewMemDC
假设你的标题栏,菜单栏等的高度是10,则:
NewMemDC.BitBlt(0,0,Width,Height,&OldMemDC,0,10,SRCCOPY); --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 我觉得可以动态截取工作区
1、修改GetClientRect(hWnd, &rectClient); rectClient这个举行变量可以动态赋值,用鼠标点击两下工作区,获得坐标pt_1,pt2,rectClient=CRect(pt_1,pt_2)
--------------------编程问答-------------------- 你的方法太过于复杂 截屏很简单的,思路就是创建一个图像 把像素往图像里面写。
举个例子:
#include<altimage.h>
CImage* pImage=new CImage;
pImage->Create(Width,Height,24);
)
pDC* pDC=GetDC();//你要截屏的DC
for(int i=0;i<Width;i++)
{
for(int j=0;j<Height;j++)
{
pDC->GetPixel(x,y);//x,y为你的pos
pImage->SetPixel(i,j,RGB(r,g,b));
}
} --------------------编程问答-------------------- 计算一下相应坐标。 --------------------编程问答-------------------- LZ代码有错
应该是
memDC.BitBlt(0, 0, Width, Height, pDC, rectClient.left, rectClient.top, SRCCOPY);//copy image of screen to DC
--------------------编程问答-------------------- 孤鸿寡鹄 --------------------编程问答-------------------- 关注中! --------------------编程问答-------------------- 也想知道 --------------------编程问答-------------------- 这个帖子都这么久了,问题早解决了吧...帖主分享下哈
补充:.NET技术 , VC.NET