PDA

Vollständige Version anzeigen : hWnd eines Berichtes???


sanus70
24.09.2003, 13:03
Hallo ihr Profis,

wenn man Win-API Funktionen zum zeichnen in einem Bericht verwenden möchte, braucht man logischerweise zuerst mal das Fenster-Handle des Berichts um sich einen DC usw. zu holen.
Das Problem, der code:
hWnd = Me.Report.hWnd
gibt das Fensterhandle des Rahmens zurück, nicht der eigentlichen Seite. Das kann man leicht mit einem Fenster-Spy-Tool herausfinden.
Wie bekommt man aber nun das "richtige" Handle zum zeichnen? Mit dem obigen ist es nicht möglich etwas "auf das Blatt" zu zeichnen, da die Ausgaben logischerweise in das falsche Fenster gehen.
Hat sich schon mal jemand dem Problem angenommen?

Version: Office XP

Sascha Trowitzsch
24.09.2003, 15:29
Bau das in ein Modul ein:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> EnumChildWindows <span class="TOKEN">Lib</span> &quot;user32&quot; (<span class="TOKEN">ByVal</span> hWndParent <span class="TOKEN">As</span> Long, _
<span class="TOKEN">ByVal</span> lpEnumFunc <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> lparam <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Private</span> <span class="TOKEN">Declare</span> <span class="TOKEN">Function</span> GetClassName <span class="TOKEN">Lib</span> &quot;user32&quot; <span class="TOKEN">Alias</span> &quot;GetClassNameA&quot; (<span class="TOKEN">ByVal</span> hwnd <span class="TOKEN">As</span> Long, _
<span class="TOKEN">ByVal</span> lpClassName <span class="TOKEN">As</span> String, <span class="TOKEN">ByVal</span> nMaxCount <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Private</span> pubhwnd <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
<span class="TOKEN">Function</span> GetHwndRptPrv(hwnd <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Call</span> EnumChildWindows(hwnd, <span class="TOKEN">AddressOf</span> EnumChilds, 0)
GetHwndRptPrv = pubhwnd
<span class="TOKEN">End</span> <span class="TOKEN">Function</span>
&nbsp;
<span class="TOKEN">Function</span> EnumChilds(<span class="TOKEN">ByVal</span> hwnd <span class="TOKEN">As</span> Long, <span class="TOKEN">ByVal</span> lparam <span class="TOKEN">As</span> <span class="TOKEN">Long</span>) <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> S <span class="TOKEN">As</span> String, i <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
S = <span class="TOKEN">String</span>(255, vbNullChar)
i = GetClassName(hwnd, S, 255)
<span class="TOKEN">If</span> i &gt; 0 <span class="TOKEN">Then</span> S = Left(S, i)
<span class="TOKEN">If</span> S = &quot;OPrtPrevPage&quot; <span class="TOKEN">Then</span>
EnumChilds = 0
pubhwnd = hwnd
<span class="TOKEN">Else</span>
EnumChilds = 1
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">End</span> <span class="TOKEN">Function</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Um das Handle des Preview zu erhalten ruftst du z.B. aus dem Bericht auf:

Msgbox GetHwndRptPrv(Me.Hwnd)

Ciao, Sascha

PS: An alle, die das auch haben wollen: Geht so nur mit A2000/XP!

Sascha Trowitzsch
25.09.2003, 11:00
Hat sich schon mal jemand dem Problem angenommen?
Hab ich mittlerweile, ja.

sanus70
25.09.2003, 11:22
Hallo Sascha,
danke für Deine schnelle Antwort und sorry für meine späte.
Ich habe Deien Code eingebaut (hatte schon befürchtet, daß es nur so geht) und ausprobiert.
Leider war das Ergebnis ernüchternd. Keine Ausgabe. Keine Ahnung warum das nicht funktioniert.
Hier mein Code:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> Detailbereich_Format(Cancel <span class="TOKEN">As</span> Integer, FormatCount <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
<span class="TOKEN">Call</span> DrawTest
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;
<span class="TOKEN">Private Sub</span> DrawTest()
<span class="TOKEN">Dim</span> hwnd <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> hdc <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
<span class="TOKEN">Dim</span> pt <span class="TOKEN">As</span> POINTAPI
<span class="TOKEN">Dim</span> hObjOld <span class="TOKEN">As</span> Long, hPen <span class="TOKEN">As</span> <span class="TOKEN">Long</span>
&nbsp;
hwnd = GetHwndRptPrv(Me.hwnd)
<span class="TOKEN">If</span> hwnd = 0 <span class="TOKEN">Then</span> <span class="TOKEN">Exit Sub</span>
&nbsp;
<span class="TOKEN">Debug.Print</span> &quot;hWnd=&quot; &amp; hnwd
hdc = GetWindowDC(hwnd)
&nbsp;
<span class="TOKEN">Call</span> SetBkMode(hdc, TRANSPARENT)
&nbsp;
hPen = CreatePen(PS_SOLID, 1, rgb(255, 0, 0))
hObjOld = SelectObject(hdc, hPen)
&nbsp;
<span class="TOKEN">Call</span> MoveToEx(hdc, 1000, 1000, pt)
<span class="TOKEN">Call</span> LineTo(hdc, 1000, 1000)
<span class="TOKEN">Call</span> LineTo(hdc, 0, 0)
&nbsp;
<span class="TOKEN">Dim</span> rct <span class="TOKEN">As</span> RECT
&nbsp;
rct.Left = -1000
rct.Top = -1000
rct.Bottom = 1000
rct.Right = 1000
&nbsp;
<span class="TOKEN">Call</span> FillRect(hdc, rct, rgb(255, 0, 0))
<span class="REM"> ' cleanup</span>
<span class="TOKEN">Call</span> SelectObject(hdc, hObjOld)
<span class="TOKEN">Call</span> DeleteObject(hPen)
<span class="TOKEN">Call</span> ReleaseDC(hwnd, hdc)
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span>
&nbsp;</pre></div>

Vielleicht habe ich ja auch da noch einen bösen Bug??
Gruß Christian

Sascha Trowitzsch
25.09.2003, 11:52
:nene:

So leicht lässt sich Access offenbar nicht überlisten. ;)

Wenn ich statt TRANSPARENT die Konstante OPAQUE in SetBkMode nehme, dann kann ich bei Weiterschalten der Datensätze jeweils die Line kurz aufblitzen sehen.
Das war dann schon.

Danach schlägt IMHO die Paint-Prozedur des Fensters zu, die das Preview neu zeichnet und dein ganzer Code war umsonst.

Damit die Zeichnungen beständig sind, müsstest du als das Preview-Fenster subclassen und bei WM_Paint deinen Code einbauen.

Das erscheint mir des Aufwands zuviel.

(Um Linien und Rechtecke zu zeichnen brauchst du doch sowieso keine API-Funktionen; da reichen doch die Methoden, die Report mitbringt...?)

Aber war mal was anderes!

Ciao, Sascha

PS: Stell mal bitte deinen Code-Converter MOFKonform ein. (Da gibt's so ein Häkchen.) Dann verschwinden auch die Leerzeilen im Code.

sanus70
25.09.2003, 12:17
>(Um Linien und Rechtecke zu zeichnen brauchst du doch sowieso keine
>API-Funktionen; da reichen doch die Methoden, die Report mitbringt...?)

Hintergrund der ganzen Aktion ist, daß ich auch Bitmaps usw zeichnen will.
Aber vielleicht hast Du ja noch eine andere Idee.
Ich will eine Wochenübersicht von zeitlich gebundenen Terminen haben, die dann mit einem Symbol (für den jeweiligen Datensatz) angezeigt werden. Als Beispiel hier mit X,Y,Z...

Zeit Mo | Di | Mi | Do | Fr | Sa | So |
---------------------------------------------------------------------------------------
6:00 Y X X,Z
---------------------------------------------------------------------------------------
7:00 X
---------------------------------------------------------------------------------------
8:00
---------------------------------------------------------------------------------------

...


Leider fällt mir keine Möglichkeit ein, wie man sowas ohne direkte Abfrage und Ausgabe beim Formatieren, bewerkstelligen könnte.

>PS: Stell mal bitte deinen Code-Converter MOFKonform ein. (Da
>gibt's so ein Häkchen.) Dann verschwinden auch die Leerzeilen im Code.
>[/QUOTE]
Danke für den Tip, hab ich gemacht :-)

Sascha Trowitzsch
25.09.2003, 12:35
Ich glaube, das einfachste ist, wenn du für die Symbole einen speziellen Font benutzt, der diese enthält.
Dann kannst du für die X,Y,Z einfach Textfelder oder Labels nehmen, denen dieser Font zugeteilt wird.

Wenn die allerdings farbig sein sollen, dann wird's schwierig.
Da fällt mir eigentlich nur ein, ein spezielles Grid in den Bericht einzufügen. Das MSHFLEXGrid kann z.B. Bitmaps in Zellen darstellen. Ich bin mir aber nicht sicher, ob das auch ausgedruckt werden kann.

Ciao, Sascha