# Was ist "hdc"?



## daDom (15. Januar 2004)

Also, ich habe folgendes Problem:

Ich brauche einen Code, mit dem ich Grafiken frei rotieren lassen kann...
Habe dieses hier gefunden: http://www.flomix.de/download/foxcbmp_src.zip

Den Code-Teil der Rotieren-Funktion habe ich heraus kopiert und so wie er ist - unverändert - klappt es auch alles...

In meinem Programm schiebe ich Grafiken(Inhalt einer Picbox) in einer weiteren Picbox herum.
In dem vorgegebenen Code sind ebenfalls 2 Picbox'en aber das jeweilige Bild dreht sich immer nur in der Mitte der größeren Picbox.

Ind dieser Funktion kommt des öfteren "picRotate*.hdc*" oder "picRotate*.Image.Handle*" vor. Was bedeutet das?
_FoxRotate picRotate*.hdc*, picRotate.ScaleWidth \ 2, picRotate.ScaleHeight \ 2, picRot*.hdc*, picRot.Image.Handle, &HFF00FF, HScroll3 / 10, chkRotMask + chkRotSmooth * 2_

Kann ich durch den Teil (oben) irgendwie die Position des sich drehenden Objektes verändern?


#############################################################

#############################################################



Hier der Code-Teil, der die Rotation berechnet:
*Code in der "VB-only.bas":*

_Public Function FoxRotate(ByVal *DstDC* As Long, ByVal *DstX* As Long, ByVal *DstY* As Long, ByVal *SrcDC* As Long, ByVal *SrcBmp* As Long, ByVal TransColor As Long, ByVal Angle As Double, Optional ByVal Flags As Long) As Long
    Dim TmpDC As Long, TmpBmp As Long, OldObject As Long
    Dim BitCount As Long, BitCount2 As Long, LineWidth As Long, LineWidth2 As Long
    Dim retVal As Long
    Dim Width As Long, Height As Long, NewSize As Long
    Dim H As Long, B As Long, F As Long, D As Long, I As Long
    Dim dx1 As Double, dy1 As Double
    Dim TransR As Byte, TransG As Byte, TransB As Byte
    Dim TempAlpha As Byte
    Dim Info As BITMAPINFO, Info2 As BITMAPINFO
    Dim SrcBits() As Byte, TmpBits() As Byte

    TransR = TransColor And &HFF
    TransG = (TransColor And &HFF00&) / 255
    TransB = (TransColor And &HFF0000) / 65536
    Info.bmiHeader.biSize = Len(Info.bmiHeader)
    Info2.bmiHeader.biSize = Len(Info2.bmiHeader)
    retVal = GetDIBits(SrcDC, SrcBmp, 0, 0, ByVal 0, Info, 0)
    If retVal = 0 Then Exit Function
    TmpDC = CreateCompatibleDC(SrcDC)
    Width = Info.bmiHeader.biWidth
    Height = Info.bmiHeader.biHeight
    NewSize = Math.Sqr(Width ^ 2 + Height ^ 2) + 2

    TmpBmp = CreateCompatibleBitmap(SrcDC, NewSize, NewSize)
    If TmpBmp Then
        OldObject = SelectObject(TmpDC, TmpBmp)
        BitBlt TmpDC, 0, 0, NewSize, NewSize, DstDC, DstX - NewSize / 2, DstY - NewSize / 2, vbSrcCopy

        Info.bmiHeader.biBitCount = 24
        Info.bmiHeader.biCompression = 0
        Info2.bmiHeader.biBitCount = 24
        Info2.bmiHeader.biCompression = 0
        Info2.bmiHeader.biPlanes = 1
        Info2.bmiHeader.biHeight = NewSize
        Info2.bmiHeader.biWidth = NewSize

        LineWidth = Width * 3
        If (LineWidth Mod 4) Then LineWidth = LineWidth + 4 - (LineWidth Mod 4)
        BitCount = LineWidth * Height

        LineWidth2 = NewSize * 3
        If (LineWidth2 Mod 4) Then LineWidth2 = LineWidth2 + 4 - (LineWidth2 Mod 4)
        BitCount2 = LineWidth2 * NewSize

        ReDim SrcBits(BitCount - 1)
        ReDim TmpBits(BitCount2 - 1)
        GetDIBits SrcDC, SrcBmp, 0, Height, SrcBits(0), Info, 0
        GetDIBits TmpDC, TmpBmp, 0, NewSize, TmpBits(0), Info2, 0




        Dim CurOffset As Long
        Dim NewX As Double, NewY As Double
        Dim Xmm As Long, Ymm As Long
        Dim I1 As Long
        Dim v1 As Boolean
        dx1 = Cos(Angle * PIDEG)
        dy1 = Sin(Angle * PIDEG)

        For H = 0 To NewSize - 1
            CurOffset = LineWidth2 * H
            For B = 0 To NewSize - 1
                F = CurOffset + 3 * B
                NewX = Width / 2 + (B - NewSize / 2) * dx1 - (H - NewSize / 2) * dy1
                NewY = Height / 2 + (B - NewSize / 2) * dy1 + (H - NewSize / 2) * dx1

                Xmm = Int(NewX + 0.5)
                Ymm = Int(NewY + 0.5)
                If (Xmm >= 0) And (Xmm < Width) And (Ymm >= 0) And (Ymm < Height) Then
                    v1 = True
                    I1 = LineWidth * Ymm + 3 * Xmm
                    If Flags And &H1 Then
                        v1 = Not (SrcBits(I1 + 2) = TransR And SrcBits(I1 + 1) = TransG And SrcBits(I1) = TransB)
                    End If
                    If v1 Then For D = 0 To 2: TmpBits(F + D) = SrcBits(I1 + D): Next D
                End If
            Next B
        Next H

        SetDIBitsToDevice DstDC, DstX - NewSize / 2, DstY - NewSize / 2, NewSize, NewSize, 0, 0, 0, NewSize, TmpBits(0), Info2, 0
        Erase SrcBits
        Erase TmpBits
        DeleteObject SelectObject(TmpDC, OldObject)
    End If
    DeleteDC TmpDC
End Function_


----------



## tYrEaL (16. Januar 2004)

*was ist hdc!hier die antwort *

hi!

das ist hdc :

von der Arbeitsumgebung Microsoft Windows bereitgestellteZugriffsnummer für denGerätekontext eines Objekts zurück.

Syntax

Objekt.hDC

Der Platzhalter Objekt stellt einenObjektausdruck dar, der ein Objekt in der Liste unter Betrifft ergibt.

Anmerkungen

Diese Eigenschaft ist eine Zugriffsnummer für einen Gerätekontext in der Arbeitsumgebung Windows. Die Arbeitsumgebung Windows verwaltet die Systemanzeige durch Zuweisen eines Gerätekontexts für das Printer-Objekt sowie für jedes Formular und jedes Bildfeld-Steuerelement (PictureBox) in Ihrer Anwendung. Sie können sich mit der hDC-Eigenschaft auf die Zugriffsnummer für den Gerätekontext eines Objekts beziehen. Damit erhalten Sie einen Wert, der in Aufrufen von Funktionen derWindows-API übergeben werden kann.

Bei einem Standarddialog-Steuerelement (CommonDialog) gibt diese Eigenschaft einen Gerätekontext für den im Dialogfeld Drucken ausgewählten Drucker zurück, wenn das cdlReturnDC-Attribut gesetzt ist, oder einen Informationskontext, wenn das cdlReturnIC-Attribut gesetzt ist.

Hinweis   Der Wert der hDC-Eigenschaft kann sich während der Programmausführung ändern. Speichern Sie den Wert daher nicht in einer Variablen, sondern verwenden Sie die hDC-Eigenschaft immer dann, wenn Sie den Wert benötigen.

Die AutoRedraw-Eigenschaft kann eine Änderung der hDC-Eigenschaft zur Folge haben. Wenn AutoRedraw den Wert True für ein Formular-Fenster oder ein Bildfeld-Steuerelement hat, enthält die hDC-Eigenschaft die Zugriffsnummer auf den Gerätekontext derbeständigen Grafik (äquivalent zur Image-Eigenschaft). Wenn AutoRedraw den Wert False hat, ist hDC der tatsächliche hDC-Wert des Formular-Fensters oder Bildfeld-Steuerelements. Die Einstellung der hDC-Eigenschaft kann sich während der Programmausführung unabhängig von der AutoRedraw-Einstellung ändern.

Wenn die HasDC-Eigenschaft den Wert False hat, wird eine neuer Gerätekontext durch das System erstellt, und der Wert der hDC-Eigentschaft ändert sich bei jedem Aufruf.


Ich hoffe das hat geholfen!

Mfg,

tYrEaL


----------

