Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » MFC Programm, ScrollBar hat nur Range von 16 Bit?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.12.2014, 12:20 Uhr
~elmut19
Gast


Hallo liebes Forum,

Ich habe ein grosses Problem (nach langer Zeit) mit einem Programm,
das ich erweitern muss.
Ich arbeite mit Visual Studio 2005. Das Programm wurde ursprünglich auf 6.0 entwickelt.

Mein Vorgänger hat das Hauptfenster mit Daten beschrieben, die in so was wie
einem GridView dargestellt werden. Er verwendet allerdings kein solches, sondern
baut das irgendwie selbst als Tabelle auf. Das steht dann einfach so in diesem SDI-Fenster.
Es ist Zeilen orientiert aufgebaut, und man kann Zeilen markieren und darauf auch
weitere Funktionen aufrufen, also ganz normal, ohne Edit-Funktion im Grid.

Am rechten Rand ist eine ScrollBar installiert, die bisher auch immer funktioniert hat.
Beim Scrollen werden die Zeilen gezählt.

Nun hat sich bei mir die Datenmenge erhöht.
Das heisst, ich bekomme teils über 100000 Zeilen.
Dies verkraftet die ScrollBar nicht mehr und fängt nach 65xxx Zeilen wieder
von vorne an zu zählen.

Alles was ich rausbekommen konnte, ist dass meine Scroll Position aus
der wincore.cpp kommt. Hier mal der Code-Ausschnitt dieser wincore.cpp: (ab ZEile 2106)


case AfxSig_SCROLL:
case AfxSig_SCROLL_REFLECT:
{
// special case for WM_VSCROLL and WM_HSCROLL
ASSERT(message == WM_VSCROLL || message == WM_HSCROLL ||
message == WM_VSCROLL+WM_REFLECT_BASE || message == WM_HSCROLL+WM_REFLECT_BASE);
int nScrollCode = (short)LOWORD(wParam);
int nPos = (short)HIWORD(wParam);
if (lpEntry->nSig == AfxSig_SCROLL)
---> (this->*mmf.pfn_v_u_u_W)(nScrollCode, nPos,
CWnd::FromHandle(reinterpret_cast<HWND>(lParam)));
else
(this->*mmf.pfn_v_u_u)(nScrollCode, nPos);
}
break;


Die Zeile, die ich mit "--->" markiert habe, wird aufgerufen.
also für die Berechnung der "nPos" wird nur das HIWORD verwendet.

Was kann ich machen, um meinen Zeilenumfang zu erhöhen?
Kann mir bitte jemand helfen!

Ich weiss, meine Infos sind recht spärlich, aber mehr relevanten Code bekomme ich
aus dem Call Stack nicht raus.

Grüsse
Helmut
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.12.2014, 13:17 Uhr
Tommix



Hallo,
an den Limits der ScrollBar wirst Du nichts ändern können. Kannst Du das Ganze nicht so ändern, daß die ScrollBar-Position Zeilennummer/n entspricht und n so gewählt ist, daß Du im erlaubten Bereich bleibst?

Gruß,
Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.12.2014, 14:01 Uhr
~elmut19
Gast


Hallo Tommix,
Danke.
Momentan weiss ich noch nicht genau, was Du damit meinst.

Überlegt habe ich mir, ob ich da was pagen könnte und mir einen Merker
für die Zeilenpos setzen könnte.
Am Besten wäre es, ich könnte die ScrollBar anders verwenden.

Ich habe im ganzen Quellcode z.B. kein entsprechendes GetScrollPo()s gefunden.
Ich lande direkt aus dem Event der ScrollBar in der selbst definierten
Methode "OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)".

Seltsamerweise ist das übergebene ScrollBar Objekt "pScrollBar" auch NULL,
so dass ich damit gar nichts anfangen kann.

Auch hab ich noch gar nicht verstanden, wie das in meinem Programm funktioniert
und wie es aufgebaut ist.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.12.2014, 14:15 Uhr
~elmut19
Gast


... Das heisst, es gibt zu dieser Funktion keine "afx_msg" Definition.
Das Programm hat so was an anderer Stelle. Diese wird aber an meiner
besagten Stelle nicht verwendet.
Also wie kommt das Programm überhaupt da hin?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.12.2014, 14:36 Uhr
~elmut19
Gast


... Das Programm müsste dieses OnVScroll als afx_msg definiert haben und es müsste eine entsprechende Handler-Zuweisung dafür geschrieben worden sein.
Das alles trifft aber irgendwie nicht zu, nicht an dieser Stelle??
ICh hab keine Ahnung, was mein Vorgänger da gebastelt hat....

und mit dem Forum komme ich auch nicht zurecht. kann mich nicht anmelden mit
meinem einst erstellten Zugang und nicht editieren. bin ich im falschen Forum?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
19.12.2014, 15:54 Uhr
Tommix



Hallo,
afx_msg ist weitgehend sinnfrei:

Zitat von afxwin.h:

C++:
// Type modifier for message handlers
#ifndef afx_msg
#define afx_msg         // intentional placeholder
#endif



Bist Du sicher, daß in der MessageMap nichts steht? Das ist bei den MFC-Makros immer etwas kryptisch.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.12.2014, 17:01 Uhr
~elmut19
Gast


Hallo Tommix
Ich habe das Projekt nach dem Funktionsnamen durchsucht.
Da hätte ich es eigentlich finden müssen.
Aber ich finde nur die leere Definition: ON_WM_VSCROLL()
in der MessageMap, so wie in der wincore.cpp auch.
Vielleicht ist das dann ein Default-Name für die Methode?
Und man braucht ihn nicht anzugeben.

Ich habe auch irgend wann schon einmal einen long Wert über so eine Message
verschickt. Das muss eigentlich gehen.
Auch ist die ScrollBar mit den long Werten, wie den 160000 Zeilen als Endwert
initialisiert und sie verhält sich rein visuell auch nach dieser Innitialisierung.
Man kann den Slider also gemäss der Initialisierung verschieben.
nur wenn man zum Ende des ersten Drittels kommt, fängt der Zeilenzähler wieder
von vorne an. Lässt man ihn los, springt er an die Zeile, die er übergeben bekommen hat.

Ausserdem steht in dem Microsoft Code von oben noch der Kommentar:

"// special case for WM_VSCROLL and WM_HSCROLL"

Dann müsste es doch auch noch einen "nicht special case" geben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.12.2014, 11:17 Uhr
~elmut19
Gast


... Oder kann mir jemand bitte erklären, wie man auf dieses ScrollBar-Objekt zugreift.

Alles was isch in meiner Anwendung finde, ist die Initialisierung des Scrollbereichs
aber nicht über die ScrollBar, sondern über das View-Objekt, welches meine Liste
darstellt. Und zwar so:

theApp.m_pFrame->m_wndView.ShowScrollBar(SB_VERT,(nCmd== SW_SHOW));

theApp.m_pFrame->m_wndView.GetScrollBarInfo((bWelche==SCROLL_H) ? OBJID_HSCROLL:OBJID_VSCROLL,&sbi);

theApp.m_pFrame->m_wndView.SetScrollRange(nBar,nMinPos,nMaxPos,bRedraw);

theApp.m_pFrame->m_wndView.SetScrollPos(nBar,nPos);

Die Werte für SetScrollPos(nBar,nPos) kommen direkt aus Event-Methode
OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar).
Diese "OnVScroll" ist einfach eine Methode der View-Klasse, wie die anderen
oben genannten auch. Und sie wird direkt aus der "OnWndMsg" der MFC aufgerufen,
also wie zu Anfang beschrieben aus der wincore.cpp.

Das Blöde an der Sache ist, dass in der Signatur von "OnVScroll" dass gewünschte
ScrollBar-Objekt übergeben, bzw zurückgegeben werden müsste.
Aber es ist einfach NULL. Wenn ich wenigstens da rankommen könnte!
Kann mir keiner sagen, wie das im Standardfall geht?

Grüsse
Helmut
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.12.2014, 17:23 Uhr
~elmut19
Gast


Hallo liebe Forumsmitglieder,

inzwischen habe ich glücklicherweise die Lösung gefunden.

An der Message kann man nichts ändern.
Aber man kann auf das Window Objekt zugreifen und über dieses die "ScrollBarInfo" auslesen.

Genaues dazu habe ich in der Microsoft Knolledge Base gefunden, unter
dem Artikel: MSDN article ID 152252

Auch habe ich ein Beispiel-Projekt bei "codeproject.com" gefunden:
"Add Scrolling to a CWnd or CDialog using a C++ Helper Class"

Trotzdem allen vielen Dank fürs lesen und Antworten.
Und schöne besinnliche Feiertage
Helmut
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: