Bug in CListView oder bin ich zu blöd?
-
Na ja die hilft mir leider nicht weiter, denn die sagt mir nix, aber vielleicht ja einem von Euch:
CWnd::WalkPreTranslateTree(HWND__ * 0x002a0518, tagMSG * 0x0041eb68 {msg=0x0000c10d wp=0x00000011 lp=0x000c06ec}) line 2655 + 39 bytes CWinThread::PreTranslateMessage(tagMSG * 0x0041eb68 {msg=0x0000c10d wp=0x00000011 lp=0x000c06ec}) line 665 + 18 bytes CWinThread::PumpMessage() line 841 + 30 bytes CWinThread::Run() line 480 + 11 bytes CWinApp::Run() line 400 AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f3b, int 1) line 49 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00151f3b, int 1) line 30 WinMainCRTStartup() line 330 + 54 bytes KERNEL32! 7c816fd7()Ach ja, ich hab grad mal eine simple Anwendung ausprobiert und dabei dafür gesorgt, dass die List länger als das Fenster ist und dabei tritt kein Fehler auf. Liegt als an mir bzw. an meinem Programm...
-
Es wird noch eine Nachricht abgeabeitet, für ein fenster, dass mittlerweile zerstört ist.
Da die Nachricht 0x0000c10d ist kann ich nur sagen, dss es eine Nachricht ist, die mit RegisterWindowMessage erzeugt wurde.
Verwendest Du irgendo PostMessage für eine Nachricht, die Du selbst registriert hast?
-
Also meines Wissens habe ich keine Nachrichten selber registriert!
Da sind ein paar Dinger wie OnSelChanged usw. drin und zwei HitTests um zum einen ein Drag and Drop zu initieren und zum anderen in der List was editieren zu können.
Aber nachdem ich noch nie was von PostMessage gehört habe (der Begriff ist zwar selbsterklärend, aber ich hab den beim Arbeiten mit C++ noch nie gehört) kann ich mir nicht vorstellen, dass es damit was zu tun hat.
Aber zu der obersten Methode im Callstack hab ich noch ne Frage: woher kommt das Tree in dem Methoden Namen? Ist das ein allgemeiner Name, oder weißt der auf den CTreeView hin den ich drin habe?
-
Mit CTreeView hat das nichts zu tun. CWnd::WalkPreTranslateTree klappert die Fensterhierarchie ab und prüft, ob es Fenster gibt, die eine Nachricht bereits in CWnd::PreTranslateMessage bearbeiten.
-
Hab den Fehler gefunden und das Dank des Hinweises von Martin Richter.
Ich hab in das CListView so verändert, dass ich auch eine andere Spalte ändern kann. Allerdings war da in der Anleitung wo ich "abgekupfert" habe ein Fehler, denn das Fenster dass ich drüber gelegt habe (CEdit) hat nicht die Größe der Spalte gehabt, was ein wenig unschön war. Beim Rumexperimentieren habe ich dann manuell die Windows Benachrichtigung OnSize ausprobiert und vergessen die wieder rauszunehmen (hatte nix bewirkt - na ja außer ner Fehlermeldung).
Auf jeden Fall hab ich die jetzt wieder rausgenommen und Fehlermeldung ist weg!Drauf gebracht hat mich das Stichwort Postmessage, denn wenn ich post richtig verstehe, dann hat das was mit nach zu tun und OnSize bewirkt ja irgendwie nachherwas... (oder so ähnlich)
Auf jeden Fall vielen Dank allen die mich hier unterstütz haben, so ohne alles wäre ich da nie drauf gekommen!
Spitzenteam hier!!!CU Chris
-
WM_SIZE ist keine Nachricht dieman selber versenden sollte...
http://blog.m-ri.de/index.php/2007/12/24/die-unsitte-windows-interne-nachrichten-zu-versenden/PS: Langsam komme ich mir mir vor wie eine Gebetsmühle...
-
Schön, dass ich das jetzt erfahre. Ich hatte das Problem, dass ich das CEdit nicht in die richtige Größe bekommen habe. Und dann hab ich angefangen zu experimentieren...
Aber Danke nochmal fürs beten

-
angelus05 schrieb:
Schön, dass ich das jetzt erfahre. Ich hatte das Problem, dass ich das CEdit nicht in die richtige Größe bekommen habe. Und dann hab ich angefangen zu experimentieren...
Dann wäre MoveWindow/SetWindowPos die richtige Funktion gewesen.
-
Ähm ich habs so gelöst:
ich hab von CEdit eine Klasse abgeleitet die CSubEdit heißt und die Methode OnWindowsPosChange hat. Sobald das passiert, wird dem Ding die entsprechende Position sowie die Größe (dafür hab ich drei Membervariablen) zugewiesen.
Im eigentlichen Listview hab ich ne Membervariable der Klasse CSubEdit und sobald im ListView ein Edit beginnt (OnBeginLabelEdit) bau ich das CSubEdit per SubclassWindow zu dem CListView und weise den drei Membervariablen die entsprechenden Werte zu.ASSERT(m_item == pDispInfo->item.iItem); CRect subrect; GetListCtrl().GetSubItemRect( pDispInfo->item.iItem, m_subitem, LVIR_BOUNDS , subrect ); //get edit control and subclass HWND hWnd=(HWND)SendMessage(LVM_GETEDITCONTROL); ASSERT(hWnd!=NULL); VERIFY(m_editWnd.SubclassWindow(hWnd)); //Größe des Window auf die selbe setzen wie Spalte m_editWnd.m_cx = subrect.Width(); m_editWnd.m_cy = subrect.Height(); //move edit control text 1 pixel to the right of org label, as Windows does it... m_editWnd.m_x=subrect.left+1; m_editWnd.SetWindowText(GetListCtrl().GetItemText(pDispInfo->item.iItem,m_subitem)); //hide subitem text so it don't show if we delete some text in the editcontrol //OnPaint handles other issues also regarding this CRect rect; GetListCtrl().GetSubItemRect(pDispInfo->item.iItem,m_subitem,LVIR_LABEL ,rect); CDC* hDc = GetDC(); hDc->FillRect(rect,&CBrush(::GetSysColor(COLOR_WINDOW))); ReleaseDC(hDc);Hab ich im Internet gefunde, von alleine wäre ich da so schnell nicht drauf gekommen...
-
Man kann "jederzeit" LVM_GETEDITCONTROl aufrufen und MoveWindow auch von außen ausführen oder wenn es z.B. den Focus bekommt...
http://msdn.microsoft.com/en-us/library/bb774919(VS.85).aspxDie Methode ist aber auch OK
