ListView - Beliebige Zelle markieren
-
wer lesen kann ist klar im vorteil

Mr Evil schrieb:
was aber geht ist ein full-row select, da ist dann die ganze zeile markiert
das gegenteil von einem einzelnen SubItem aus dem die gesammte zeile besteht
und das mit dem Editierbarem Subitem ist etwas komplizierter aber nicht unmöglich.
-du must dir als erstes ein Editfeld erstellen welches du versteckst (SW_HIDE) bzw. nicht sichtbar erstellst.
-dann must du das ereigniss bei welchem du das Subitem bearbeiten wills abfangen. (Doppelklick, Rechtsklick ....)
- dann brauchst du die Zeilen Nr & das SubItem auf das geklickt wurde, aus diesem holst du dir den Text.
- ferner brauchst du das rechteck des Subitems auf das geklickt wurde.
- jetzt übergibst du an das Editfeld die rechteckkoordinaten und den Text aus dem SubItem und machst dieses Sichtbar.
- nachdem du den text editiert hast brauchst du erneut ein ereigniss das du abfängst evtl eine Taste (Enter).
- daraufhin holst du dir den Text aus dem Editfeld versteckst es wieder und fügst den editierten text in das SubItem der zeile ein.
das war der weg dorthin. es gibt noch eine Message funktion LVM_EDITLABEL diese ruft automatisch ein Editfeld auf jedoch nur über dem ersten SubItem der jeweiligen Spalte.
[NEW EDIT]
und mit zeichnen meint Evil das du dich selbst drum kümmern must wie du das einzelnen Subitem markiert bekommst, sollte über WM_DRAWITEM funktionieren
-
Wieso benutzt du nich datagrid
-
also erst Mal sehr großes Dankwort an LowFly!!

ich werd es versuchen, aber beführchte, dass es ein langer Weg wird...
datagrid ist ne Klasse des wfc und ich brauch SDK

oo man
weiss jemand wie man aus einem textfeld mittels Drücken auf ein button der inhalt kopiert und in die erste Zelle einfüht???(wahrscheinlich lacht euch jetzt hier kaputttttt...)

-
japs #gg
ne scherz, jeder faengt klein an
was du brauchst ist
OnButtonKlick:
::SendMessage(m_EditCtrlWnd, WM_GETWINDOWTEXT, ....);
dann hast du den text, und je nachdem was du fuer eine liste hast laeuft das einfuegen andersschau dir einfach die moeglichen messages fuer deine elemente an, dann findest du die noetigsten informationen
-
hallo
und besten Dank !
also ichhabe die Methode in die ich das Ereignis schreiben soll - oder?LRESULT CALLBACK ButtonEventHandler1( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
int nDebug = 0;
switch (uMsg)
{
case WM_LBUTTONUP:
nDebug = nDebug;
break;
}

return CallWindowProc( OrigButtonWindowProc, hwnd, uMsg, wParam, lParam );
}
bin schon ungeduldig
-
der button hat ein eigenen message handler, interessant, unnoetig aber kann man so machen ja
{das parent bekommt eine command message wenn das button geklickt wurde, eine eigene message prozedur ist dafuer unnoetig}
das problem ist, in den button message handler kennst du das handle zur editbox nicht sofern diese nicht global istBeispiel:
(ungetestet aus den kopf)
case WM_CREATE: hButton = CreateWindow(... ID_BUTTON); hEdit = CreateWindow(... ID_EDIT); case WM_COMMAND: switch(LOWORD(wParam)) { case ID_BUTTON: // wenn button geklickt ::SendMessage(hEdit, WM_GETWINDOWTEXT, ...) // tu was auch immer mit den text }
-
Mr Evil schrieb:
in den button message handler kennst du das handle zur editbox nicht sofern diese nicht global ist
dann hol dir doch das Handle auf das EditFeld mit
HWND hWndEdit = ::GetDlgItem(hWndParent,IDC_DEIN_EDITFELD);und hWndParent ist der erste Parameter in der Callbackfunktion des Hauptdialogfeldes

-
oooh je Jungs! Ihr seid spitze!
zwar geht es noch net bei mir, aber jetzt versteh ich schon mehr...zu Mr Evil:
wenn ich die beiden zeilen vervollständige, dan sagt "er" mir zu viele parameter..
hButton = CreateWindow(... ID_BUTTON);
hEdit = CreateWindow(... ID_EDIT);hab die auskommentiert:
EdHwnd = CreateWindow("EDIT","text in ",ES_AUTOHSCROLL| WS_VISIBLE|WS_CHILD|WS_BORDER,
600,50,120, 30, hWnd, (HMENU)1201, hInst, 0/,ID_EDIT/);button = CreateWindow("BUTTON","Button Name",WS_VISIBLE | WS_CHILD,600,100,120,30,
hWnd,(HMENU)1202,/*IDB_CLASS_OPTIONS,*/hInst/(HINSTANCE)GetWindowLong(insert, GWL_HINSTANCE)/,0/,WM_LBUTTONUP/);?

-
mach das doch mal ein bischen sortierter und klatsch nicht alles in den befehlsaufruf.
da erkennt man ja nix mehr und übersieht fehler.
wie unten aufgeführt funzt das bei mir einwandfrei
CRect rc; rc.left = 10; rc.top = 30; rc.right = 150; rc.bottom = 130; DWORD dwEditStyle = WS_CHILD|WS_BORDER|WS_VISIBLE|WS_OVERLAPPED|ES_MULTILINE; HINSTANCE hInstance = (HINSTANCE) GetWindowLong(hWnd,GWL_HINSTANCE); HWND hWndEdit = CreateWindow(_T("EDIT"),_T(""),dwStyle, rc->top,rc->left,rc->Width(),rc->Height(), hWnd,(HMENU)IDC_DEINEDITFELD,hInstance,NULL);
-
Kämpfer schrieb:
datagrid ist ne Klasse des wfc und ich brauch SDK

wo is das MFC/WFC
This article presents a DataGrid control which is built with no MFC. It can be used in SDK or MFC Win32 applications. This source code is also compiled with GNU compiler and has shown to be stable.
-
Ah ich korrigier mich, du hast die ID schon uebergeben, das machst du mit der HMENU, ich hatte es nur falsch in erinnerung da ich mein eigene WinAPI lib benut, und da hatte ich es als eigenes fenster.
dh
Fenster kannst du erstellen wie du es bisher schon gemacht hast, und dann bei WM_COMMAND die ID abfragen welche du bei HEMNU uebergeben hast beim erstellen
-
ok DANKE an ALLE!
ich habe hinbekommen: HURRRAAAA!
mit ach und Krach aber es geht: die beliebige Zelle kann beschrieben werden.nun möchte ich mir bequem auswählen, in welche Zelle(Spalte/Zeile) was reingeschrieben wird

-
du must unter WM_NOTIFY die Liste und das spezielle ereigniss abfangen
unter der NM_LISTVIEW strucktur findest du dann die gewünschten informationencase WM_NOTIFY: { switch(LOWORD(wParam)) { case IDC_LIST: { switch(((LPNMHDR)lParam)->code) { case NM_DBLCLK: { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)((LPNMHDR)lParam); pNMListView->iItem; pNMListView->iSubItem; }mit ListView_GetSubItemRect holst du dir dann die genaue Position der Spalte innerhalb der Liste.
mit MoveWindow bewegst du dann das editfeld genau über die Spalte auf die du geklickt hast, bzw. setzt du damit auch zugleich das Editfeld auf die richtige größe die die Spalte hat
