 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 12.03.2007, 09:21 Titel: |
|
|
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 21.05.2007, 11:08 Titel: ein bißchen zur Aufklärung... |
|
|
... 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 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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.05.2007, 16:00 Titel: |
|
|
Danke 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 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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 24.05.2007, 09:25 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 24.05.2007, 13:08 Titel: |
|
|
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ängre blomstre gamle nord... |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 24.05.2007, 13:27 Titel: |
|
|
Dann stell doch mal Deinen Code ein und beschreib uns Dein Problem.  |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 24.05.2007, 17:37 Titel: |
|
|
Mache ich sobald ich zu Hause bin -> 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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 25.05.2007, 09:14 Titel: |
|
|
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... 
Zuletzt bearbeitet von Elektronix am 27.05.2007, 21:45, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 25.05.2007, 12:59 Titel: |
|
|
ups 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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 25.05.2007, 15:32 Titel: |
|
|
c.m.obrecht hat Folgendes geschrieben: | ups 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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 27.05.2007, 12:49 Titel: |
|
|
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 27.05.2007, 21:06 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 28.05.2007, 20:55 Titel: |
|
|
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 28.05.2007, 21:17 Titel: |
|
|
Noja, ich bin in Assembler nicht so sattelfest . 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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 29.05.2007, 06:23 Titel: |
|
|
Assembler an sich ist ja viel leichter als WinAPI
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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 30.05.2007, 09:14 Titel: |
|
|
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 |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 30.05.2007, 21:25 Titel: |
|
|
juhui, alles klar 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 |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.05.2007, 09:21 Titel: |
|
|
Also, in Basic geht das mit
Code: | if MessageBox(...) = IDOK
then
Schießmichnichtot
endif
|
Wie das in Assembler geht, weiß ich jetzt nicht.  |
|
Nach oben |
|
 |
c.m.obrecht

Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 31.05.2007, 13:17 Titel: |
|
|
sollte gehen auf die selbe Weise mit .IF MessageBox.... ==ID_OK
usw. usw.
.ENDIF
werde ich jedenfalls mal versuchen
... 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  _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
 |
|
|
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.
|
|