Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Drag & Drop - z jednego miejsca w drugie...
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002
Drag & Drop - z jednego miejsca w drugie...

Czy ktoś wie może jak napisać procedurę powodującą, że użytkownik sam sobie będzie mógł przenosić przyciski w obrębie formy? Chciałbym jeszcze aby właściwość .top tych przycisków była stała, a użytkownik mógł jedynie zmieniać właściwość .left.
Piszę coś w rodzaju paska narzędziowego


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


08-10-2004 18:15
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
xEagle2



Typ: neutral
Postów: 280
Zarejestrowany: Jul 2003

Ja robiłem coś w rodzaju wirtualnego pulpitu z przesówaniem ikonek i ich dodawaniem ... jak chcesz do Ci podeśle


_____________________________________________
Co oznacza NET ? Natychmiastowa Eksplozja Trojanów

08-10-2004 19:06
Pokaż profil xEagle2  Wyślij email do xEagle2       
losmac
"profesorek"




Typ: neutral
Postów: 758
Zarejestrowany: May 2003

Sposób:

W procedurze OnMouseDown pobierz parametry kursora.
W procedurze OnMouseUp ustaw parametry przycisku z pobranych parametrów kursora.


_____________________________________________
POSTULATY STARUSZKA:
1) Ludzie, dbajcie o polszczyznę!!!
2) Ludzie, zadawajcie kompletne pytania, a nie rzucacie ochłapy i trzeba się domyślać o co chodzi!!!

Powodzenia
Maciej Łoś

08-10-2004 19:38
Pokaż profil losmac  Wyślij email do losmac   Odwiedź stronę losmac  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

xEagle2 - jasne, gdybyś mógł mi przesłać byłbym wdzięczny

losmac:
1.) Jakiej procedury mam użyć do pobrania współrzędnych kursora? Chyba nie GetCursorPos...
2.) Podczas operacji przeciągani na pasku Windows widzisz taką pionową kreskę-jak coś takiego mam zrobić w VB?
3.) Pozostaje jeszcze kwestia co zrobić jak użyszkodnik zechce przenieść ikonkę między 2 istniejące...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


08-10-2004 21:57
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
xEagle2



Typ: neutral
Postów: 280
Zarejestrowany: Jul 2003

Poszło.

Tylko program ma wade bo jak będziesz miał 2 ikonki i podczas przesówanie 'przejedziesz' przez inną to zmieni się pozycja tej 'innej'

(jak ktoś to zrozumiał to dobrze )


_____________________________________________
Co oznacza NET ? Natychmiastowa Eksplozja Trojanów

09-10-2004 20:23
Pokaż profil xEagle2  Wyślij email do xEagle2       
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Narysuj sobie Picturebox (pasek narzędzi) o wysokości takiej, żeby ScaleHeight = 33 piksele. Narysuj tam buttona 33x33 piksele i użyj tego kodu. Oczywiście możesz używać innych wymiarów, wsyatrczy, że zmienisz odpowiednio wartości w kodzie.

Private Declare Sub ReleaseCapture Lib "user32" ()
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    ReleaseCapture
    SendMessage Command1.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
End Sub

Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Command1.Top = 0
    If Command1.Left < 0 Then Command1.Left = 0
    If Command1.Left Mod 33 > 0 Then Command1.Left = Command1.Left - Command1.Left Mod 33
End Sub


Ten przykład jest oczywiście bardzo prosty i paska narzędzi, o którym mowa nie przypomina. Ale zważywszy na to, że robimy to obiektowo - to i tak ładnie. Paski narzędzi zwykle sa rysowane, co ułatwia takie operacje. Pełnego kodu takiego paska nie będe umieszczał na forum z przyczyn oczywistych - jeśli będą chętni, to coś naskrobię i wyślę do vb4all, opublikuję na innym serwerze albo rozpowszechnię inną drogą.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

10-10-2004 01:57
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002

Wielkie dzięki! Mam jeszcze trzy pytania:
1.) Może wiesz jak zrobić tak, żeby jak przesuwam ten przycisk na inny, to zeby program na to nie pozwalał.
2.) Czy to musi być przycisk? Nie może być też image?
3.) Nie wiesz przypadkiem jak zrobić autoukrywanie takiego paska...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


11-10-2004 15:03
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
Viper87



Typ: neutral
Postów: 490
Zarejestrowany: Oct 2002
I jeszcze jedno...

Jest jeszcze jedna sprawa... Używam niestandardowych przycisków i co jeśli będą one dodawane w trakcie działania programu (choć jeszcze nie wiem jak)? Przecież nie mogę przypisać zdarzeń nieistniejącym jeszcze obiektom...


_____________________________________________
Viper

"Savoir c`est prevoir, prevoir c`est prevenir". 
(Wiedzieć to przewidzieć, przewidzieć to zapobiegać) 


11-10-2004 15:33
Pokaż profil Viper87  Wyślij email do Viper87   Odwiedź stronę Viper87  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

1) Wystarczy wprowadzić np. taką modyfikację:
Private nOldX As Long

Private Sub Command1_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
    nOldX = Command1(Index).Left
    ReleaseCapture
    SendMessage Command1(Index).hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0
End Sub

Private Sub Command1_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim cIndex As Integer
   
    Command1(Index).Top = 0
    If Command1(Index).Left < 0 Then Command1(Index).Left = 0
    If Command1(Index).Left Mod 33 > 0 Then Command1(Index).Left = Command1(Index).Left - Command1(Index).Left Mod 33
   
    For cIndex = 0 To Command1.Count - 1
        If (Command1(Index).Left = Command1(cIndex).Left) And (Index <> cIndex) Then
            Command1(Index).Left = nOldX
        End If
    Next
End Sub


Oczywiście w takim rpzypadku commandbuttony muszą być indeksowane... jeśli chcesz mieć nieindeksowane, to musisz jakoś inaczej to zapisać (np. analizować kolekcję kontrolek na formie).

2) Image nie może być, bo nie ma okna. Można używać tylko kontrolek tworzących okno. Możesz użyć np. PictureBox, ale do takich kontrolek należą również Textbox, OptionButton, Checkbox itd. Generalnie - wszystko, co ma właściwość hWnd.

3) Dodajesz Timer:
.Name = TimHideBar
.Interval = 5000

a potem kod:

Private bToolbarState As Byte

Private Sub PicToolbar_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If bToolbarState = 255 Then
        PicToolbar.Top = 0
        bToolbarState = 0
        TimHideBar.Enabled = True
    End If
End Sub

Private Sub TimHideBar_Timer()
    If bToolbarState = 0 Then
        PicToolbar.Top = -33
        bToolbarState = 255
        TimHideBar.Enabled = False
    End If
End Sub


Interval moze być inny (to czas w ms, po jakim zniknie pasek). Tutaj też widac, dlaczego na początku mówiłem o umieszczeniu przycisków w pictureboxie - poprostu łątwiej jest nim potem operować .
Aha - ważna rzecz - pamietaj, że PictureBox musi wystawać na formę. Użytkownik musi potem przecież jakoś go spowrotem "pokazać" . Jakieś 2-3px wystarczą.

4) Nie wiem o jakie przyciski chodzi, wiec nic nie mogę powiedzieć. A jak wykrywać będziesz inne zdarzenia? Kliknięcia itp.?

[Post edytowany dnia 11-10-2004 20:48 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

11-10-2004 20:45
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 8 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1