解决方案 »

  1.   

    看一天你就想学会MFC啊......
    就算给你讲一天,你也是不会的......
    房子不是一天就造成的,要耐心的花时间,按步骤学习,才能盖高楼。
      

  2.   

    额,虚心接受批评,boss要求周三给他演示下,我才出此下策,大神能给指点下吗,socket通信代码加哪,如果通知加载新的图片
      

  3.   

    哪儿都行啊。SOCKET还是CSocket什么的?
    服务端已经收到了还是两头都没写呢?这个怎么说呢,问得有点笼统。
      

  4.   

    不懂mfc,用api咯,条条大路通罗马
      

  5.   

    MFC刚上手,你就做这个。框架就够你喝一壶的。你还是控制台吧。或者APIDELPHI示例
    function TfrmScreen.CaptureScreen(AFileName:String;pressvalue: integer):string;
    var
    VBmp: TBitmap;
    MyJPEG:TJPEGImage;
    begin
    VBmp := TBitmap.Create;
    try
    VBmp.Width := Screen.Width;
    VBmp.Height := Screen.Height;
    BitBlt(VBmp.Canvas.Handle, 0, 0, Screen.Width, Screen.Height, GetDC(0), 0,0, SRCCOPY);
    MyJPEG:=TJPEGImage.Create;
    MyJPEG.Assign(VBmp);
    MyJPEG.CompressionQuality:=pressvalue;
    MyJPEG.Compress;MyJPEG.SaveToFile('images\\'+inttostr(iName)+AFileName);
    mmoInfo.Lines.Add('images: '+inttostr(iName)+AFileName+' saved');
    imgeShow.Picture.LoadFromFile('images\\'+inttostr(iName)+AFileName);//Sleep(500);
    finally
    MyJPEG.Free;
    VBmp.Free;
    end;
    end;procedure TfrmScreen.FormCreate(Sender: TObject);
    begin
    iName:=1;
    end;procedure TfrmScreen.tmr1Timer(Sender: TObject);
    begin
    //调用格式:CaptureScreen(文件名称,压缩比例(数值越大约清晰))
    Inc(iName);
    CaptureScreen('00.jpg',300);
    end;procedure TfrmScreen.N1Click(Sender: TObject);
    begin
          tmr1.Enabled:=True;
          frmScreen.Text:='开始屏幕观察';
    end;procedure TfrmScreen.N2Click(Sender: TObject);
    begin
          tmr1.Enabled:=False;
           frmScreen.Text:='暂停屏幕观察';
    end;
      

  6.   

    API 示例
    #include<windows.h>  
      
    HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage) ;  
    BOOL CapScreen(LPTSTR FileName);//截屏函数  
      
    HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage)   
    {  
        BITMAP              bm;  
        BITMAPINFOHEADER    bi;  
        LPBITMAPINFOHEADER     lpbi;  
        DWORD             dwLen;  
        HANDLE            hDib;  
        HANDLE            handle;  
        HDC               hdc;  
      
        //不支持BI_BITFIELDS类型  
        if( dwCompression == BI_BITFIELDS )  
            return NULL;  
      
        //如果调色板为空,则用默认调色板  
        if (hPal==NULL)  
            hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );  
      
        //获取位图信息  
        GetObject(bitmap,sizeof(bm),(LPSTR)&bm);  
      
        //初始化位图信息头  
        bi.biSize        = sizeof(BITMAPINFOHEADER);  
        bi.biWidth        = bm.bmWidth;  
        bi.biHeight         = bm.bmHeight;  
        bi.biPlanes         = 1;  
        bi.biBitCount        = bm.bmPlanes * bm.bmBitsPixel;  
        bi.biCompression    = dwCompression;  
        bi.biSizeImage        = 0;  
        bi.biXPelsPerMeter    = 0;  
        bi.biYPelsPerMeter    = 0;  
        bi.biClrUsed        = 0;  
        bi.biClrImportant    = 0;  
      
        //计算信息头及颜色表大小  
        int ncolors = (1 << bi.biBitCount); if( ncolors> 256 )   
            ncolors = 0;  
        dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD);  
      
        // we need a device context to get the dib from  
        hdc = GetDC(NULL);  
        hPal = SelectPalette(hdc,hPal,FALSE);  
        RealizePalette(hdc);  
      
        //为信息头及颜色表分配内存  
        hDib = GlobalAlloc(GMEM_FIXED,dwLen);  
      
        if (!hDib){  
            SelectPalette(hdc,hPal,FALSE);  
            ReleaseDC(NULL,hdc);  
            return NULL;  
        }  
      
        lpbi = (LPBITMAPINFOHEADER)hDib;  
        *lpbi = bi;  
        //调用 GetDIBits 计算图像大小  
        GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,  
                (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );  
      
        bi = *lpbi;  
        //图像的每一行都对齐(32bit)边界  
        if (bi.biSizeImage == 0){  
            bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)   
                            * bi.biHeight;  
        if (dwCompression != BI_RGB)  
                bi.biSizeImage = (bi.biSizeImage * 3) / 2;  
        }  
      
        //重新分配内存大小,以便放下所有数据  
        dwLen += bi.biSizeImage;  
        if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))  
            hDib = handle;  
        else{  
            GlobalFree(hDib);  
      
            //重选原始调色板  
            SelectPalette(hdc,hPal,FALSE);  
            ReleaseDC(NULL,hdc);  
            return NULL;  
        }  
      
        //获取位图数据  
        lpbi = (LPBITMAPINFOHEADER)hDib;  
      
        //最终获得的DIB  
        BOOL bgotbits = GetDIBits( hdc, bitmap,  
                      0L,                      //扫描行起始处  
                    (DWORD)bi.biHeight,      //扫描行数  
                    (LPBYTE)lpbi             //位图数据地址  
                    + (bi.biSize + ncolors * sizeof(RGBQUAD)),  
                    (LPBITMAPINFO)lpbi,      //位图信息地址  
                    (DWORD)DIB_RGB_COLORS);  //颜色板使用RGB  
      
        if( !bgotbits )  
        {  
            GlobalFree(hDib);  
              
            SelectPalette(hdc,hPal,FALSE);  
            ReleaseDC(NULL,hdc);  
            return NULL;  
        }  
      
        SelectPalette(hdc,hPal,FALSE);  
        ReleaseDC(NULL,hdc);  
        *sizeimage=bi.biSizeImage;  
        return hDib;  
    }   
      
    BOOL CapScreen(LPTSTR FileName)  
    {  
        DWORD sizeimage;  
        HDC hdc = CreateDC("SHOWSCREEN", NULL, NULL, NULL);   
        HDC CompatibleHDC = CreateCompatibleDC(hdc);   
        HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES));   
        SelectObject(CompatibleHDC, BmpScreen);  
        BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);  
          
    HANDLE  pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);  
        BITMAPFILEHEADER bfh;  
       //设置位图信息头结构  
        bfh.bfType = ((WORD)('M'<< 8)|'B');  
        bfh.bfReserved1 = 0;  
        bfh.bfReserved2 = 0;  
        bfh.bfSize = 54+sizeimage;  
        bfh.bfOffBits = 54;  
        //创建位图文件      
    HANDLE  hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);  
    DWORD dwWrite;  
    // 写入位图文件头  
    WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);  
    // 写入位图文件其余内容  
    WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL);    
    DeleteDC(hdc);  
         
    CloseHandle(CompatibleHDC);  
    return true;  
    }  
      
    int main(void)  
    {  
    CapScreen("d:\\SnapScreen.bmp");  
    return 0;  
    }