Seite 2 von 3

Verfasst: 02.06.2007 19:47
von PureBasic4.0
@ALL: Ich möchte jetzt nur wissen, wie ich feststellen kann, ob eine Maustaste gerade gedrückt wird, gedrückt ist, oder losgelassen wird. Mehr nicht! Wünscht mir nicht jetzt schon viel Glück, wenn ich nur an der Stoffsammlung bin! :cry:

Verfasst: 02.06.2007 21:25
von Fluid Byte
Such im board nach #WM_LBUTTONDOWN- / UP und GetAsyncKeyState_()

Verfasst: 03.06.2007 00:25
von Leonhard
pogi02 hat geschrieben:Also so ein Projekt ist schon ein bisschen zu gross für nen Anfänger ...
Das find ich eine Ausrede. Erklärt ihm doch, wie das funktioniert. Solche Aussagen nerfen mich schon seit beginn des Programmierens. Mein 1. großes Projekt wahr z.B. ne Windows-Ersatz-Oberfläche, die ich aber nie verwendet habe, da diese total unoptimiert war (wobei mir auch jeder abgeraten hat). Wenn aus diesem Projekt ja nichts werden sollte, hat PureBasic4.0 wenigstens in sachen API etwas gelernt. Bei mir kommen auch immer ganz lustige Projekt-Vorschläge, und ich würde Wetten, das 75% der Leute mich wegen dieser Projekte für verückt haten würde. Das beste an diesen Projekte ist, das man sich frei entfalten kann, und ihr solltet im Forum nicht jeden hier zurecheweisen, was er kann, und was er nicht kann (könnte). Jeder sollte mal selbst die grenzen der Programmierung für sich finden. Solche Bemerkungen kann man als "p.s." schreiben, also nur als hinweis.

Verfasst: 03.06.2007 01:43
von Zaphod
Solche aussagen kommen halt weil die erfahrenen Programmierer generft sind von fragen wie: "Wie Programmiere ich Doom3 / World of Warcraft / Photoshop?" ... hauptsächlich weil es offensichtlich ist, wenn die person dafür noch nicht weit genug ist und dann die ratschläge und erklärungen sowieso nicht versteht.

@Programmie:
wenn die linke moustaste gedrückt wird gibt es als windowmessage #WM_LBUTTONDOWN... also musst du die messages so interpretieren...

auszug aus einem programm von mir:

Code: Alles auswählen


 Event = WaitWindowEvent()  
  
  WindowID = EventWindow() 
  
  GadgetID = EventGadget() 
  
  EventType = EventType() 
  
  
  Select Event
  
    Case #WM_MOUSEMOVE
        Screen\MouseX=WindowMouseX(#Window_Main)-Screen\ScrX
        Screen\MouseY=WindowMouseY(#Window_Main)-Screen\ScrY
        
        Screen\MouseOnScreen = #False
        If Screen\MouseX >=0 And Screen\MouseY>=0
          If Screen\MouseX <= Screen\ScrW
            If Screen\MouseY <= Screen\ScrH
              Screen\MouseOnScreen = #True
              NeedsRedraw = #True
            EndIf
          EndIf
        EndIf
        
        
  
    Case #WM_LBUTTONDOWN
        If Screen\MouseOnScreen = #True
          WndMain\LMB = #True
        EndIf
    
    Case #WM_LBUTTONUP
        WndMain\LMB = #False
        
        If Editor\ActualTool = #Button_Line
          If Editor\FirstSelected


Wie du darin auch unzweifelhaft erkennst gibt es keinen Windowsstatus für "Taste ist immer noch gedrückt", was bedeutet dass du dir das selbst merken musst, am besten wie in meinem Beispiel innerhalb einer struktur, dass ist dann ein bisschen handlicher und auch ein wenig besser strukturiert.

Also Windowmessage WM_LBUTTONDOWN erwarten, eine eigene variable setzen in der du dir merkst das sie unten ist und solange nicht die nachricht WM_LBUTTONUP kommt, solange ist sie halt gedrückt.

Aber Achtung: Wenn die Maustaste losgelassen wird, während sie nicht mehr über dem fenster ist, geht das WM_LBUTTONUP nicht ans Fenster! Darauf musst du bei deiner Programmlogik achten (oder auch nicht, aber das kann komische auswirkungen haben).

PS: Wenn du diese informationen nicht auf MSDN.com auffinden kannst, dann glaube ich auch dass das ganze noch zu groß für dich ist, wünsche dir aber trotzdem viel glück, denn auch an zu großen projekten kann man wachsen ;)

Verfasst: 03.06.2007 02:39
von K.Putt
Zaphod hat geschrieben:Solche aussagen kommen halt weil die erfahrenen Programmierer generft sind von fragen wie: "Wie Programmiere ich Doom3 / World of Warcraft / Photoshop?"
Für Doom und Warcraft braucht man ein 3Dimensionales Array, bei Photoshop reicht ein 2Dimensionales, oder?

Verfasst: 03.06.2007 03:03
von Deluxe0321
K.Putt hat geschrieben:Für Doom und Warcraft braucht man ein 3Dimensionales Array, bei Photoshop reicht ein 2Dimensionales, oder?
Ein Array hat wenig mit 2D & 3D Grafik zu tun :roll:

Verfasst: 03.06.2007 03:30
von K.Putt
Deluxe0321 hat geschrieben:
K.Putt hat geschrieben:Für Doom und Warcraft braucht man ein 3Dimensionales Array, bei Photoshop reicht ein 2Dimensionales, oder?
Ein Array hat wenig mit 2D & 3D Grafik zu tun :roll:
Und wie programmiere ich es dann?

:twisted:

Das war Ironie :lol:

Verfasst: 03.06.2007 11:08
von Kaeru Gaman
@Topic

GetAsyncKeystate_(#VK_LBUTTON) liefert unterschiedliche ergebnisse, je nachdem,
ob es die erste abfrage ist, wo man clickt, oder ob die taste gedrückt gehalten wird.
das release muss man selber verfolgen.
außerdem muss man selber abgleichen, ob das eigene fenster den focus hat,
da GetAsyncKeystate immer ergebnisse liefert, egal wo der user grad arbeitet.


@SubTopic

>> Solche Aussagen nerfen mich schon seit beginn des Programmierens.
> Solche aussagen kommen halt weil die erfahrenen Programmierer generft sind von fragen wie

es ist immer auch eine frage der herangehensweise.

niemand verbietet dir, dich mit themen zu befassen, bei denen du
selber merken darfst, ob und wieviel sie zu hoch für dich sind.

aber es ist ein unterschied, ob man damit fortlaufen das forum nervt,
oder ob man das im stillen kämmerlein durchzieht.

> Wenn du diese informationen nicht auf MSDN.com auffinden kannst,
> dann glaube ich auch dass das ganze noch zu groß für dich ist

wenn man nicht in der lage ist, sich selbständig die hintergrund-informationen
zu beschaffen die man für das projekt braucht, dann ist es durchaus
wahrscheinlich, dass das ganze projekt zu hoch gegriffen ist.

Verfasst: 03.06.2007 13:48
von hardy
@PureBasic4.0: Eventuell hilft dir folgender Code etwas weiter, es werden aber WinAPI-Funktionen verwendet:

Code: Alles auswählen

;************************************************************
;*   WinAPI: Fenster erstellen und darin mit GDI zeichnen   *
;* ======================================================== *
;*   - mit der Maus einen rechteckigen Rahmen ziehen        *
;************************************************************

;- Grundlage ist Beispiel aus WinAPI-Einführung von "www.red-inferno.de" und "www.willemer.de"
;- zeichnen im Zweig "WM_MOUSEMOVE"


Global hwnd, rc.RECT, startpt.POINT, endpt.POINT, *dc, returncode.l  ;"hwnd" muss global definiert werden

Declare my_Drawframe()
  
Procedure WndProc(wnd,Message,wParam,lParam) 
returncode=0

Select Message 

  Case #WM_LBUTTONDOWN
;    invalidaterect_(hwnd, #null, #true); loescht vorheriges rechteck
    startpt\x = lparam & $FFFF
    startpt\y = lparam >> 16 & $FFFF
    endpt\x = lparam & $FFFF
    endpt\y = lparam >> 16 & $FFFF    
;     Debug Str(startpt\x) + " " +Str(startpt\y)
    
  Case #WM_MOUSEMOVE
;     Debug Str(endpt\x) + " " +Str(endpt\y)    
    If wparam & #MK_LBUTTON   ;linke maustaste gedrueckt ?
      *DC=GetDC_(hwnd)
      my_drawframe()
      endpt\x = lparam & $FFFF
      endpt\y = lparam >> 16 & $FFFF  
      my_drawframe()
      ReleaseDC_(hwnd,*DC)
    EndIf
    
    
  Case #WM_CLOSE  
    Debug "WM_CLOSE"
    DestroyWindow_(hWnd);

  Case #WM_DESTROY
    Debug "WM_DESTROY"
;    UnregisterClass_(appname,hInstance) 
    PostQuitMessage_(0) 

  Default
    Returncode = DefWindowProc_(wnd, Message, wParam, lParam) 
        
EndSelect 
ProcedureReturn Returncode 
EndProcedure 

t$="MZ"   ;classname 

wc.WNDCLASS 
wc\cbClsExtra = 0 
wc\cbWndExtra = 0 
wc\hbrBackground = #COLOR_BACKGROUND 
wc\hInstance = hInstance 
wc\hIcon = LoadIcon_(0,#IDI_APPLICATION) 
wc\hCursor = LoadCursor_(0, #IDC_CROSS) 
wc\lpszMenuName = 0 
wc\lpszClassName = @t$ 
wc\lpfnWndProc = @WndProc() 
wc\style = #CS_HREDRAW | #CS_VREDRAW 

RegisterClass_(@wc)
hwnd = CreateWindowEx_(0,t$,"Zeichnen mit dem GDI",#WS_OVERLAPPEDWINDOW,150,350,600,350,0,0,hInstance,0) 
ShowWindow_(hwnd,  #SW_SHOWNORMAL) 
UpdateWindow_(hwnd)

While GetMessage_(msg.MSG, #Null, 0, 0 ) 
  TranslateMessage_(msg) 
  DispatchMessage_(msg) 
Wend

End


Procedure my_Drawframe()
  SetROP2_(*DC,#R2_NOT)      
  MoveToEx_(*DC,startpt\x,startpt\y,#Null)
  LineTo_(*DC,endpt\x,startpt\y)
  LineTo_(*DC,endpt\x,endpt\y)
  LineTo_(*DC,startpt\x,endpt\y)
  LineTo_(*DC,startpt\x,startpt\y)
ProcedureReturn 0
EndProcedure



; IDE Options = PureBasic v4.02 (Windows - x86)
; CursorPosition = 39
; FirstLine = 6
; Folding = -

Cool bleiben

Verfasst: 03.06.2007 20:07
von teachco
Hallo Leute,

zunächst möchte ich mal feststellen, dass dieses Forum hier sehr aktiv ist. Das finde ich bemerkenswert und ist auch etwas Besonderes in den Weiten des Internets.

Die Ungeduld von einigen Helfern hier im Forum zeigt doch, wie engagiert sie sind, auch wenn das mal in markigen Sprüchen rüber kommt und das eigene Ego etwas aufmöbeln soll. Trotzdem, niemand ist hier gezwungen auf vermeintlich dumme Fragen zu antworten, aber viele tun es trotzdem mit Geduld und Sachverstand. Das finde ich klasse! Also Dank an alle, die hier so engagiert antworten, denn sie helfen die PB-Gemeinde zu vergrößern und erhalten Einsteigern die Lust und Motivation an der Sprache PureBasic.

Viele benutzen das Forum, weil es ein bequemer Weg ist. Das muss man einfach sehen. Gerade Anfänger haben das Problem, dass sie gar nicht wissen, wonach sie suchen müssen bzw. die Quellen nicht kennen. Da ist es besser mal ein paar Links zu posten als gleich die "Du bist zu dumm"-Keule zu schwingen. Das hilft keinem. Hilfe zur Selbsthilfe ist ein guter Weg und passende Hinweise auch. Denkt auch daran, dass es unterschiedliche Lerntypen gibt. Die einen lernen aus Büchern und lesen im Internet, die anderen müssen sich in Foren an die Probleme heranfragen. Das hat nichts mit "nerven" zu tun, das hängt vom Lerntyp ab.

Also werte Poster, als Hilfesuchende denkt daran, dass das hier ein excellentes aktives Forum ist, als Helfer denkt daran, Geduld zu bewahren und auch auf vermeintlich dumme Fragen sachgerecht zu antworten. Ihr macht aus diesem Forum das, was es ist.

Zum Abschluss noch eine persönliche Erfahrung mit der Microsoft-Hotline, die durchaus einen Einzelfall darstellen mag. (äh - die Erfahrung natürlich)
Dort bekam ich als Antwort auf ein Problem. "Tut mir leid, das Problem haben wir nicht in unserer Datenbank." Nun, die Hotline war zu der Zeit kostenpflichtig. Hier im PB-Forum habe ich bisher IMMER eine hilfreiche Antwort bekommen und das kostenlos.

Also macht Euch klar, was Ihr hier Feines habt. :) :wink: <)