Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 12.03.2007, 09:21    Titel: Antworten mit Zitat

Statische Variable, ähnlich wie Private demfall? ..vielleicht würden die Beispiele mit einem anderen Compiler gehen. Allerdings,für was es unbedingt C sein muss weiss ich auch nicht; es würde ja in FB und in ASM ohne weiteres gehen, nur weniger dokumentiert aber ich hoffe mal dass mein RADASM irgendwann mal laufen wird.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 21.05.2007, 11:08    Titel: ein bißchen zur Aufklärung... Antworten mit Zitat

... will ich beitragen, weil ich die WinAPI mit C schon kennengelernt habe.

Also: das mit den Klammern ist Gewöhnungssache. Die geschweiften Klammern {} markieren Funktionsblöcke, die runden Klammern () Funktionsparameter.

Ich habe mich an diese Klammern gewöhnt und vermisse sie ein wenig in FreeBasic mit den Augen rollen Macht den Code etwas leichter lesbar.

Die deklaration Static bewirkt, daß eine Variable/Funktion für das gesamte Modul mit allen Untermodulen sichtbar ist und aus Unterfunktionen heraus geändert werden kann. Nicht static deklarierte Variablen sind nur im eigenen Modul/ in der eigenen Funktion anwendbar. Wenn sie als Variable (sozusagen BYVAL) an Unterfunktionen übergeben werden, wird in der Unterfunktion nur eine Kopie der Variable angelegt, die Originalvariable bleibt unverändert.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 23.05.2007, 16:00    Titel: Antworten mit Zitat

Danke lächeln Nun habe ich mich etwas mit C auseinandergesetzt und nach einigen Versuchen mit diversen Klassenbibliotheken nun soweit: Diese Bibliotheken wären zwar toll, auch mit Form-Designer etc. nur braucht es zu viele Nerven bis die laufen, und alles eingebunden ist etc. da macht man einen Quellcode mit so einem Programm und der läuft dann nicht. Die Bedienung solcher Sachen sind zu Nervenaufreibend, wenn das ja schwerer ist als das Programmieren an sich lächeln Somit habe ich das wieder aufgegeben und mit C++ und der WinAPI weiter probiert. Habe ein gutes Tutorial gefunden, wo auch alles Schrittweise erklärt ist und nun habe ich schon mehr die Übersicht, was zu was gehört etc. und konnte schon mehrere Steuerelemente einfügen.
Das Selbe unter Assembler und FreeBasic war allerdings irgendwie nicht erfolgreich.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 24.05.2007, 09:25    Titel: Antworten mit Zitat

Um die WinAPI in Basic zu übersetzen, mußt Du erstmal C richtig kennenlernen, weil Du Dich an die C-Aufrufkonventionen halten mußt (die WinAPI ist numal in C geschrieben.) Dazu reicht es nicht, nur mal ein paar WinAPI-Tutorials abzuschreiben.
Normalerweise brauchst Du für die Grundlagen nämlich keine großen Bibliotheken, sondern nur stdio.h.
Alternativ kannst Du es mit C++ auf Consolenebene probieren (dann iostream.h) (hab auch so angefangen). Den ganzen OOP-Kram mußte ja nicht machen, aber was Zeiger, Referenzen usw. sind, Typenconvertierung und wie man Functions aufruft, sollte man schon wissen.

Hier eine Seite mit guten Tutorials sowohl zu C alsauch zur WinAPI.

http://pronix.linuxdelta.de/index.shtml


Zuletzt bearbeitet von Elektronix am 27.05.2007, 21:45, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 24.05.2007, 13:08    Titel: Antworten mit Zitat

Ja mit Konsolenprogrammen habe ich mit C angefangen, bevor ich weiter mit der WinAPI probierte. Kürzlich gelang es mir einiges in MASM32 zu übertragen, doch irgend ein Problem mit der Nachrichtenschleife habe ich noch lächeln
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 24.05.2007, 13:27    Titel: Antworten mit Zitat

Dann stell doch mal Deinen Code ein und beschreib uns Dein Problem. zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 24.05.2007, 17:37    Titel: Antworten mit Zitat

Mache ich sobald ich zu Hause bin lächeln -> So nun da:
Der Code funktionierte bis ich die Nachrichtenschleife um die Funktion für den Button erweiterte. Seither erscheint das Fenster nicht mal mehr, das Programm läuft aber unsichtbar (und nur mit dem Taskmanager beendbar).
Code:

.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
ClassName db "SimpleWinClass",0
AppName  db "Our First Window",0
OurText  db "Win32 assembly is great and easy!",0
ButtonText db "My First Button",0
ButtonClassName db "button",0
msgtext1 db "Hoi",0
msgtext2 db ":-D",0


.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndButton HWND ?

.const
ButtonID equ 1

.code
start:
   invoke GetModuleHandle, NULL
   mov    hInstance,eax
   invoke GetCommandLine
   invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
   invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
   LOCAL wc:WNDCLASSEX
   LOCAL msg:MSG
   LOCAL hwnd:HWND
   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push  hInst
   pop   wc.hInstance
   mov   wc.hbrBackground,COLOR_WINDOW+1
   mov   wc.lpszMenuName,NULL
   mov   wc.lpszClassName,OFFSET ClassName
   invoke LoadIcon,NULL,IDI_APPLICATION
   mov   wc.hIcon,eax
   mov   wc.hIconSm,0
   invoke LoadCursor,NULL,IDC_ARROW
   mov   wc.hCursor,eax
   invoke RegisterClassEx, addr wc
   INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
           hInst,NULL
   mov   hwnd,eax
   INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
   INVOKE UpdateWindow, hwnd
   .WHILE TRUE
                INVOKE GetMessage, ADDR msg,NULL,0,0
                .BREAK .IF (!eax)
                INVOKE TranslateMessage, ADDR msg
                INVOKE DispatchMessage, ADDR msg
   .ENDW
   mov     eax,msg.wParam
   ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   LOCAL hdc:HDC
   LOCAL ps:PAINTSTRUCT
   LOCAL rect:RECT
   .IF uMsg==WM_DESTROY
      invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        75,70,140,25,hWnd,ButtonID,hInstance,NULL
      mov  hwndButton,eax


   .ELSEIF uMsg==WM_PAINT
      invoke BeginPaint,hWnd, ADDR ps
      mov    hdc,eax
      invoke GetClientRect,hWnd, ADDR rect
      invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
      invoke EndPaint,hWnd, ADDR ps

.ELSEIF uMsg==WM_COMMAND
      mov eax,wParam
      .IF ax==ButtonID
            shr eax,16
            .IF ax==BN_CLICKED
               invoke MessageBox,NULL,msgtext1,msgtext2, 1
         
.ENDIF
   .ELSE
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam
      ret
   .ENDIF
.ENDIF

   xor    eax,eax
   ret
WndProc endp
end start

_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 25.05.2007, 09:14    Titel: Antworten mit Zitat

Code:
invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        75,70,140,25,hWnd,ButtonID,hInstance,NULL

Du hast bei der HINSTANCE des Buttons eine eigene hInstance angegeben. Dort muß aber die hInstance des Elternfensters per Zeiger auf die LPCREATESTRUCT des Elternfensters angegeben werden.
in C sieht das so aus:
Code:
((LPCREATESTRUCT) lParam) -> hInstance

Oder in Basic:

Code:
cast(LPCREATESTRUCT,lParam)->hInstance


Wie man das in Assembler formuliert, weiß ich allerdings nicht... grinsen


Zuletzt bearbeitet von Elektronix am 27.05.2007, 21:45, insgesamt 2-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 25.05.2007, 12:59    Titel: Antworten mit Zitat

ups lächeln Allerdings, das Fenster erschien jedenfalls auch mit diesem Code, bis ich die Nachrichtenschleife modifizierte (was einige Versuche brauchte da ich zu viele oder zu wenige .ENDIF angegeben habe). Vorher war der Button jedenfalls sichtbar.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 25.05.2007, 15:32    Titel: Antworten mit Zitat

c.m.obrecht hat Folgendes geschrieben:
ups lächeln Allerdings, das Fenster erschien jedenfalls auch mit diesem Code, bis ich die Nachrichtenschleife modifizierte (was einige Versuche brauchte da ich zu viele oder zu wenige .ENDIF angegeben habe).


Dein Code ist etwas unübersichtlich: Keine Kommentare, falsche Einrückungen.

Wie haste denn die Nachrichtenschleife modifiziert?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 27.05.2007, 12:49    Titel: Antworten mit Zitat

Ich habe die WM_Command eingefügt, wo die MessageBox erscheinen soll. Zuerst meldete der Assembler wegen .ENDIF, habe ich eines vergessen zuzufügen; danach ging es aber wie gesagt ist das Fenster nicht mer sichtbar (der oben gepostete COde).
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 27.05.2007, 21:06    Titel: Antworten mit Zitat

Wie jetzt? Ist nur der Button nicht sichtbar oder das ganze Programmfenster?

Kleiner Hinweis: Du hast mit der Abfrage der WM_COMMAND nicht die Nachrichtenschleife modifiziert, sondern die WndProc-Funktion.

Hier mal das Format von CreateWindowEx:
Code:
HWND CreateWindowEx(

    DWORD dwExStyle,   // extended window style
    LPCTSTR lpClassName,   // pointer to registered class name
    LPCTSTR lpWindowName,   // pointer to window name
    DWORD dwStyle,                   // window style
    int x,                                   // horizontal position of window
    int y,                                   // vertical position of window
    int nWidth,                   // window width
    int nHeight,                   // window height
    HWND hWndParent,   // handle to parent or owner window
    HMENU hMenu,                   // handle to menu, or child-window identifier
    HINSTANCE hInstance,   // handle to application instance
    LPVOID lpParam    // pointer to window-creation data
   );


Und hier Deine Interpretation davon:
Code:
invoke CreateWindowEx,NULL,
                                             ADDR ButtonClassName,
                                             ADDR ButtonText,
                                             WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,
                                              75,70,140,25,
                                              hWnd,
                                         ***ButtonID,***
                                              hInstance,
                                              NULL

Ich würde mal die ButtonID weglassen und dort NULL angeben, und in der WM_COMMAND statt der ButtonID das Handle des Buttonfensters (in lParam) verwenden.

Im Zweifelsfall kannst Du per MessageBox das Handle des Buttonfensters abfragen, dann weißt Du wenigstens, ob der Button gar nicht erstellt, oder nur nicht angezeigt wird.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 28.05.2007, 20:55    Titel: Antworten mit Zitat

Ach so; es wird das ganze Programmfenster nicht mehr angezeigt. Daher weiss ich nicht ob der Button angezeigt würde oder nicht; es ist gar nichts sichtbar.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 28.05.2007, 21:17    Titel: Antworten mit Zitat

Noja, ich bin in Assembler nicht so sattelfest verwundert . Basic oder C würde ich besser verstehen.
Noch eine Sache zu Deiner WndclassEx: Bei wc.hIconSm hast Du als Parameter 0 eingegeben. Wenn Du kein Programmicon wählst, sollte dort
Code:
LoadIcon(NULL, IDI_APPLICATION)
stehen.

Hast Du denn mal abgefragt, ob die RegisterClassEx korrekt abgeschlossen (Rückgabewert <> 0) oder die CreateWindowEx-Funktion für das Hauptfenster ein Handle zurückgibt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 29.05.2007, 06:23    Titel: Antworten mit Zitat

Assembler an sich ist ja viel leichter als WinAPI lächeln
Ja das Fenster habe ich wieder, habe alle .IF und .ENDIF - Direktiven in aller Ruhe überprüft und eine verschoben - nun ist es wieder da. Mit dem Button. Nur, wenn man darauf klickt passiert noch nichts... da scheint irgend etwsas, wahrscheinlich kleines, nicht zu stimmen.
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 30.05.2007, 09:14    Titel: Antworten mit Zitat

Stell halt den Code nochmal rein, vielleicht läßt sich was finden. Hab mal vor ein paar Jahren Assembler gemacht, muß es nur wieder richtig reaktivieren. Das geht ein bißchen Zähflüssig...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 30.05.2007, 21:25    Titel: Antworten mit Zitat

juhui, alles klar lächeln Habe nur das ADDR in der MessageBox vergessen einzugeben vor der Variablenangabe (bin ich mir halt nicht so gewohnt, ansonsten unter Assembler habe ich auch selten derartige Angaben, denke das ist was wie dword ptr, gebraucht).

Um das Resultat der MessageBox zu gewinnen, kann ich das mit einer .IF-Abfrage direkt machen oder muss ich da wie in Basic z.B. Resultat=MessageBox ... machen? So ungewohnt mit Hochsprachen-Operatoren unter Assembler zu hantieren
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Elektronix



Anmeldungsdatum: 29.06.2006
Beiträge: 742

BeitragVerfasst am: 31.05.2007, 09:21    Titel: Antworten mit Zitat

Also, in Basic geht das mit
Code:
if MessageBox(...) = IDOK
then
    Schießmichnichtot
endif

Wie das in Assembler geht, weiß ich jetzt nicht. neutral
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
c.m.obrecht



Anmeldungsdatum: 09.03.2006
Beiträge: 377
Wohnort: Hofstetten SO, CH

BeitragVerfasst am: 31.05.2007, 13:17    Titel: Antworten mit Zitat

sollte gehen auf die selbe Weise mit .IF MessageBox.... ==ID_OK
usw. usw.
.ENDIF

werde ich jedenfalls mal versuchen lächeln

... habe das auch hinbekommen.. nach langen Versuchtn mit .IF; dabei geht es einfacher kaum, mit normalen ASM-Befehlen, einem cmp, da die MessageBox das Ergebnis im EAX zurücklässt zwinkern
_________________
...längre blomstre gamle nord...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Windows-spezifische Fragen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz