CreateWindowEx() Common Controls

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

"native" Common Controls

ich verstehe worum es geht
1
6%
ich beginne zu verstehen worum es geht
3
19%
ich verstehe nicht worum es geht
3
19%
ich kann solche Controls gebrauchen
6
38%
ich kann nicht mit solchen Controls anfangen
3
19%
 
Insgesamt abgegebene Stimmen: 16

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

ich hatte von Pablo eine Antwort bekommen mit der ich nichts anzufangen wusste :
The funny thing of this is that to use a ListView control you don't need any ActiveX, it works perfect just with CreateWindowEx()
hm ... und dann habe ich angefangen zu googlen ...

mit Hilfe der ot4xb hab ich dann so was zusammen gebaut

Code: Alles auswählen

#define _OT4XB_MAP_WAPIST_FUNC_
#include "ot4xb.ch"
#include "CommCtrl_constants.ch"
#include "WinUser_constants.ch"

#include "Appevent.ch"
#include "DLL.CH"

DLLFUNCTION SendMessageA( nHwnd, nCmd, wParam, lParam) ;
   USING STDCALL FROM USER32.DLL

STATIC DLLFUNCTION CreateWindowExA( dwExStyle, lpClassName, lpWindowName,      ;
                                    dwStyle, x,y, nWidth, nHeight, hWndParent, ;
                                    hMenu, hInstance, lpParam )                ;
   USING STDCALL                                                               ;
   FROM USER32.DLL

STATIC DLLFUNCTION GetModuleHandleA( lpModuleName )                            ;
   USING STDCALL                                                               ;
   FROM KERNEL32.DLL

STATIC DLLFUNCTION GetWindowLongA( hWnd, nIndex )                              ;
   USING STDCALL                                                               ;
   FROM USER32.DLL

proc appsys()
RETURN

proc main()
LOCAL oListView
LOCAL nEvent, oXbp, mp1, mp2
LOCAL oDlg
LOCAL aSize := {500,500}
LOCAL aPos  := {0,0}
LOCAL nStyles
LOCAL nHWND
LOCAL aaSize
LOCAL oItem
LOCAL nWindowProc

   oDlg := XbpDialog():New(AppDesktop() ,,aPos,aSize,,.T.)
   oDlg:tasklist  := .T.
   oDlg:title     := "ListView Control"
   oDlg:icon      := 1

   oDlg:Create()
   CenterControl(oDlg)

   aaSize := oDlg:drawingArea:currentsize()

   nStyles := (WS_CHILD+WS_VISIBLE)
   nHWND := CreateWindowExA( 0,TRACKBAR_CLASS, 0,nStyles,;
                             0, 0, aaSize[1],aaSize[2],;
                             oDlg:drawingArea:GetHWND(), 0,  ;
                             GetModuleHandleA(0), 0 )

   IF nHWND != 0
      nWindowProc := GetWindowLongA( nHWND, GWL_WNDPROC )
      oDlg:drawingArea:SetHWND( nHWND, .T. )
   ENDIF
   SendMessageA(nHWND,TBM_SETRANGE,0,MakeLong(0,10)) //

*   SendMessageA(nHWND,TBM_SETPOS,5,0) //
*   SendMessageA(nHWND,TBM_SETPOS,0,5) //

   nEvent := xbe_None
   WHILE nEvent != xbeP_Close
      nEvent := AppEvent ( @mp1, @mp2, @oXbp )
      oXbp:HandleEvent ( nEvent, mp1, mp2 )
      IF nEvent == xbeP_Quit
         QUIT   // AppQuit()
      ENDIF
   ENDDO

RETURN
ok das "fehlt" noch eine ganze Menge aber man "sieht" doch schon was ...

das ganze ist nun ohne *.OCX und das "Prinzip" wird ja auch beim Progressbar des "Xbase++ SP2 Pack" benutzt.

nun ist ja bekannt das der SP2 Progressbar schneller ist als die MsComCtl.OCX Lösung.
bei einem "TRACKBAR" macht das wohl nicht aus aber das selbe "müsste" ja dann auch mit ListView gehen ... wie Pablo sagte.

wer es nicht erwarten kann ( wie ich ) der kann sich ja mal diese URL ansehen http://winapi.foosyerdoos.org.uk/info/common_cntrls.php
die Demo Sourcen sind für
//BCC55 - Link with comctl32.lib
//MINGW - Link with libcomctl32.a (-lcomctl32)
//MSVC - Link with comctl32.lib
gedacht

Nachtrag : Umfrage
Zuletzt geändert von AUGE_OHR am So, 24. Jul 2011 10:03, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

wer Interesse an einem "schnellen" ListView hat und wissen möchte wie man mit Hilfe von Pablo´s ot4xb.LIB
so etwas verwirklicht sollte sich im http://www.xbwin.com/forum.html Forum
den Thread "ot4xb.public, using STRUCTURE with ot4xb, 24. Mai 2011" ansehen.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

Pablo hat in seinem Forum "ot4xb.public" einen neuen Thread "playing with the listview control" aufgemacht.
the latest internal ot4xb build 001.005.017.009 as have added support for the listview required structures ( or at least most common )
Pablo hat also praktisch "alle" STRUCTURE die man für ein ListView benötigt in seine "lates" Version eingebaut.

ich habe nun angefangen die Xbase++ "Wrapper" zu schreiben wobei der "wichtigste" o:itemselect jetzt schon funktioniert.

Code: Alles auswählen

   oLview:itemSelected := {| uNIL1, uNIL2, oSelf | DoIt(oSelf:getItem(oSelf:getData()[1]) ) }

Procedure DoIt(cText)
   IF .NOT. EMPTY(cText)
      Msgbox(cText)
   ENDIF
RETURN
man braucht also sein Array-Browse ( FBrowse ) oder Listbox nicht zu ändern sondern nur die DXE_LVIEW.CH mit einbinden ( so ist es zumindest gedacht ... )

es wird noch eine Zeit lang dauern bis ich meine vorhandenen MsComCtl.OCX ListView Function umgeschrieben hab, aber ich denke es wird sich lohnen.

In der Listen Darstellung ( Report ) mit 5 Column, ähnlich FBrowse, ist das Ding richtig schnell.
Eine XbpListbox() dagegen ist um ein vielfaches langsamer ( noch keine Messung gemacht )

allerdings muss ich zugeben das ich dabei noch keine Icons verwenden ( Image_List ist schon eingebaut ...)

wer es selber ausprobieren möchte sollte ich die Attachment in dem Thread von Pablo ansehen.
Ich "denke" das da nun so ziemlich alle Methoden und "Macros" als "Prototype" vorhanden sind.

... so langsam komme ich dahinter was Pablo und damals in seinen Referat in nur 30 min erzählt hat. \:D/
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

in den letzten Version scheint das "DblClick" nicht mehr zu funktionieren.
dies kommt wohl durch das zusätzliche Methode listview_wndproc welche durch ot4xb_subclasswindow() erstellt wurde wo die "Tasten" ( WM_KEY* ) abgefangen werden.

Code: Alles auswählen

INLINE METHOD listview_wndproc(hWnd,nMsg,wp,lp,ctx)
   if (nMsg >= WM_KEYFIRST) .and.(nMsg <= WM_KEYLAST )
      if lAnd(::nForwardKeyFlags,1)
         DO CASE
            CASE nMsg == 256 .AND. wp == xbeK_ENTER
               IF !EMPTY(::itemSelected)
                  EVAL(::itemSelected,NIL,NIL,Self)
                  return 0
               ENDIF
         OTHERWISE
            @user32:PostMessageA( ::hXbp , nMsg,wp,lp )
            if lAnd(::nForwardKeyFlags,2)
               return 0
            end
         ENDCASE
      end
      return NIL
   end
return NIL
man muss nun das SetLvNotifyCB() in o:handleEvent auswerten wie folgt.

Code: Alles auswählen

INLINE METHOD HandleEvent(nEvent,mp1,mp2)
   // TODO: .... add some extra handling here
   DO CASE
     CASE nEvent == xbeM_LbDblClick
         IF !EMPTY(::itemSelected)
            EVAL(::itemSelected,NIL,NIL,Self)
         ENDIF
   ENDCASE
return NIL
wie ihr seht ist kein OTHERWISE vorhanden damit der Event NICHT "weitergeleitet" wird den sonst könnte es knallen.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

so ich denke man kann mit dem Demo jetzt schon etwas anfangen auch wenn es an der Geschwindigkeit noch eigens zu optimieren gilt.

wenn man im Explorer in der Ansicht ICON oder "Kacheln" einen Ordner öffnet werden nur die Icon angezeigt die auf die Seite "passen".
wenn man nun scrollt oder PgDn betätigt kann man sehen ( bei langsamen PC ) wie der Explorer die Icons "nach-lädt".

da ich z.Z. noch "alle" Icon lade geht es trotz "System" Imagelist leider nicht ganz so schnell ...
zwecks schnelleren Bildschirm Aufbau minimiere ich dabei das ListView und zeige "die Uhr" an ...

rechte Maustaste -> Popup Menue : sortieren / Ansicht

ein DblClick oder ENTER lösen wie beim Explorer die assoziierte Aktion aus.

"multi" Selection ist möglich, aber er gibt dann nur eine MsgBox() aus.

"inkrementelle" Suche : Der Explorer nimmt ja nur den ersten Buchstaben ...
ich will einen ganzen String suchen, also "testet" mal meine Version was ihr davon haltet.

viel Spass mit der ersten Demo.
pbwin001.zip
ListView ohne MsComCtl.OCX
EXE und DLL
(102.94 KiB) 367-mal heruntergeladen
für Mitglieder : LIB folgt ...
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

ist stellt euch vielleicht die Frage : warum soll ich nicht den "Wrapper" von Pablo nehmen ?

naja wenn man den "Rest" selbst "anpassen" möchte ...

ich verwende nun folgende Method(en)

Code: Alles auswählen

CLASS DXE_ListView FROM xbp_listview
INLINE METHOD Init( oParent,oOwner,aPos,aSize,aPresParam,lVisible,nView )
INLINE METHOD Create( oParent,oOwner,aPos,aSize,aPresParam,lVisible )
INLINE METHOD AddItem(cText | aArray ) // under Construction
INLINE METHOD ApplyExtendedListViewStyle()
INLINE METHOD ApplyListViewStyle(lOnOff)
INLINE METHOD Clear()
INLINE METHOD DelItem(nItem)
INLINE METHOD Getdata()
INLINE METHOD GetItem(nSel,nSub)
INLINE METHOD GetTopItem()
INLINE METHOD GetVisibleItems()
INLINE METHOD GoTo(nPosi,cAction)
INLINE METHOD GoTop()
INLINE METHOD HandleEvent(nEvent,mp1,mp2)
INLINE METHOD Hide()
INLINE METHOD IncrementSearch()
INLINE METHOD InsertColumn(nCol,cHead,nWide)
INLINE METHOD InsItem( nPos, cItem )
INLINE METHOD Listview_wndproc(hWnd,nMsg,wp,lp,ctx)
INLINE METHOD NewPaint()
INLINE METHOD NumItems()
INLINE METHOD OnColumnClick( nCol , oNmLv )   // Slot für Codeblock
INLINE METHOD OnItemActivate( nItem , oAct)   // Slot für Codeblock o:itemselect
INLINE METHOD OnItemChanged( nItem , oNmLv )  // Slot für Codeblock
INLINE METHOD OnItemRClick  (mp1, oAct)       // Slot für Codeblock   
INLINE METHOD PaintOn()
INLINE METHOD PaintOff()
INLINE METHOD PaintReset()
INLINE METHOD RefreshAll()
INLINE METHOD RefreshCurrent()
INLINE METHOD SetColumnWidth( nColumnWidth,nSub )
INLINE METHOD SetItem( nPos, cItem , nSub )
INLINE METHOD SetItemState(nSel,nState,nMask)
INLINE METHOD SetPointer(cDllName,nResID,nType)
INLINE METHOD SetTopItem(nItem)
INLINE METHOD SetView(nView)
INLINE METHOD Show()
INLINE METHOD UnMarkAll()
wenn man die mit XbpListBox vergleicht wird man einige wiederfinden und das ist "gewollt".

Code: Alles auswählen

#xtranslate XbpLisBox => DXE_ListView
wäre das einzige was man in seinen Code einfügen "müsste" um mit ein ListView statt ListBox zu bekommen.

einige Method(en) wie Go*** und Refresh*** gibt es ja nicht bei XbpListBox, aber von XbpBrowse() kennt man die.
Pablo hat geschrieben:This can be done using the LVN_GETDISPINFO and LVN_ODCACHEHINT notifications.
Using only the first allow to store only array indexes and provide the text/icon index of the items/columns when required.
Combining both notifications and using the LVS_OWNERDATA style can handle virtual lists to attach to a database or Xbase++ array

...
Using virtual listview ( by handling LVN_GETDISPINFO and LVN_ODCACHEHINT ) will increase a lot the performance when big datasets are used
und dafür möchte ich gerüstet sein ;)

dies ist aber erst der Anfang, den bislang habe ich nur die Metod(en) gebaut die ich für den Ersatz von XbpListBox benötige was ca. 10% von Pablos LIB sind.

ich muss also noch ein paar "normale" Demos bauen um es mit anderen Array zu testen.
btw. ich habe es z.Z. auf 10 Columne "beschränkt" ... mehr #define gibt es in Directory.CH nicht ...
gruss by OHR
Jimmy
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2935
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: CreateWindowEx() Common Controls

Beitrag von Wolfgang Ciriack »

Hallo Jimmy,
damit man sich dein Beispiel mal ansehen kann, solltest du die ot4xb.dll mit in die Zip-Datei packen.
Wo bekomme ich denn die neueste ot4xb her ? Mit meiner und der letzten veröffentlichten 1.5.16.210 gibst eine Fehlermeldung !
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

Wolfgang Ciriack hat geschrieben:damit man sich dein Beispiel mal ansehen kann, solltest du die ot4xb.dll mit in die Zip-Datei packen.
Wo bekomme ich denn die neueste ot4xb her ? Mit meiner und der letzten veröffentlichten 1.5.16.210 gibst eine Fehlermeldung !
uuups ... sorry, hier kommt sie
Part_ot4xb_001_005_017_009.zip
nur die Runtime DLL
Version 001_005_017_009
(197.57 KiB) 346-mal heruntergeladen
ich habe die aus dem ListView Thread mit Pablo auf http://www.xbwin.com/forum.html

ot4xb.public
playing with the listview control
30. Mai 2011

gleich im ersten Eintrag
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: CreateWindowEx() Common Controls

Beitrag von Koverhage »

Man sollte doch den Link auf www.xbwin.com unter Links und Demos eintragen.
Dann kann jeder von dort aus sich die aktuelle Version laden.
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

ich habe nun eine Method(e) gefunden wie man, ähnlich einer Listbox, ein ListView per Thread "füllen" kann.

Code: Alles auswählen

   nMaxItem := LEN(::aData)
   // iVar intern
   ::oLView:nRowMax := nMaxItem
   //
   // allocate the memory that it needs all at once,
   // instead of having to reallocate more memory incrementally
   // as the internal data structures grow
   //
   ::oLView:lv_SetItemCount(nMaxItem)

   nPageCount := ::oLView:lv_GetCountPerPage()
   FOR nRow := 0 to MIN(nPageCount-1,::oLView:nRowMax-1)
       //   ... hier wird die 1st Seite "gefüllt"
   NEXT
...
   // wenn mehr als 1 Seite
   IF nMaxItem > nPageCount
       oThread:start(  {|| ::MoreRows(nPageCount,nMaxItem) })
   ENDIF


INLINE METHOD MoreRows(nPageCount,nMaxItem)

// WM_SETREDRAW aussschalten 
   ::oLView:BeginUpdate()

   ::OtherRows(nPageCount,nMaxItem)

// WM_SETREDRAW wieder einschalten
   ::oLView:EndUpdate()

return NIL
im Gegensatz zu

Code: Alles auswählen

INLINE METHOD Hide()
   @user32:ShowWindow(::hLv,SW_HIDE)
ist das ListView bei WM_SETREDRAW "sichtbar" aber es kommt nicht mehr zum "Flicker" Effekt wenn ein neues Item hinzugefügt wird.

nun ist die Lösung aber noch nicht "optimal" den solange die "Sanduhr" läuft kann man zwar scrollen oder eine "Aktion" ausführen
aber man darf nicht das Verzeichniss wechseln. Ich muss also den Thread noch so "modifizieren" das ich den bei einem Verzeichniss Wechsel
"abbreche" um den neuen Vorgang zu starten.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

anbei ListView x 2 ;)
pbwin002.zip
(375.56 KiB) 350-mal heruntergeladen
die ListViews werden, in der Report - Ansicht, dynamisch per weiteren Thread gefüllt.
F1 - F10 Tasten und SH-Funktion (Copy,Move,Delete) sind noch NICHT in Betrieb,
aber das Resize, Splitbar, Focus und "refresh" gehen schon.

gut das ich die DXE_ListView LIB noch nicht veröffentlicht haben, den bei dem
Demo "merkte" ich das ich einige Method(en) von "meiner" Class in den "Wrapper"
verschieben musste.

Ich werde die im Mitglieder Bereich veröffentlichen sobald ich noch paar Demos
damit evaluiert habe ... ob vielleicht noch was "fehlt".
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: CreateWindowEx() Common Controls

Beitrag von georg »

Hallo, Jimmy -


also, dann schreibe ich auch mal hier ...

Wie kann ich den Bogen von ListView zu StatusBar (und eventuell auch DatePicker) schlagen, wenn ich froh war, die ActiveX Geschichte einigermassen verstanden zu haben?


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

georg hat geschrieben:Wie kann ich den Bogen von ListView zu StatusBar (und eventuell auch DatePicker) schlagen, wenn ich froh war, die ActiveX Geschichte einigermassen verstanden zu haben?
jedes XbPart, ausser XbpBrowse, ist im Grunde ein "Fenster".
das war wir als "Presentation Space" bezeichnen ist eigentlich ein "Device Content".

*.OCX waren ja als "Wrapper" für VB gedacht. Dafür wurde das IDispatch Interface implementiert.
Wenn wir aus Xbase++ ListView oder Statusbar ansprechen wollen brauchen wir wiederum einen "Wrapper"
um bei der XBase++ Syntax zu bleiben (Getdata() /SetData() etc...),
denn wir wollen ja nicht mit STRUCTURE, PEEK und POKE oder WM_* Events zu tun haben.

Das "Fenster" zum COM Server kann man nun mit Method "CreateWindowExA()", welche in der USER32.DLL steckt, anfordern.
Der "Device Content" kann dann einer der "Konstanten" (COMMCTRL.H) sein, siehe http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Die ersten Punkte ohne "Prefix" haben wir als XbParts.
Die mit "Prefix" msctls_* entsprechen MsComCtl.OCX
Die mit "Prefix" Sys* habe nun alle ihre eigenen *.OCX "Wrapper"

Wenn man nun "alle" Functionen haben möchte müsste man "alle" *.OCX einbinden und jeweils einen "Wrapper" dazu schreiben.

Wenn man sich schon die Arbeit macht, warum also nicht "direkt" das Control ansprechen statt per *.OCX und dafür einen "Wrapper" schreiben.

Das ListView, was wir nicht als XbPart haben, hatte ich schon per *.OCX implementiert aber das war einfach zu langsam.

Deshalb fand ich den Satz von Pablo ( 1st Msg in diesem Thread ) "interessant" und fragte ihn nach ListView mittels "CreateWindowExA()".

nun "könnte" man das ganze auch mit der Statusbar machen und einen eigenen "Wrapper" schreiben ... willst du das ? oder doch lieber eine DLL/LIB ;)

Die Method(en) findet man hier. http://msdn.microsoft.com/en-us/library ... 85%29.aspx

wie würde nun der "Wrapper" für eine Statusbar aussehen ?

Code: Alles auswählen

CLASS DemoMainDlg FROM XbpDialog
...
INLINE METHOD Create( oParent,oOwner,aPos,aSize,aPresParam,lVisible )

   ::XbpDialog:Create( oParent,oOwner,aPos,aSize,aPresParam,lVisible )
   da := ::DrawingArea
   ::hDa := da:GetHWnd()
   ::hDlg := ::GetHWnd()
...
   ot4xb_subclasswindow(::hDlg , Self , NIL , "dlg_wndproc" )
   @user32:SendMessageA(::hDlg , WM_APP + 1 , 0,0)


INLINE METHOD Dlg_wndproc( hWnd , nMsg , wp, lp )
   if nMsg == (WM_APP + 1)
      ::CreateTheStatusBar()

   elseif nMsg == (WM_APP + 2)
      @user32:SetFocus( wp )
...


INLINE METHOD CreateTheStatusBar()
   ::hStatusBar := @user32:CreateWindowExA(0,"msctls_statusbar32",0,;
                   nOr(WS_CHILD, WS_VISIBLE),0,0,0,0,;
                   ::hDa,-1,AppInstance(),0)
   @user32:SendMessageA(::hStatusBar,SB_SETMINHEIGHT,20,0)
   @user32:SendMessageA(::hStatusBar,SB_SETPARTS,2,{180,-1})
   return NIL


INLINE METHOD OnLvItemSelChange(nItem,oObj)
...
// senden einer Nachricht an den Statusbar. 0 based
   @user32:SendMessageA(::hStatusBar,SB_SETTEXT,0,oObj:lv_GetItemText(nItem,0) )
   @user32:SendMessageA(::hStatusBar,SB_SETTEXT,1,oObj:cSeek )
p.s. wer ein kompletten Source mit CreateWindowExA() sehen will sollte sich mal den Progressbar Class aus dem Xbase++ "Service Pack 2" ansehen.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

wir hatten ja das Thema DatePicker http://www.xbaseforum.de/viewtopic.php? ... &start=112

ich habe mir nun doch mal die "Notification Messages" angesehen http://msdn.microsoft.com/en-us/library ... 85%29.aspx

Code: Alles auswählen

::SetLvNotifyCB( DTN_DATETIMECHANGE , {|o,notify,lp|::OnDummy(o,lp,1 ) } )
::SetLvNotifyCB( DTN_CLOSEUP        , {|o,notify,lp|::OnDummy(o,lp,2 ) } )
::SetLvNotifyCB( DTN_DROPDOWN       , {|o,notify,lp|::OnDummy(o,lp,3 ) } )
::SetLvNotifyCB( DTN_FORMAT         , {|o,notify,lp|::OnDummy(o,lp,4 ) } )
::SetLvNotifyCB( DTN_FORMATQUERY    , {|o,notify,lp|::OnDummy(o,lp,5 ) } )
::SetLvNotifyCB( DTN_USERSTRING     , {|o,notify,lp|::OnDummy(o,lp,6 ) } )
::SetLvNotifyCB( DTN_WMKEYDOWN      , {|o,notify,lp|::OnDummy(o,lp,7 ) } )
damit bekomme ich dann
MyDatePick 20440364 DTN_DROPDOWN
MyDatePick 20438828 DTN_DATETIMECHANGE
MyDatePick 20438856 DTN_DATETIMECHANGE
MyDatePick 20440364 DTN_CLOSEUP
also brauch man dies

Code: Alles auswählen

::SetLvNotifyCB( DTN_DATETIMECHANGE , {|o,notify,lp| ::OnDatePickClick(o,lp) } )

INLINE METHOD OnDatePickClick(oLv,lp)
local st := ::NMDATETIMEFORMAT():New()
   st:_link_(lp,.F.)
   MsgBox( Var2Char(st:st) )              // hm ... WAPIST_SYSTIME
//
// this give me result
//
   MsgBox( Var2Char(st:st:wYear         )+;
           Var2Char(st:st:wMonth        )+;
           Var2Char(st:st:wDay          )+;
           Var2Char(st:st:wDayOfWeek    )+;
           Var2Char(st:st:wHour         )+;
           Var2Char(st:st:wMinute       )+;
           Var2Char(st:st:wSecond       )+;
           Var2Char(st:st:wMilliseconds ) )

RETURN NIL
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

hier mal 2 Demo´s mit dem "native" (benötigt KEIN *.OCX) Date / Time Picker
datepick.zip
Date / Time Picker "native" mit ot4xb.lib
(262.54 KiB) 351-mal heruntergeladen
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

ich habe ja im Demo 2 Versionen gemacht.

nun würde ich gerne wissen welche der beiden Version ich nun "releasen" soll ?
sollte man es als "eigenes" Control oder als "pop-up" Control auslegen ?

wenn ich per Pushbutton, wie in Demo2, den Datepicker als "pop-up" benutze will ich das Resultat in mein SLE übernehmen

wenn ich ein "eigenes" Controls daraus machen soll so muss ich es auch "editieren" können (F2).
mit F4 kann man übrigens die DropDown-Box, statt Maus click, öffnen

man kann im Datepicker aber nur mit Maus und Cursor "navigieren" aber kein Datum "eingeben"... nur "auswählen"

die Frage lautet also : reicht das "pop-up" oder braucht man "mehr" ?

Kommentare erwünscht
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2825
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 96 Mal
Danksagung erhalten: 13 Mal

Re: CreateWindowEx() Common Controls

Beitrag von georg »

Hallo, Jimmy -


mir "gefällt" die Variante in DPick2 "besser".


Gruss,

Georg
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

georg hat geschrieben:mir "gefällt" die Variante in DPick2 "besser".
klar ... ;) das ist ja auch die "kompliziertere" Version die auf o:setInputFocus() reagiert.

und genau bei der Version frage ich mich ob es "ausreicht" das man "nur auswählen" kann ?!
ich kann ja im DatePicker kein Datum "eingeben" ... nur Cursor,Tab,"+","-", ESC oder ENTER

p.s. habe ein Umfrage für diesen Thread gestartet. bitte um rege Beteiligung.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

so ich habe nun die LIB / DLL für den Date / Time Picker und den Demo Source in den Mitglieder Bereich gestellt.
ich habe nun "beide" Version angefertigt sodass ihr selbst entscheiden müsst welche Version ihr verwenden wollt.

Kommentare erbeten
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

nachdem wir ein weiteres "Control" für Xbase++ haben frage ich was man sonst noch gebrauchen könnte.

Code: Alles auswählen

ANIMATE_CLASS 	
Creates animation controls. These controls silently display an audio video interleaved (AVI) clip.

DATETIMEPICK_CLASS 	
Creates date and time picker controls. These controls provide a simple and intuitive interface to exchange date and time information with a user.

HOTKEY_CLASS 	
Creates hot key controls. These controls make it easy for the user to define hot keys.

MONTHCAL_CLASS 	
Creates month calendar controls. These controls provide a simple and intuitive way for a user to select a date from a familiar interface.

PROGRESS_CLASS 	
Creates progress bars. These controls indicate the progress of a lengthy operation.

REBARCLASSNAME 	
Creates rebar controls. These controls act as a container for child windows.

STATUSCLASSNAME 	
Creates status windows. These controls display status information in a horizontal window.

TOOLBARCLASSNAME 	
Creates toolbars. These controls contain buttons that carry out menu commands.

TOOLTIPS_CLASS 	
Creates tooltip controls. These controls display a small pop-up window containing a line of text that describes the purpose of a tool in an application.

TRACKBAR_CLASS 	
Creates trackbars. These controls let the user select from a range of values by moving a slider.

UPDOWN_CLASS 	
Creates up-down controls. These controls combine a pair of arrows with an edit control. Clicking the arrows increments or decrements the value in the edit control.

WC_COMBOBOXEX 	
Creates ComboBoxEx controls. These controls provide an extension of the combo box control that provides native support for item images.

WC_HEADER 	
Creates header controls. These controls display headings at the top of columns of information and let the user sort the information by clicking the headings.

WC_IPADDRESS 	
Creates IP address controls. These controls are similar to an edit control, but they allow you to enter a numeric address in Internet protocol (IP) format.

WC_LISTVIEW 	
Creates list view controls. These controls display a collection of items, each consisting of an icon and a label, and provide several ways to arrange the items.

WC_PAGESCROLLER 	
Creates pager controls. These controls are used to contain and scroll another window.

WC_TABCONTROL 	
Creates tab controls. These controls define multiple pages for the same area of a window or dialog box. Each page consists of a set of information or a group of controls that an application displays when the user selects the corresponding tab.

WC_TREEVIEW 	
Creates tree view controls. These controls display a hierarchical list of items. Each item consists of a label and an optional bitmap.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

hier mal ein Beispiel für eine Coolbar ( ReBar )
Bild
den Artikel dazu findet man unter http://msdn.microsoft.com/en-us/library/ms997549.aspx
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

das TreeView ist ja auch ein "Common Control". Hier mal mit ListView kombiniert
Bild
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

hi,

das einfachst Windows Control das wir kennen ist vermutlich der "Button" ... kennen wir den wirklich ?
http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Bild
das sind alles WC_BUTTON die man mit CreateWindowExA() erstellen kann ... Interesse ?

p.s. einige Version sind nur ab Vista/Win7 möglich
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Re: CreateWindowEx() Common Controls

Beitrag von Dieter »

Hallo Jimmy,
das TreeView kombiniert mit dem ListView interessiert mich sehr. Diese Form der Darstellung kann so manches xbpBrowse sinnvoll ersetzen. Übrigens würde ich dein Problem http://www.xbaseforum.de/viewtopic.php? ... 464#p59787 mit der Tree-ListView-Kombination angehen. Die Gruppenüberschrift wäre dann ein Treeview-Item und die dazugehörigen Personen untergelagerte Treeview-Items.
Ich nehme an, dass du schon eine eigene Tree-ListView-Klasse hast. Es wäre schön, wenn du hierzu etwas veröffentlichen könntest.
Bisher haben mich alle AktiveX-Komponenten eher abgeschreckt. Die Common Controls mit Zugriff über die ot4xB-Lib von Pablo sind aber ein echter Meilenstein für alle xbase-Programmierer.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: CreateWindowEx() Common Controls

Beitrag von AUGE_OHR »

Dieter hat geschrieben:Es wäre schön, wenn du hierzu etwas veröffentlichen könntest.
man könnte es als Vortrag zu einer Devcon nehmen ...
gruss by OHR
Jimmy
Antworten