Foro | | | | - Página 1 - |
| Normann Strübli | ¡Hola Franco, hallo Comunidad,
Yo bastel gerade a una Listview welches Bargraphen y Bilder enthalten kann. (war en efecto ya veces irgendwo gefordert ) Dieser Code es lediglich una Anfang aber kann y se con Eurer Ayuda weiterentwickelt voluntad. Leider Yo ihn auch todavía no auskommentiert, aber así schwer es él glaub Yo auch no a verstehen.
Yo hoffe allerdings Franco su überzeugen a puede así una Función en seine Listview con aufzunehmen ;D Als Anhang Yo veces Vorlagen el con masm programmiert son beigefügt. -Am besten veces angucken el Beispiele son auch como ausführbare Expediente disponible. FRANK BITTE GUCK DIR DAS AN!!!
Gleich ni Cuestión: Yo habe el Listview el LVS_OWNDERDRAWFIXED Style verpasst, como sí ansonsten no wm_drawitem nachricht a el Elternfenster gesand se. Kann uno lo hinbekommen el sólo en uno Spalte esta Nachricht verschickt se, entonces debería uno no el komplette control incluso dibujar?!...
Saludo Normann KompilierenMarcaSeparación $H Windows.ph
$H Structs.ph
$H Messages.ph
$H Commctrl.ph
$H Structs.ph
Set(FastMode,1)
Def Hiword(1) And(&(1)>>16,$Ffff)
Def Loword(1) And(&(1),$Ffff)
declare test&,itemtext$
itemtext$ = TestItem
Struct Hd_notify = ~Hd_notify
Declare Hd_notify#
Dim Hd_notify#,Hd_notify
Struct NMHDR = ~NMHDR
Declare NMHDR#
Dim NMHDR#,NMHDR
Struct DRAWITEMSTRUCT = ~DRAWITEMSTRUCT
Declare DRAWITEMSTRUCT#
Dim DRAWITEMSTRUCT#,DRAWITEMSTRUCT
Struct Rect = ~Rect
Declare Rect#
Dim Rect#,Rect
struct TWindowClass = ~WndClass
struct TMsg = ~Msg
declare WindowClass#, Msg#
declare AppName$
$I Listview_Funktionen.inc
Declare lvdll&
lvdll&=usedll(Listview.dll)
AppName$ = Listview Test
proc WindowProc
parameters Window&, Message&, WParam&, LParam&
If Message& = ~Wm_notify
NMHDR# = Lparam&
if NMHDR#.hwndfrom& = listview&
if NMHDR#.code& = ~NM_KILLFOCUS Das Control hat den Focus verloren
elseif NMHDR#.code& = ~NM_SETFOCUS Das Control hat den Focus bekommmen
elseif NMHDR#.code& = ~NM_CLICK Der Anwender hat die linke Maustaste im Control geklickt
elseif NMHDR#.code& = ~NM_DBLCLK Der Anwender hat die linke Maustaste im Control doppel-geklickt
elseif NMHDR#.code& = ~NM_OUTOFMEMORY Das Control konnte die Aktion Aufgrund zu wenig Speicher nicht ausführen
elseif NMHDR#.code& = ~NM_RCLICK Der Anwender hat die rechte Maustaste im Control geklickt.
elseif NMHDR#.code& = ~NM_RDBLCLK Der Anwender hat die rechte Maustaste im Control doppel-geklickt.
elseif NMHDR#.code& = ~NM_RETURN Der Anwender hat die ENTER-Taste im Control gedrückt
elseif NMHDR#.code& = ~LVN_COLUMNCLICK Das Control hat den Focus bekommmen
Endif
endif
endif
if Message& = ~wm_drawitem
if Wparam& = listviewid&
DRAWITEMSTRUCT# = lparam&
Long Rect#,0 = Long(DRAWITEMSTRUCT#,28)
Long Rect#,4 = Long(DRAWITEMSTRUCT#,32)
Long Rect#,8 = Long(DRAWITEMSTRUCT#,36)
Long Rect#,12 = Long(DRAWITEMSTRUCT#,40)
If And(Long(Lparam&,16),1)
~SelectObject(DRAWITEMSTRUCT#.Hdc&,~CreateSolidBrush(@RGB(200,0,0)))
~SetBkColor(DRAWITEMSTRUCT#.hdc&,@RGB(100,100,200))
else
~SetBkColor(DRAWITEMSTRUCT#.hdc&,@RGB(200,200,200))
~SelectObject(DRAWITEMSTRUCT#.Hdc&,~CreateSolidBrush(@RGB(0,200,0)))
endif
~Exttextout(DRAWITEMSTRUCT#.Hdc&,rect#.left&,rect#.top&,~Eto_OPAQUE,Rect#,Addr(Itemtext$),Len(Itemtext$),0)
~Rectangle(DRAWITEMSTRUCT#.Hdc&,120,rect#.top&,120 + rect#.top&,rect#.bottom&)
endif
endif
if Message& = ~wm_Destroy
CloseProc
~PostQuitMessage(0)
END
endif
return ~DefWindowProc(Window&, Message&, WParam&, LParam&)
endproc
proc WinMain
declare Window&, Message&
dim WindowClass#,TWindowClass
dim Msg#,TMsg
with WindowClass#
.style& = 0
.lpfnWndProc& = ProcAddr(WindowProc,4)
.cbClsExtra& = 0
.cbWndExtra& = 0
.hInstance& = %HInstance
.hIcon& = ~LoadIcon(0,~idi_Information)
.hCursor& = ~LoadCursor(0, ~idc_Arrow)
.hbrBackground& = ~GetStockObject(~white_Brush)
.lpszMenuName& = Addr(AppName$)
.lpszClassName& = Addr(AppName$)
endwith
if ~RegisterClass(WindowClass#) = 0
~MessageBox(0,Fenster konnte nicht registriert werden!,Fehler,0)
end
endif
Window& = ~CreateWindowEx(
0,
Addr(AppName$),
Addr(AppName$),
~ws_OverlappedWindow,
~cw_UseDefault,
~cw_UseDefault,
~cw_UseDefault,
~cw_UseDefault,
0,
0,
%HInstance,
0)
~ShowWindow(Window&, ~sw_ShowNormal)
~UpdateWindow(Window&)
InitMessages(Window&)
Declare listview&,ListviewId&,Column$
Listview& = CreateListview(Window&,%HInstance,0,-1,-1,$23)
~SetWindowLong(Listview&,~GWL_STYLE,@Or(~Getwindowlong(Listview&,~GWL_STYLE),~LVS_OWNERDRAWFIXED))
~Setprop(Listview&,OldCallback,~Setwindowlong(Listview&,~Gwl_wndproc, Procaddr(Listviewcallback,4)))
ListviewId& = ~Getwindowlong(Listview&,~GWL_ID)
Autosortlistview Listview&,1,1,1,1,2,2
Column$ = Column 1
IColumn(Listview&,addr(Column$),120,0)
Column$ = Column 2
IColumn(Listview&,addr(Column$),120,0)
Column$ = Column 3
IColumn(Listview&,addr(Column$),120,0)
Declare bereich#,text1$,text2$,text3$
dim bereich#,1000
text1$=Neues_Item 1
text2$=Neues_Item 2
text3$=Neues_Item 3
long bereich#,0=addr(text1$)
long bereich#,4=addr(text2$)
long bereich#,8=addr(text3$)
WhileLoop 8
SItem(listview&,bereich#,3)
EndWhile
Showlistview(Listview&,32,32,500,400)
Dispose bereich#
while ~GetMessage(Msg#, 0, 0, 0) > 0
~TranslateMessage(Msg#)
~DispatchMessage(Msg#)
endwhile
end
endproc
WinMain
Proc Listviewcallback
Parameters Wnd&, Msg&, Wparam&, Lparam&
If Msg& = ~Wm_notify
NMHDR# = Lparam&
If (NMHDR#.code& = ~Hdn_begintrackw) OR (NMHDR#.code& = ~Hdn_DIVIDERDBLCLICKw) Die HDN_BeginTrack Botschaft abfangen und löschen!
Hd_notify# = Lparam&
if (Hd_notify#.iButton& = 0) OR (Hd_notify#.iButton& = 1)
Return 1
Endif
Endif
Endif
Return ~Callwindowproc(~Getprop(Wnd&,OldCallback),Wnd&, Msg&,Wparam&,Lparam&)
Endproc
Proc Closeproc
Clo ages (window& )
$I Listview_dispose.inc
ENDPROC
|
| | | | |
| | | | | - Página 1 - |
| Normann Strübli | ¡Hola,
@Franco: Yo hoffe Usted hast el Feier schadenfrei überstanden
Yo werd todavía wahnsinnig en Owerdraw-Geschichte Por favor, helft me !!!
folgendes Problema:
El WM_DRAWITEM -Nachricht se siempre sólo una vez pro Línea verschickt, el SubItems necesario sí aber auch redibujar y ser exactamente fehlt me el richtige Lösungsansatz.
Jetzt lese en uno Bucle cada Spalten de, aber el es nun wirklich no optimal...
Bitte schaut Euch el Ejemplo una vez a y gebt me algo Hilfestellung Yo lo mejor lösen kann. |
| 4 kB | | Kurzbeschreibung: | Ownerdraw Listview -Lösungsansatz | | Hochgeladen: | 09.11.2005 | | Ladeanzahl: | | | | Descargar |
| | | | |
| | Frank Abbing | ¡Hola Normann,
sí, el Feier war bien. Mein Computer war aber en Reparatur y verhält se siempre todavía algo seltsam. Yo bin todavía no a deinen Sachen gekommen. Morgen, hoffe Yo. |
| | | | |
| | Normann Strübli | Hi,
Neue Versión, Por favor, Testen! (Jetzt sin igual una Farbflash a bekommen) Sollte se ahora como una bastante normales Listview-Control comportamiento.
Der Vorteil es z.B. el el Color de fondo el selektierten Línea siempre erkennbar restos
Saludo Normann
Hier maln Screenshot: |
| | | | |
| | Frank Abbing | Hi,
Normann, poste hier auch veces deine ph-Archivos. Yo bekomme una Fehlermeldung y kanns no testen.
El Ensamblador.dll kannte Yo ya. Wenn Yo mich correcto erinnere, es ellos aber nie fertig geworden. ¿Por qué se Yo el Dll-Características porque para el Listview.dll umsetzen, si du el zusätzliche Dll ya hast? Kombiniere doch simplemente beide Dlls. |
| | | | |
| | Normann Strübli | Aarrghh!!!
Stimmt el Structs.ph ha una Fehler, hier el korrigierte Versión. |
| | | | |
| | Frank Abbing | Hi,
ok, habs getestet. Aber qué bezweckst du ahora así? Was genau möchtest du de me? Willst du Balken y Torten en Listviews? |
| | | | |
| | Michael Wodrich | Zumindest doch el Balken. Kann Yo como Prozentbalken en una Expediente-Downloader bien vorstellen. Puesto que hay lo con Sicherheit viele Möglichkeiten.
Schöne Grüße Michael Wodrich |
| | | Programmieren, das spannendste Detektivspiel der Welt. | 09.11.2005 ▲ |
| |
| | Normann Strübli | ¡Hola Franco,
Yo möchte eigentlich (inzwischen) así bezwecken Yo antes langer Tiempo veces con el X-menü bezweckt habe. Ein Listview-Control komplett el eigenen Bedürfnissen anzupassen. Ursprünglich Yo quería sí sólo una Balkenanzeige einbauen, como esto no es así sin weiters funktioniert ha, Yo Yo mich con el Ownerdraw-Listview beschäftigt, y así gings entonces más...
Un Unterstützung de z.B. Bargraphen de Deiner Dll wäre una Super Sache, Yo glaube así denken no sólo Michael y yo.
Mein Ansatz se una Nischenlösung ser para denjenigen el eben todavía algo que no sea de texto- oder icons en el Zeilen posición haben möchte, qué sí theroretisch así ya funktioniert. (z.B. Bitmaps, Graphen, mehzeilige Felder usw...)
Su Dll puede natürlich no sustituir y se el interessierten sólo veces aufzeigen el así una hübsch bunte Listview auch en reinem (X-)Profano a erschaffen es.
Mein Hauptproblem es nun el Geschwindigkeit en ganzen Geschichte, y como war mi Cuestión Yo media Code- besonders en Abarbeitung el Wm_notify-Nachricht optimieren y más rápido hacer kann. Und wer ha como mehr Idea de Tabellen como Usted, Franco
Como ya he dicho para Su Listview.dll wäre el Yo vorhabe a individuell, y como Yo todos ahora a Fuß erledige wäre Yo para cada Tip dankbar como yo todo optimieren kann...
mehr Yo quería doch nada |
| | | | |
| | Normann Strübli | @Franco:
Je länger Yo mich con el Listview-Geschichte beschäftige umso mehr Problemas ergeben se como Jetzt Yo el Sortierung el Zeilen con Ayuda des XPIA fertiggestellt y veces una Vergleich con Deiner Listview.dll gemacht. En ca. 20.000 Einträgen dauert lo en meiner Variante siempre todavía stolze 21 sekunden, en Listviev.dll sólo knapp 3 sekunden. (also ca. 10veces más rápido) Das se sí determinado por el lahmen Aufruf de Profano kommen.
Como en meiner Liste aber determinado 13.000 Einträge disponible ser voluntad, Yo me el todo Arbeit wohl umsonst gemacht -aber immerhin Yo viel dazugelernt.
Also habe Su Listview.dll rápidamente otra vez eingebunden, desafortunadamente ir nun el Zeilenfarben después de uno Sortierung flöten. Ist en efecto klar como Yo el lParam& member de LV_ITEM# dazu mißbraucht habe el Farbinformationen para el Entsprechende Línea a Guardar. Usted benutzt richtigerweise valor de lParam en después de el Sortierung el neuen Index el Zeilen a speichern.
Aber si yo no mehr weiß welche Línea después de el Sortierung welchen index ha, y Befehl RaiseLine en sólo 1024 Zeilen beschränk es muß Yo wohl anfangen a Zaubern en uno Línea una eindeutigen Farbwert zuzuordnen el unabhängig de el Sortierung es. Irgendwo hast Usted schonmal en una Cuestión geantwortet: [quote:06c4627aa6]Wenn du Zeilen einfügst y möchtest, el el farbige Markierung mitwandert, mußt Si es usted el selber programa.[/quote:06c4627aa6] Zum Glück es el Superdupieinfach
...nein, Yo ni idea! Irgendeinen Vorschlag??? *verzweifel*
Saludo Normann |
| | | | |
| | Normann Strübli | tener Todavía vergessen:
Franco, kannst Usted tal vez una Función einbauen a Zeilenhöhe einzustellen? Oder weiß jmd. como en el uno Listview funktioniert??? |
| | | | |
| | | | - Página 2 - |
| | Frank Abbing | Zumindest a deiner letzten Cuestión hay irgendeine Message. Sobald mein Computer otra vez se ejecuta, kümmere Yo mich por lo tanto. |
| | | | |
| | Frank Abbing | Hi,
tener el Zeilenhöhe instalado. Un Message gab lo hierzu no, tener una wenig con Imagelisten getricks. In el nächsten Versión.
Übrigens. Hier Fortschrittsbalken en el Listview: KompilierenMarcaSeparaciónRandomize
Declare listview&,lvdll&,text$,text2$,x&,y&,z&,font&
Def GetSysColor(1) !USER32,GetSysColor
$I Listview_Funktionen.inc
lvdll&=usedll(Listview.dll)
Windowstyle 543
Windowtitle Listview.dll / Prozentanzeige
Window 0,0-400,256
Cls GetSysColor(15)
font&=Create(Font,MS Sans Serif,13,0,0,0,0)
x&=MixRGBs(GetSysColor(15),$00ffffffff)
listview&=CreateListView(%hwnd,%hinstance,0,x&,-1,$31)
SetFont listview&,font&
InsertColumn listview&,Text,60,0
InsertColumn listview&,Prozent,240,0
Whileloop 12
text2$=
x&=Rnd(30)
Whileloop x&
text2$=text2$+Chr$(127)
Wend
text2$=text2$+ +Str$(Int(100/30*x&))+%
text$=Item +Str$(&loop)
SetItem listview&,text$,text2$
Wend
AutoSortListview listview&,1,1
ShowListView(listview&,8,8,370,200)
InitMessages(%hwnd)
SetTimer 1500
While 1
waitinput
Case %key=2:BREAK
y&=Rnd(4)
Whileloop 12
text2$=
x&=Rnd(30)
Whileloop x&
text2$=text2$+Chr$(127)
Wend
Case y&=0:text2$=text2$+ +Str$(Int(100/30*x&))+%
SetItemText(listview&,addr(text2$),1,(&loop-1))
Wend
Wend
KillTimer
DestroyWindow(listview&)
CloseMessages(%hwnd)
freedll lvdll&
DeleteObject font&
$I Listview_Dispose.inc ass=s4 href='./../../funktionsreferenzen/XProfan/end/'>End
|
| | | | |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |