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

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

        Visual C++剪貼板設(shè)置不完全攻略

        Visual C++剪貼板設(shè)置不完全攻略

        更新時間:2021-11-16 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

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

        一、文本內(nèi)容的操作
        下面的代碼示范了如何將文本內(nèi)容復(fù)制到剪貼板:

        Cstring source;
        //文本內(nèi)容保存在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();
        }

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

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

        二、WMF數(shù)據(jù)的操作

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

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

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

        //調(diào)用繪圖例程

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

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

        //刪除dc
        delete cDC;
        }

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

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

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

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


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

        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"));

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

        delete junk;
        }

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

        if(OpenClipboard())
        {
        //獲得剪貼板數(shù)據(jù)
        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();
        }

        四、設(shè)置并使用自定義格式

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

        struct MyFormatData
        {
        long val1;
        int val2;
        };

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

        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);

        //保存到內(nèi)存
        *buffer = data;

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

        讀取數(shù)據(jù)使用以下代碼:

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

        data = *buffer;

        GlobalUnlock(hData);
        CloseClipboard();
        }

        五、感知剪貼板內(nèi)容的改變

        通過Windows消息可以感知剪貼板內(nèi)容是否發(fā)生改變,代碼如下:

        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();
        }

        六、自動將數(shù)據(jù)粘貼到另一應(yīng)用程序窗口

        只需獲得相應(yīng)窗口的句柄,并發(fā)送一個消息就可以了:

        SendMessage(m_hTextWnd, WM_PASTE, 0, 0);

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

        本類教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 国产亚洲精品自在久久| 亚洲va中文字幕无码| 亚洲精品高清国产一久久| 一级毛片在播放免费| 亚洲 小说区 图片区 都市| 国产亚洲精品91| 免费很黄很色裸乳在线观看| 国产精品自拍亚洲| 免费国产怡红院在线观看| 高h视频在线免费观看| 亚洲欧洲中文日韩久久AV乱码| 人妻免费久久久久久久了| 亚洲色图综合在线| 永久免费av无码入口国语片| 亚洲一区二区三区在线观看精品中文 | 国内精自视频品线六区免费| 亚洲乱码中文字幕小综合| 妞干网免费视频观看| 国产亚洲综合久久| 久热综合在线亚洲精品| 69天堂人成无码麻豆免费视频| 亚洲av无码有乱码在线观看| 亚洲成A人片在线观看中文| 中文在线免费观看| 亚洲网址在线观看| 国产成人精品免费视频大全五级| 一级毛片在播放免费| 久久亚洲精品无码aⅴ大香| 免费无码肉片在线观看| 三年片在线观看免费观看大全中国 | 91亚洲va在线天线va天堂va国产| 99爱在线精品免费观看| 亚洲AV无码一区二区三区性色| 成人亚洲综合天堂| 亚洲精品免费视频| 亚洲爆乳成av人在线视菜奈实| 亚洲女同成人AⅤ人片在线观看| 免费的全黄一级录像带| 国产亚洲sss在线播放| 久久久久亚洲爆乳少妇无| 69天堂人成无码麻豆免费视频|