当前位置:编程学习 > C#/ASP.NET >>

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
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,