首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何使抓图的尺寸与画的图尺寸一样大? [已结帖,结帖人:isjava]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-20 16:58:36 楼主
    void CField2View::OnClientSave(char filename[50])
    {
    // TODO: Add your command handler code here
    BITMAPINFO bi;//信息头
    void *pBits=NULL;
    CRect rect;//客户区窗口
    GetClientRect(&rect);
    int nWidth=rect.right;
    int nHeight=rect.bottom;

    ZeroMemory(&bi,sizeof(bi));
    bi.bmiHeader.biSize=sizeof(bi.bmiHeader);
    bi.bmiHeader.biHeight=nHeight;
    bi.bmiHeader.biWidth=nWidth;
    bi.bmiHeader.biPlanes=1;
    bi.bmiHeader.biBitCount=24;
    bi.bmiHeader.biCompression=BI_RGB;
    bi.bmiHeader.biSizeImage=3*nWidth*nHeight;

    //******************************************************
            nHeight=N;  //我需要的图是一个N×N个格子的图
    nWidth=N;
    //******************************************************
    //拷贝客户区至内存DC
    HDC hActiveDC=::GetDC(this->m_hWnd);
    HDC hActiveWndCompatibleDC=CreateCompatibleDC(hActiveDC);
    //HBITMAP hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,rect.right,rect.bottom);
    HBITMAP hActiveWndCompactibleBitmap=CreateCompatibleBitmap(hActiveDC,nWidth+4,nHeight+4);//取比窗口高些尺寸以消除图片边缘的黑线!!
    SelectObject(hActiveWndCompatibleDC,hActiveWndCompactibleBitmap);

    //BitBlt(hActiveWndCompatibleDC,0,0,rect.right,rect.bottom,hActiveDC,0,0,SRCCOPY);
    BitBlt(hActiveWndCompatibleDC,-1,-1,nWidth+2,nHeight+2,hActiveDC,0,0,SRCCOPY);

    //保存内存DC
    HDC hBmpFileDC=CreateCompatibleDC(hActiveWndCompatibleDC);
    HBITMAP hBmpFileBitmap=CreateDIBSection(hActiveWndCompatibleDC,&bi,DIB_RGB_COLORS,&pBits,NULL,0);
    SelectObject(hBmpFileDC,hBmpFileBitmap);
    BitBlt(hBmpFileDC,-1,-1,nWidth+2,nHeight+2,hActiveWndCompatibleDC,0,0,SRCCOPY);

    CString tempFileName=_T(filename);//目标文件名(输入的参数)
    HANDLE hFile=CreateFile(tempFileName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFile!=INVALID_HANDLE_VALUE)
    {
    DWORD dwRet=0;
    //填充文件头
    BITMAPFILEHEADER bmfHeader;
    ZeroMemory(&bmfHeader,sizeof(bmfHeader));
    bmfHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    bmfHeader.bfSize=bi.bmiHeader.biSizeImage+bmfHeader.bfOffBits;
    bmfHeader.bfType='MB';
    WriteFile(hFile,&bmfHeader,sizeof(bmfHeader),&dwRet,NULL);
    WriteFile(hFile,&bi.bmiHeader,sizeof(bi.bmiHeader),&dwRet,NULL);
    WriteFile(hFile,pBits,bi.bmiHeader.biSizeImage,&dwRet,NULL);
    CloseHandle(hFile);
    }
    }


    这里抓的图是画图屏幕的大小,很不方便

    比如,我要画100×100格子的图,下边和左右都是黑色,如果是1024×1024的画,则有一部分的图形抓不到

    请高手帮忙解决
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-30 15:20:271楼 得分:0
    高手来帮忙啊

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-02 12:42:392楼 得分:0
    55555555555555
    高手们呢

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Mackz
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 4

      6

      8

    发表于:2008-09-03 03:08:113楼 得分:5
    你直接把图形绘制到内存位图中,然后保存不就可以了,自己绘制的东西还用得着抓图?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-03 16:17:314楼 得分:0
    是很多图啊,动态的,你说的只能保存最后一张图,中间的过程画的图就保存不到了

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-12 17:30:225楼 得分:0
    顶起...


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jennyvenus
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

      5

      5

    发表于:2008-09-12 17:55:246楼 得分:15
    不明白为什么会不一样大,楼主不妨直接找找网上的代码,移植过来,还可以保存成jpg等更省空间的格式。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jennyvenus
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 3

      5

      5

    发表于:2008-09-12 17:57:007楼 得分:0
    你画到一个内存dc上,然后再保存,或者你每次画的时候,都往内存上bitblt一次。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • isjava
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-09-15 18:00:258楼 得分:0
    虽然不满意,但是也是谢谢你们了

    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved