WM_PASTE + CEdit?



  • Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen.
    Jetzt habe ich es mit EN_UPDATE erledigt.
    Mich stört einfach, dass man das CEdit mit dem Clipboard überlisten kann und trotz Begrenzung auf numerische Werte per Copy + Paste alles reinkopieren kann was man will. Das CEdit überprüft den Inhalt erst wieder bei UpdateData(TRUE) und setzt den gesamten Inhalt auf "0" wenn ein nicht-numerischer Wert gefunden wird. Das ist irgendwie nicht so klasse...
    Ich finde EN_UPDATE eignet sich auch deshalb gut als Zeitpunkt zur Korrektur, weil es vor WM_PAINT kommt und das Auswechseln der Zeichen so kein Flackern im Control erzeugt.
    Nun kann man reinkoperen was man will, wenn ein nicht-numerischer Wert dabei ist, wird auf "0" gesetzt, nun aber schon bei der Eingabe.

    void CMyDlg::OnUpdateNumericEdit() 
    {
    	CString strText;
    	BOOL bIsNumeric = TRUE;
    	CWnd* pCtrl	= GetFocus();
    	pCtrl->GetWindowText(strText);
    	TCHAR chTemp;
    	int n, nMax = strText.GetLength();
    	for (n = 0; n < nMax; ++n)
    	{
    		chTemp = strText.GetAt(n);
    		if ((int)chTemp < 48 || (int)chTemp > 57)
    			bIsNumeric = FALSE;
    	}
    	if (!bIsNumeric)
    		pCtrl->SetWindowText(_T("0"));
    }
    

    Danke trotzdem für Deinen Vorschlag!
    Gruß T. 🙂



  • Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen

    BOOL MyDlg::PreTranslateMessage(MSG* pMsg){
    	if(pMsg->message == WM_PASTE).....
    


  • Die WM_PASTE Nachricht wird ja auch gesendet und nicht gepostet. Deshalb kommt sie dort niemals an.



  • aha, dann kann's damit ja auch nicht funzen.
    Hatte nämlich genau Windalf's Code und es passierte genau gar nix...
    Gruß T.



  • ach daher weht der wind...
    na da wär ich dann wohl auch gut auf die schnauze geflogen... 😃



  • .. schrieb:

    Die WM_PASTE Nachricht wird ja auch gesendet und nicht gepostet. Deshalb kommt sie dort niemals an.

    aha, kann man das vielleicht irgendwo nachlesen? bisher dachte ich da kommen einfach alle MSG durch und man kann dann die rausfischen die man haben möchte? Wie issn der unterschied zwischen gesendet/gepostet 😕



  • CWnd::PreTranslateMessage

    Used by class CWinApp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions.

    Wenn die Message gesendet wird (SendMessage), wird die WndProc direkt aufgerufen, ohne diesen Umweg.



  • aha! danke..



  • Windalf schrieb:

    Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen

    BOOL MyDlg::PreTranslateMessage(MSG* pMsg){
    	if(pMsg->message == WM_PASTE).....
    

    ich denke am einfachsten wäre

    BOOL MyDlg::PreTranslateMessage(MSG* pMsg){
    	if(pMsg->message == WM_PASTE)
                   pMsg->message = NULL;
    


  • lol



  • Reticent schrieb:

    Windalf schrieb:

    Also WM_PASTE ist bei PreTranslateMessage bei mir irgendwie nicht rauszufischen gewesen

    BOOL MyDlg::PreTranslateMessage(MSG* pMsg){
    	if(pMsg->message == WM_PASTE).....
    

    ich denke am einfachsten wäre

    BOOL MyDlg::PreTranslateMessage(MSG* pMsg){
    	if(pMsg->message == WM_PASTE)
                   pMsg->message = NULL;
    

    Wenn die WM_PASTE über die PreTranslateMessage() gehen würde könnte das schon sein 🙂


Anmelden zum Antworten