• DrawDibDraw__ZC测试


    ZC: 先把 自己尝试成功的代码 记录下来,不要 弄没了之后 又忘了怎么弄...

    ZC: 代码 有点乱,没整理。没写 哪些是 原来MFC里面的 哪些是我自己写的,参考上一篇文章来看吧

    1、VC6 的一个随便的MFC程序

    2、class CDrawDibDraw_MFCDlg : public CDialog 

      添加成员:

    public:
        HDRAWDIB m_hDrawDib; // 视频函数
        HANDLE mhBitsSrc; // 位图文件句柄(内存)
        LPSTR mpBitsSrc; // 位图文件地址(内存)
        BITMAPINFOHEADER *mpBitmapInfo; // 位图信息头
    
        CPoint mPos;
        CRect mDispR;
        int mFullViewTog;
        int mDispMethod;
    
        void GraphicDraw();
    public:
        HANDLE FhFileBMP;
        //char FbufBmpMem[1024 * 1024 * 5];
        char* FbufBmpMem;
        DWORD FdwRead;

      2.1、

    #include <windows.h>
    #include <Vfw.h>
    #pragma comment(lib,"Vfw32.lib")

      2.2、

    CDrawDibDraw_MFCDlg::CDrawDibDraw_MFCDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CDrawDibDraw_MFCDlg::IDD, pParent)
    {
        //{{AFX_DATA_INIT(CDrawDibDraw_MFCDlg)
            // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
        // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
        m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    
        m_hDrawDib= DrawDibOpen();
    
        mDispMethod = 10;
        mFullViewTog = 0;
    // ***
    //*
        DWORD dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
        DWORD dwShareMode = 0;
        LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
        DWORD dwCreationDisposition = OPEN_EXISTING;//OPEN_ALWAYS;
        DWORD dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
        HANDLE hTemplateFile = NULL;
        FhFileBMP = CreateFile("C:\24bmp.bmp", dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
        if (FhFileBMP == NULL)
        {
            char bufErr[128] = {0};
            sprintf(bufErr, "CreateFile failed : (%ld)", GetLastError());
            printf("CreateFile fail(%ld)", GetLastError());
            MessageBox(bufErr, "1", 0);
            return;
        }
    
        DWORD dwReadBufLen = 1024 * 1024 * 5;
        FbufBmpMem = new char[dwReadBufLen];
        FdwRead = 0;
        int iRtn = ReadFile(FhFileBMP, FbufBmpMem, dwReadBufLen, &FdwRead, NULL);
        if (iRtn == 0)
        {
            printf("ReadFile fail(%ld)
    ", GetLastError());
            char bufErr[128] = {0};
            sprintf(bufErr, "ReadFile failed : (%ld)", GetLastError());
            MessageBox(bufErr, "2", 0);
            return;
        }
        else
        {
            //凡是从文件流中读出来的字符串都不会自动补,需要手动填充
            FbufBmpMem[FdwRead / sizeof(char)] = '';
            printf("ReadFile -> len=%ld, buf=%ls
    ", FdwRead, FbufBmpMem);
    
            char bufErr[128] = {0};
            sprintf(bufErr, "ReadFile --> len =%ld, buf=%ls
    ", FdwRead, FbufBmpMem);
            MessageBox(bufErr, "3", 0);
    
            mpBitsSrc = &FbufBmpMem[0];
    
            mpBitmapInfo = (BITMAPINFOHEADER*)&FbufBmpMem[sizeof(BITMAPFILEHEADER)];
        }
    //*/
    }

      2.3、

    void CDrawDibDraw_MFCDlg::OnPaint() 
    {
        if (IsIconic())
        {
            CPaintDC dc(this); // device context for painting
    
            SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
            // Center icon in client rectangle
            int cxIcon = GetSystemMetrics(SM_CXICON);
            int cyIcon = GetSystemMetrics(SM_CYICON);
            CRect rect;
            GetClientRect(&rect);
            int x = (rect.Width() - cxIcon + 1) / 2;
            int y = (rect.Height() - cyIcon + 1) / 2;
    
            // Draw the icon
            dc.DrawIcon(x, y, m_hIcon);
        }
        else
        {
            //CDialog::OnPaint();
    
            CPaintDC dc(this); // device context for painting
            GraphicDraw();
        }
    }

      2.4、

    void CDrawDibDraw_MFCDlg::GraphicDraw()
    {
        GetWindowRect(&mDispR);
        
    
        CClientDC dc(this); // device context for painting
        BITMAPFILEHEADER *pBitmapFileHeader;
        ULONG bfoffBits= 0;
        CPoint Wid;
        // 图形文件名有效 (=0 BMP)
    //    if( mBitmapFileType < ID_BITMAP_BMP )
    //        return;
        // 图形文件名有效 (=0 BMP)
        // 准备显示真彩位图
        pBitmapFileHeader = (BITMAPFILEHEADER *) mpBitsSrc;
        bfoffBits = pBitmapFileHeader->bfOffBits;
        // 使用普通函数显示位图
        if( m_hDrawDib == NULL || mDispMethod == 0)
        {
            HBITMAP hBitmap = ::CreateDIBitmap(dc.m_hDC,
                mpBitmapInfo, CBM_INIT, mpBitsSrc+bfoffBits,
                (LPBITMAPINFO) mpBitmapInfo,DIB_RGB_COLORS); 
            // 建立位图
            HDC hMemDC = ::CreateCompatibleDC(dc.m_hDC);// 建立内存
            //HBITMAP hBitmapOld = SelectBitmap(hMemDC, hBitmap); // 选择对象
            HBITMAP hBitmapOld = (HBITMAP)SelectObject(hMemDC, hBitmap); // 选择对象
            // 成员CRect mDispR用于指示图形显示区域的大小.
            // 成员CPoint mPos用于指示图形显示起始位置坐标.
            if( mPos.x > (mpBitmapInfo->biWidth - mDispR.Width()) )
                mPos.x= mpBitmapInfo->biWidth - mDispR.Width() ;
            if( mPos.y > (mpBitmapInfo->biHeight- mDispR.Height()) )
                mPos.y= mpBitmapInfo->biHeight- mDispR.Height();
            if( mPos.x < 0 ) mPos.x= 0;
            if( mPos.y < 0 ) mPos.y= 0;
            if( mFullViewTog == 0)
            {
                // 显示真彩位图
                ::BitBlt(dc.m_hDC, 0, 0, mDispR.Width(), mDispR.Height(),
                    hMemDC, mPos.x, mPos.y, SRCCOPY);
            }
            else
            {
                ::StretchBlt(dc.m_hDC,0,0, mDispR.Width(), mDispR.Height(),
                    hMemDC,0,0, mpBitmapInfo->biWidth, mpBitmapInfo->biHeight, SRCCOPY);
            }
            // 结束显示真彩位图
            ::DeleteObject(SelectObject(hMemDC,hBitmapOld)); 
            // 删 除 位 图
        } 
        else
        {
            // 使用视频函数显示位图
            if( mPos.x > (mpBitmapInfo->biWidth - mDispR.Width() ))
                mPos.x= mpBitmapInfo->biWidth - mDispR.Width() ;
            if( mPos.y > (mpBitmapInfo->biHeight- mDispR.Height()))
                mPos.y= mpBitmapInfo->biHeight- mDispR.Height();
            if( mPos.x < 0 )
                mPos.x= 0;
            if( mPos.y < 0 )
                mPos.y= 0;
            // 显示真彩位图
            DrawDibRealize( m_hDrawDib, dc.GetSafeHdc(), TRUE);
            if( mFullViewTog == 0)
            {
                Wid.x= mDispR.Width();
                Wid.y= mDispR.Height();
                // 1:1 显示时, 不能大于图形大小
                if( Wid.x > mpBitmapInfo->biWidth )
                    Wid.x = mpBitmapInfo->biWidth;
                if( Wid.y > mpBitmapInfo->biHeight)
                    Wid.y = mpBitmapInfo->biHeight;
                DrawDibDraw( m_hDrawDib, dc.GetSafeHdc(), 0, 0, Wid.x, Wid.y,
                    mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),
                    mPos.x, mPos.y, Wid.x, Wid.y, DDF_BACKGROUNDPAL);
            }
            else
            {
                DrawDibDraw( m_hDrawDib, dc.GetSafeHdc(),
                    0, 0, mDispR.Width(), mDispR.Height(),
                    mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),
                    0, 0, mpBitmapInfo->biWidth, mpBitmapInfo->biHeight,
                    DDF_BACKGROUNDPAL);
            }
        }
        return;
    }

    3、

    4、

    5、

  • 相关阅读:
    指针数组和数组指针表示二维数组
    scanf与getchar()区别
    选择循环
    朴素的思想
    asp.net中word转html碰到的权限异常问题(转)
    MAC下安装Fiddler抓包工具
    抓包工具charles的使用
    mysql 命令大全
    利用反射拼接SQL查询条件字符串
    赚自己的淘宝佣金,让返利网无路可走
  • 原文地址:https://www.cnblogs.com/cppskill/p/7410999.html
Copyright © 2020-2023  润新知