System - Zwischenablage mit Unicode



  • heiho,

    Ich habe hier ein kleines problem festgestellt
    und zwar habe ich ein splitter in den MainFrame und in den Splittern werden zwei FormView klassen angezeigt
    funktioniert alles wunderbar, nur ich habe eben gemerkt das Copy/Pase aus edit feldern in den beiden views nicht funktionieren,
    ich muss separat "ID_EDIT_COPY" fangen und verarbeiten, dann geht es
    was muss ich beachten damit es "standardmaessig" funktioniert ?
    bei einer reinen dialog anwendung geht es ja auch #gruebel



  • Das ist bei Formviews normal.
    Ich hab auch ne extra Funktion dafür.

    ..keine Ahnung wieso das nicht standardmäßig geht. 😕



  • shit,
    hast du rein zufaellig die funktion "GetClipboardText" da?
    "SetClipboardText" hatte ich eh schon machen muessen {unicode, also fuer alle sprachen inkl koreanisch, kann ich hier pasten wenn du magst}



  • Mr Evil schrieb:

    shit,
    hast du rein zufaellig die funktion "GetClipboardText" da?

    Sucht du das?

    CString strFromClipboard;
    
    	// get the text from clipboard
    	if(OpenClipboard()) {
    		HANDLE l_hData = GetClipboardData(CF_TEXT);
    		if(NULL == l_hData) {
    			return 0;
    		}
    
    		char *l_pBuffer = (char*)GlobalLock(l_hData);
    		if(NULL != l_pBuffer) {
    			strFromClipboard = l_pBuffer;
    		}
    
    		GlobalUnlock(l_hData);
    		CloseClipboard();
    	}
    

    "SetClipboardText" hatte ich eh schon machen muessen {unicode, also fuer alle sprachen inkl koreanisch, kann ich hier pasten wenn du magst}

    Das wäre doch was für die FAQ. 🙂



  • stimmt, vielen dank

    Hier die Unicode/Multibyte moeglichen copy paste funktionen von CStrings

    Paste a CString into the Clipboard

    BOOL SetClipboardText(CString strText)
    {
        BOOL bRet = FALSE;
        if (OpenClipboard(NULL))
        {
            EmptyClipboard();
            int iLength = strText.GetLength();
            TCHAR *lpszText = strText.GetBuffer();
            HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, (iLength + 1) * sizeof(TCHAR));
            if (hGlobal)
            {
                LPTSTR lpszData = (LPTSTR)GlobalLock(hGlobal);
                if(lpszData)
                {
                    memcpy(lpszData, lpszText, iLength * sizeof(TCHAR));
                    lpszData[iLength] = '\0';
                    GlobalUnlock(hGlobal);
                    if(SetClipboardData(CF_UNICODETEXT, hGlobal))
                        bRet = TRUE;
                }
            }
            CloseClipboard();
        }
        return bRet;
    }
    

    Get a CString from the Clipboard

    CString GetClipboardText()
    {
    	CString strFromClipboard;
    	if(OpenClipboard(NULL))
    	{
    		HANDLE l_hData = GetClipboardData(CF_UNICODETEXT);
    		if(NULL == l_hData)
    			return 0;
    
    		TCHAR *l_pBuffer = static_cast<TCHAR*>(GlobalLock(l_hData));
    		if(NULL != l_pBuffer)
    			strFromClipboard = l_pBuffer;
    
    		GlobalUnlock(l_hData);
    		CloseClipboard();
    	}
    	return strFromClipboard;
    }
    

    Getestet mit englischen und japanischen strings



  • Mr Evil schrieb:

    Hier noch die funktionen die es ermoeglichen bestimmten text aus einer editbox in der formview zu kopieren und zu pasten

    Paste

    void CFormDialog::OnPaste()
    {
    	HWND focus = ::GetFocus();
    	CEdit *Element = NULL;
    	if(focus == m_Edit.m_hWnd)
    		Element = &m_Edit;
    	// for additional edit boxes, simply ask and assign here
    	
    	if(Element)
    	{
    		// Get the whole text
    		CString strText;
    		Element->GetWindowText(strText);
    
    		// Get clipboard text
    		CString strNewText = GetClipboardText();
    
    		// Delete the selected area from the text
    		int iStart = 0;
    		int iEnd = 0;
    		Element->GetSel(iStart, iEnd);
    		strText.Delete(iStart, iEnd - iStart);
    
    		// Add the new text inside
    		strText.Insert(iStart, strNewText);
    
    		// Set the new text and set the cursor after it
    		Element->SetWindowText(strText);
    		int iCurPos = iStart + strNewText.GetLength();
    		Element->SetSel(iCurPos, iCurPos);
    	}
    }
    

    Copy

    void CFormDialog::OnCopy()
    {
    	HWND focus = ::GetFocus();
    	CEdit *Element = NULL;
    	if(focus == m_Edit.m_hWnd)
    		Element = &m_Edit;
    	// for additional edit boxes, simply ask and assign here
    	
    	if(Element)
    	{
    		// Get the whole text
    		CString strText;
    		Element->GetWindowText(strText);
    
    		// Get the selected area from the text
    		int iStart = 0;
    		int iEnd = 0;
    		Element->GetSel(iStart, iEnd);
    		strText = strText.Mid(iStart, iEnd - iStart);
    
    		// Set the cplipboard text
    		SetClipboardText(strText);
    	}
    }
    

    STRG+A (Select all)

    void CFormDialog::OnSelectAll()
    {
    	HWND focus = ::GetFocus();
    	CEdit *Element = NULL;
    	if(focus == m_Edit.m_hWnd)
    		Element = &m_Edit;
    	// for additional edit boxes, simply ask and assign here
    
    	if(Element)
    		Element->SetSel(0, Element->GetWindowTextLength());
    }
    

    Mr Evil schrieb:

    eventuell kannst du noch dazu schreiben dass

    wenn SetClipboardText oder GetClipboardText als member einer klasse sind, muss
    OpenClipboard ohne argumente aufgerufen werden


Log in to reply