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