• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        Visual C++剪貼板設置不完全攻略

        Visual C++剪貼板設置不完全攻略

        更新時間:2021-11-16 文章作者:未知 信息來源:網絡 閱讀次數:

            經常在論壇上見到一些使用者詢問如何在Visual C++中如何實現對剪貼板的操作,其實在VC++/MFC中是相當簡單的。本文主要介紹了如下內容:
        1、文本內容的操作
        2、WMF數據的操作
        3、位圖的操作
        4、設置使用自定義格式
        5、感知剪貼板內容的改變
        6、自動將數據粘貼到另一應用程序窗口

        一、文本內容的操作
        下面的代碼示范了如何將文本內容復制到剪貼板:

        Cstring source;
        //文本內容保存在source變量中
        if(openClipboard())
        {
        HGLOBAL clipbuffer;
        char * buffer;
        EmptyClipboard();
        clipbuffer = GlobalAlloc(GMEM_DDESHARE, dource.GetLength()+1);
        buffer = (char*)GlobalLock(clipbuffer);
        Strcpy(buffer, LPCSTR(source));
        GlobalUnlock(clipbuffer);
        SetClipboardData(CF_TEXT,clipbuffer);
        CloseClipboard();
        }

        下面的代碼顯示了如何從剪貼板上獲得文本內容:

        char * buffer = NULL;
        //打開剪貼板
        CString fromClipboard;
        if ( OpenClipboard() )
        {
        HANDLE hData = GetClipboardData(CF_TEXT);
        char * buffer = (char*)GlobalLock(hData);
        fromClipboard = buffer;
        GlobalUnlock(hData);
        CloseClipboard();
        }

        二、WMF數據的操作

          在剪貼板上讀寫圖象數據是非常有用的功能,并且實現起來也很簡單。下面的代碼顯示了如何將擴展圖元文件復制到剪貼板:

        if(OpenClipboard());
        {
        EmptyClipboard();

        //創建圖元文件DC
        CMetaFileDC * cDC = new CMetaFileDC();
        cDC->CreateEnhanced(GetDC(),NULL,NULL,"the_name");

        //調用繪圖例程

        //關閉CMetafileDC并獲得它的句柄
        HENHMETAFILE handle = cDC->CloseEnhanced();

        //復制到剪貼板
        SetClipBoardData(CF_ENHMETAFILE,handle);
        CloseClipboard();

        //刪除dc
        delete cDC;
        }

        下面的代碼演示了從剪貼板獲得圖元文件并將其繪制到client DC上:

        if(OpenClipboard())
        {
        //獲得剪貼板數據
        HENMETAFILE handle = (HENMETAFILE)GetClipboardData(CF_ENHMETAFILE);

        //顯示
        CClientDC dc(this);
        CRect client(0,0,200,200);
        dc.PlayMetaFile(handle,client);

        //關閉剪貼板
        CloseClipboard();
        }
        三、位圖的操作


        位圖的操作稍微復雜一點,下面這個例子顯示了如何在剪貼板保存位圖:

        if(OpenClipboard())
        {
        EmptyClipboard();
        CBitmap * junk = new CBitmap();
        CClientDC cdc(this);
        CDC dc;
        dc.CreateCompatibleDC(&cdc);
        CRect client(0,0,200,200);
        junk->CreateCompatibleBitmap(&cdc,client.Width(),client.Height());
        dc.SelectObject(junk);

        DrawImage(&dc,CString("Bitmap"));

        //復制數據到剪貼板
        SetClipboardData(CF_BITMAP,junk->m_hObject);
        CloseClipboard();

        delete junk;
        }

        下面的代碼顯示了如何從剪貼板上獲得位圖數據:

        if(OpenClipboard())
        {
        //獲得剪貼板數據
        HBITMAP handle = (HBITMAP)GetClipboardData(CF_BITMAP);
        CBitmap * bm = CBitmap::FromHandle(handle);

        CClientDC cdc(this);
        CDC dc;
        dc.CreateCompatibleDC(&cdc);
        dc.SelectObject(bm);
        cdc.BitBlt(0,0,200,200,&dc,0,0,SRCCOPY);

        CloseClipboard();
        }

        四、設置并使用自定義格式

        使用RegisterClipboardFormat()函數,可以復制和粘貼任何你需要的數據類型。比如我們有以下一個數據類型:

        struct MyFormatData
        {
        long val1;
        int val2;
        };

        我們要把它復制到剪貼板,可以使用如下的代碼:

        UINT format = RegisterClipBoardFormat("MY_CUSTOM_FORMAT");
        if(OpenClipboard())
        {
        MyFormatData data;
        data.val1 = 100;
        data.val2 = 200;

        HGLOBAL clipbuffer;
        EmptyClipboard();
        clipbuffer = GlobalAlloc(GMEM_DDESHARE, sizeof(MyFormatData));
        MyFormatData * buffer = (MyFormatData*)GlobalLock(clipbuffer);

        //保存到內存
        *buffer = data;

        //保存到剪貼板
        GlobalUnlock(clipbuffer);
        SetClipboardData(format,clipbuffer);
        CloseClipboard();
        }

        讀取數據使用以下代碼:

        UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
        MyFormatData data;
        if(Openclipboard())
        {
        HANDLE hData =GetClipboardData(format);
        MyFormatData * buffer = (MyFormatData*)GlobalLock(hData);

        data = *buffer;

        GlobalUnlock(hData);
        CloseClipboard();
        }

        五、感知剪貼板內容的改變

        通過Windows消息可以感知剪貼板內容是否發生改變,代碼如下:

        In your initialization code call:
        SetClipboardViewer(); //將我們的程序添加到剪貼板觀察鏈

        In your message map add:
        ON_MESSAGE(WM_DRAWCLIPBOARD, OnClipChange) //添加Message handle

        Which is declared as:
        afx_msg void OnClipChange();

        Finally implement:
        void CDetectClipboardChangeDlg::OnClipChange()
        {
        CTime time = CTime::GetCurrentTime();
        SetDlgItemText(IDC_CHANGED_DATE,time.Format("%a, %b %d, %Y -- %H:%M:%S"));

        DisplayClipboardText();
        }

        六、自動將數據粘貼到另一應用程序窗口

        只需獲得相應窗口的句柄,并發送一個消息就可以了:

        SendMessage(m_hTextWnd, WM_PASTE, 0, 0);

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 婷婷国产偷v国产偷v亚洲| 在线亚洲午夜片AV大片| 怡红院免费全部视频在线视频| 国产美女无遮挡免费视频 | 日本免费人成视频播放| 亚洲va在线va天堂va手机| 久久国内免费视频| 亚洲无吗在线视频| 尤物永久免费AV无码网站| 午夜在线亚洲男人午在线| 亚洲日韩在线观看免费视频| 好湿好大好紧好爽免费视频| 亚洲线精品一区二区三区影音先锋| 三上悠亚电影全集免费| 亚洲AV无码日韩AV无码导航| 精品熟女少妇av免费久久| 亚洲国产成人久久99精品| 国产精品久久久久影院免费| 香港经典a毛片免费观看看| 亚洲一级特黄大片无码毛片| 十八禁视频在线观看免费无码无遮挡骂过 | 最近免费最新高清中文字幕韩国 | 国产精品日本亚洲777| 亚洲一区视频在线播放| 久久免费精品视频| 亚洲国产精品免费观看| 免费一级毛片清高播放| 日韩电影免费在线观看| 亚洲精品乱码久久久久久V| 亚洲精品无码av天堂| 人妻无码久久一区二区三区免费 | 免费大片黄在线观看| 日本红怡院亚洲红怡院最新| 成年黄网站色大免费全看| 精品久久亚洲一级α| 亚洲国产精品无码中文字| 永久免费AV无码国产网站| 精品免费久久久久国产一区| 亚洲午夜成激人情在线影院| 亚洲国产免费综合| 57pao一国产成视频永久免费|