Inaktive listview



  • Hier noch etwas Code:

    INT_PTR CALLBACK NewCB(HWND hwnd,
    							UINT msg,
    							WPARAM wParam,
    							LPARAM lParam)
    {
    	WNDPROC p = (WNDPROC)GetWindowLongPtr(hwnd,GWL_USERDATA);
    	if(p)
    	{
    		switch(msg)
    		{
    			case WM_LBUTTONDOWN:
    			case WM_LBUTTONUP:
    				return 1;
    		}
    		return (CallWindowProc(p,hwnd,msg,wParam,lParam));
    	}
    	return 0;
    }
    

    Und bei der Initialisierung des Dialogs/Fenster

    DWORD_PTR old = GetWindowLongPtr(GetDlgItem(hwnd,IDC_XYZ),GWL_WNDPROC);
        SetWindowLongPtr(GetDlgItem(hwnd,IDC_XYZ),GWL_WNDPROC,(DWORD_PTR)NewCB);
        SetWindowLongPtr(GetDlgItem(hwnd,IDC_XYZ),GWL_USERDATA,(DWORD_PTR)old);
    

  • Mod

    Das geht viel einfacher. Behnadle LVN_ONITEMCHANGING und verweigere eine Änderung, das gilt auch für Statusänderungen.



  • Martin Richter schrieb:

    Das geht viel einfacher. Behnadle LVN_ONITEMCHANGING und verweigere eine Änderung, das gilt auch für Statusänderungen.

    Was meinst du mit Änderungen verweigern?
    Einfach die message abfangen und unbehandelt lassen oder die Parameter verändern und den standart Handler machen lassen?

    Crazy Thread



  • stan**** ???
    Wieso sind da jetzt Sterne????
    Das Wort soll "standart" heissen! 🤡

    Crazy Thread



  • unglaublich....!
    s t a n d a r t



  • Der Vorschlag von Martin Richter ist natürlich einfacher, du musst LVN_ITEMCHANGING im WM_NOTIFY-Zweig abfangen und TRUE zurückliefern.
    http://msdn.microsoft.com/en-us/library/bb774847%28VS.85%29.aspx



  • Klingt unglaublich, aber wahr:
    Es heißt standard !

    Crazy Thread schrieb:

    Was meinst du mit Änderungen verweigern?
    Einfach die message abfangen und unbehandelt lassen oder die Parameter verändern und den stan**** Handler machen lassen?

    LVN_xxx ist eine Notification (erkennbar am Buchstaben 'N'.
    D.h. Windows informiert vorher die Applikation, bevor Windows die Aktion ausführen darf.
    In diesem Fall kannst Du durch geeigneten Return-Wert die entsprechende Aktion unterbinden.
    Guck mal in der MSDN Doku nach, dort steht alles Wissenswerte drin.

    HTH,
    Martin



  • Hats es so geklappt?

    [Nachtrag:]
    Du hast nicht erwähnt, ob Du Dein ListView als (Child-)Fenster selbst angelegt hast oder in einer Resource eines Dialogs definiert hast.

    Im Falle des Dialogs mußt Du den Return-Wert retval anders handhaben:

    SetWindowLongPtr( hwnd_dialog, DWLP_MSGRESULT, retval );  //Bei Dialogen mußt Du  Deinen Return-Wert so übergeben!
    return( TRUE );  //Rückgabewert für Dialog-Manager:
                     //TRUE steht hier für "Nachricht wurde bearbeitet"
    

    Siehe auch "Returning values from a dialog procedure": http://blogs.msdn.com/b/oldnewthing/archive/2003/11/07/55619.aspx

    HTH,
    Martin



  • Hi,

    danke erstmal für eure Antworten.
    Ja die ListView ist als Resource im Dialog definiert.

    Ich werd sobald ich Zeit finde es verscuhen und nochmal posten ob alles geklappt hat.

    Crazy Thread



  • Hat alles wunderbar geklappt, dank euch.

    Übrigens, ich arbeite unter Windows CE 6.0 R3, hatte ich vergessen zu erwähnen!

    Da muss ich an Stelle von

    SetWindowLongPtr( hwnd_dialog, DWLP_MSGRESULT, retval );
    

    folgendes verwenden

    SetWindowLong(hDlg,DWL_MSGRESULT,TRUE);
    

    ciao
    Crazy Thread


Anmelden zum Antworten