Finns det något sätt att göra rund volymknappar i VB som fungerar som t ex slider? Nja... det går väl med api men det är svårt... lättare om du sätter en bild istället, så skulle jag i alla fall ha gjort =) // R-mus Skulle du vilja utvekla dig litegranna/exempelkod? jag har gjort en klass som tar och kollar hur du rör musen i en picturebox. snyggt verifier! =) Tack, jag vet att jag är ute på djupt vatten, men det ser ju ganska så kul ut. Här får jag problem: Du måste skapa en tom klass som heter CSlider. När jag namngav klassen till CVolumeSlider så fick jag bort det första problemet. hade råkad få med några saker som inte var klara. Det här är tydligen krabbigare än vad jag trodde ifrån första början. som jag sa tidigare så fixade jag bara biten som ökar på volymen när man drar runt i pictureboxen, inte koden som snurrar bilden. OM du tittar i artikel verifier:Runda volymknappar?
Sv: Runda volymknappar?
Sv: Runda volymknappar?
Jag skall använda detta för att spara ner mina data ifrån min studioinstälning, och vill alltså göra enn applikation som så långt som möjligt liknar en mixer.
Tacksam för all hjälpSv: Runda volymknappar?
rör du den i en cirkel medurs så ökar den på ett procentvärde, om du drar moturs så minskar värdet.
vad som är kvar att fixa är att en bild i pictureboxen ska roteras när värdet ökas/minskas. men eftersom jag e kass på gfx programmering så överlåter jag det till någon annan.
Formulär:
Du ska ha en picturebox som heter Picture2 och en textbox som heter text1. Sedan är det bara att prova
Dim WithEvents slider As CVolumeSlider
Private Sub Form_Load()
'initiera klassen
Set slider = New CVolumeSlider
'tilldela den en picturebox
Set slider.MyPicturebox = Picture2
'Ställ in att man måste skruva lite för att värdet ska öka
slider.SliderScale = one
End Sub
Private Sub slider_Volume(NewVolume As Integer)
Text1.Text = NewVolume
End Sub
Klassen
=====
Option Explicit
Dim WithEvents m_Picture As PictureBox
Public Event Volume(NewVolume As Integer)
Public Event Click()
Public Event DblClick()
Private Declare Function SetCapture Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCapture Lib "user32" () As Long
Private Type Limits
lX As Integer
rX As Integer
mX As Integer
tY As Integer
bY As Integer
mY As Integer
End Type
Dim m_PicLimits As Limits
Dim m_Volume As Integer
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim m_LastCord As POINTAPI
Dim m_bMouseLeave As Boolean
Dim m_Scale As ScaleEnum
Public Enum ScaleEnum
one = 1
Two = 10
Three = 100
End Enum
Dim imgRotate As CImageRotate
Public Property Let SliderScale(aScale As ScaleEnum)
m_Scale = aScale
End Property
Public Property Get SliderScale() As ScaleEnum
SliderScale = m_Scale
End Property
Public Property Let Volume(data As Integer)
If data <= 100 And data >= 0 Then
m_Volume = data * m_Scale
'Maybe scroll the wheel?
End If
End Property
Public Property Set MyPicturebox(pic As PictureBox)
m_PicLimits.lX = 0 'left x
m_PicLimits.rX = pic.Width 'right x
m_PicLimits.bY = pic.Height 'bottom y
m_PicLimits.tY = 0 'top y
m_PicLimits.mX = pic.Width \ 2 'middle x
m_PicLimits.mY = pic.Height \ 2 'middle y
Set m_Picture = pic
Set imgRotate = New CImageRotate
imgRotate.LoadImg pic
End Property
Private Sub Class_Initialize()
m_Scale = Two
End Sub
Private Sub m_Picture_Click()
RaiseEvent Click
End Sub
Private Sub m_Picture_DblClick()
RaiseEvent DblClick
End Sub
Private Sub m_Picture_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 0 Then
m_bMouseLeave = True
Exit Sub
End If
'Denna del är till för att kolla om vi lämnar bilden, för isåfall ska vi återställa kordinaterna
If Not m_bMouseLeave Then
If X < 0 Or Y < 0 Or X > m_Picture.Width Or Y > m_Picture.Height Then
ReleaseCapture
m_bMouseLeave = True
Exit Sub
ElseIf GetCapture() <> m_Picture.hwnd Then 'x bla bla
SetCapture m_Picture.hwnd
End If 'x bla bla
End If 'mouseleave
'Om vi har lämnat så ska vi endast spara nya kordinaterna när vi kommer tillbaka
If m_bMouseLeave Then
m_LastCord.X = X
m_LastCord.Y = Y
m_bMouseLeave = False
Exit Sub
End If 'mouseleave 2
'vi delar in cirkeln i fyra delar.
'första delen kollar vi om x och y ökar, isåfall drar vi på volym
'andra delen om x minskar och y ökar, isåfall drar vi på volym
'tredje delen om x minskar och y minskar, isåfall drar vi på volym
'fjärde delen om x ökar och y minskar, isåfall drar vi på volym
'två första delarna
If X > m_PicLimits.mX And X < m_PicLimits.rX Then
'första delen
If Y < m_PicLimits.mY Then
'vi rörde markören nedåt+höger, dvs ökar volymen
If X >= m_LastCord.X And Y >= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
'andra delen
Else
'vi rörde markören nedåt+vänster, dvs ökar volymen
If X <= m_LastCord.X And Y >= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
End If
'två sista delarna
Else
'första delen
If Y > m_PicLimits.mY Then
'vi rörde markören uppåt+vänster, dvs ökar volymen
If X <= m_LastCord.X And Y <= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
'andra delen
Else
'vi rörde markören uppåt+höger, dvs ökar volymen
If X >= m_LastCord.X And Y <= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
End If
End If
m_LastCord.X = X
m_LastCord.Y = Y
End Sub
Private Sub IncVolume()
'Volymen kan vara max 100%
If m_Volume >= 100 * m_Scale Then Debug.Print "exit": Exit Sub
'öka volymen
m_Volume = m_Volume + 1
'Här ska man även scrolla Picturebox hjulet, men eftersom jag inte kan grafik så...
'här ska bilden roteras...
'Säg till att volymen är ändrad
RaiseEvent Volume(m_Volume \ m_Scale)
End Sub
Private Sub DecVolume()
'Volymen kan vara min 0%
If m_Volume <= 0 Then Exit Sub
m_Volume = m_Volume - 1
'Här ska man även scrolla Picturebox hjulet, men eftersom jag inte kan grafik så...
'här ska bilden roteras...
'Säg till att volymen är ändrad
RaiseEvent Volume(m_Volume \ m_Scale)
End SubSv: Runda volymknappar?
det va så där jag menade med bild.
Lycka till // R-musSv: Runda volymknappar?
Först:
>vad som är kvar att fixa är att en bild i pictureboxen ska roteras när >värdet ökas/minskas. men eftersom jag e kass på gfx programmering >så överlåter jag det till någon annan.
GFX, är det de som gjor att en bild rör sig?
Någon som vet hur man gör?
Kan man använda detta som en AktivX-komponent, alltså så att man kan lägga till detta till sina verktyg??Sv: Runda volymknappar?
Dim WithEvents slider As CVolumeSlider
Jag har lagt den i General i form1.
Error:
COMPILE ERROR
User-defined type not defined
Någon referens som jag måste lägga till?Sv: Runda volymknappar?
stoppa sedan in allting från klassen däri, annars hittar den inte klassen...Sv: Runda volymknappar?
Nu klagar han på denna koden:
Set slider.MyPicturebox = Picture2
Compile Error
Method or data member not found.
Vad tror du?Sv: Runda volymknappar?
såhär ska klassen se ut:
Option Explicit
Dim WithEvents m_Picture As PictureBox
Public Event Volume(NewVolume As Integer)
Public Event Click()
Public Event DblClick()
Private Declare Function SetCapture Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCapture Lib "user32" () As Long
Private Type Limits
lX As Integer
rX As Integer
mX As Integer
tY As Integer
bY As Integer
mY As Integer
End Type
Dim m_PicLimits As Limits
Dim m_Volume As Integer
Private Type POINTAPI
X As Long
Y As Long
End Type
Dim m_LastCord As POINTAPI
Dim m_bMouseLeave As Boolean
Dim m_Scale As ScaleEnum
Public Enum ScaleEnum
one = 1
Two = 10
Three = 100
End Enum
Public Property Let SliderScale(aScale As ScaleEnum)
m_Scale = aScale
End Property
Public Property Get SliderScale() As ScaleEnum
SliderScale = m_Scale
End Property
Public Property Let Volume(data As Integer)
If data <= 100 And data >= 0 Then
m_Volume = data * m_Scale
'Maybe scroll the wheel?
End If
End Property
Public Property Set MyPicturebox(pic As PictureBox)
m_PicLimits.lX = 0 'left x
m_PicLimits.rX = pic.Width 'right x
m_PicLimits.bY = pic.Height 'bottom y
m_PicLimits.tY = 0 'top y
m_PicLimits.mX = pic.Width \ 2 'middle x
m_PicLimits.mY = pic.Height \ 2 'middle y
Set m_Picture = pic
End Property
Private Sub Class_Initialize()
m_Scale = Two
End Sub
Private Sub m_Picture_Click()
RaiseEvent Click
End Sub
Private Sub m_Picture_DblClick()
RaiseEvent DblClick
End Sub
Private Sub m_Picture_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 0 Then
m_bMouseLeave = True
Exit Sub
End If
'Denna del är till för att kolla om vi lämnar bilden, för isåfall ska vi återställa kordinaterna
If Not m_bMouseLeave Then
If X < 0 Or Y < 0 Or X > m_Picture.Width Or Y > m_Picture.Height Then
ReleaseCapture
m_bMouseLeave = True
Exit Sub
ElseIf GetCapture() <> m_Picture.hwnd Then 'x bla bla
SetCapture m_Picture.hwnd
End If 'x bla bla
End If 'mouseleave
'Om vi har lämnat så ska vi endast spara nya kordinaterna när vi kommer tillbaka
If m_bMouseLeave Then
m_LastCord.X = X
m_LastCord.Y = Y
m_bMouseLeave = False
Exit Sub
End If 'mouseleave 2
'vi delar in cirkeln i fyra delar.
'första delen kollar vi om x och y ökar, isåfall drar vi på volym
'andra delen om x minskar och y ökar, isåfall drar vi på volym
'tredje delen om x minskar och y minskar, isåfall drar vi på volym
'fjärde delen om x ökar och y minskar, isåfall drar vi på volym
'två första delarna
If X > m_PicLimits.mX And X < m_PicLimits.rX Then
'första delen
If Y < m_PicLimits.mY Then
'vi rörde markören nedåt+höger, dvs ökar volymen
If X >= m_LastCord.X And Y >= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
'andra delen
Else
'vi rörde markören nedåt+vänster, dvs ökar volymen
If X <= m_LastCord.X And Y >= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
End If
'två sista delarna
Else
'första delen
If Y > m_PicLimits.mY Then
'vi rörde markören uppåt+vänster, dvs ökar volymen
If X <= m_LastCord.X And Y <= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
'andra delen
Else
'vi rörde markören uppåt+höger, dvs ökar volymen
If X >= m_LastCord.X And Y <= m_LastCord.Y Then
IncVolume
Else
DecVolume
End If
End If
End If
m_LastCord.X = X
m_LastCord.Y = Y
End Sub
Private Sub IncVolume()
'Volymen kan vara max 100%
If m_Volume >= 100 * m_Scale Then Debug.Print "exit": Exit Sub
'öka volymen
m_Volume = m_Volume + 1
'Här ska man även scrolla Picturebox hjulet, men eftersom jag inte kan grafik så...
'här ska bilden roteras...
'Säg till att volymen är ändrad
RaiseEvent Volume(m_Volume \ m_Scale)
End Sub
Private Sub DecVolume()
'Volymen kan vara min 0%
If m_Volume <= 0 Then Exit Sub
m_Volume = m_Volume - 1
'Här ska man även scrolla Picturebox hjulet, men eftersom jag inte kan grafik så...
'här ska bilden roteras...
'Säg till att volymen är ändrad
RaiseEvent Volume(m_Volume \ m_Scale)
End SubSv: Runda volymknappar?
Jag får inga felmedelande längre, men jag får inte den effekten som jag ville ha.
Resultatet blir att jag kan flytta hella bilden, inte vrida på den som en volymknapp.
Det kommer inte heller in några siffror i textboxen.
Har vi missförståt varandra?Sv: Runda volymknappar?
Sv: Runda volymknappar?
[Flip, Rotate and mirror]
Så tror jag nog du skall kunna få bilden att snurraSv: Runda volymknappar?
Jag vet att du skrev det, men jag trode inte att resultatet skull bli som om hela pictureboxen var lös. Dessutom så kom det ju inget värde i textboxen.
[REDIGERAT]
Helt plötsligt så började lite grand att fungera, nu kom det siffror i textboxen...
Det skulle vara bra att kunna ställa in om jag vill ha ett minusvärde (-15 - + 15), likadant att kunna ställa in min, maxvärde (kanske samma sak). Har du någon susning...
[/REDIGERAT]
Teed:
Jag har kollat igenom det exemplet men jag får bara overflow.
Det här retar mig, att jag inte kommer på något konstrukttivt själv, eller har lyckats att läsa om detta.
Det ända som jag har hittat är färdiga knappar för 700:- till 1.200:- och det tycker jag är alldeles för dyrt.
Finns det inget annat sätt att lösa detta på??