• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Visual C++剪貼板操作不完全攻略

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    經常在論壇上見到一些使用者詢問如何在Visual C++中如何實現對剪貼板的操作,其實在VC++/MFC中是相當簡單的。本文主要介紹了如下內容: 1、文本內容的操作 2、WMF數據的操作 3、位圖的操作 4、設置使用自定義格式 5、感知剪貼板內容的改變 6、自動將數據粘貼
        經常在論壇上見到一些使用者詢問如何在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);

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>