 |
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 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 01.02.2010, 21:30 Titel: Buttons/Checkbox? MB_...? |
|
|
Hallo.
Ich würde gerne in Freebasic so eine Art Button/Checkbox programmieren, wo man mit der Maus drauf drücken kann. (Häckchen sätzen) Es gibt in FB noch die Befehle mit MB_DEFBUTTON1 und MB_OK bzw. MB_APPLMODAL und MB_ABORTRETRYIGNORE. Weiß jemand wie man sowas macht? Brauche es für einen Screensaver.
Und wie macht man einen beweglichen Balken?
Womit man 100% oder 33% oder 75% einstellen kann?
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 02.02.2010, 20:59 Titel: |
|
|
Hallo.
Habe mir mal das ganze durchgeschaut, blicke aber bei den Buttons nicht ganz durch.
http://www.freebasic-portal.de/tutorials/lutz-ifers-winapi-tutorial-64-s16.html
Das ganze ist als Funktion. Wie mache ich das damit das bei der Saver.bas funktioniert? Bei mir wird entweder keine Buttons angezeigt oder es kommt eine Fehlermeldung.
Code: | #include "windows.bi"
const ProgrammName = "TEST"
DECLARE SUB ConfigureScreensaver
DECLARE SUB ShowScreensaver
Declare Sub spielfeld
declare function WndProc(byval hWnd as HWND, byval message as UINTEGER,_
byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
Declare function SubProc(byval hWnd as HWND, byval message as UINTEGER,_
byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
DIM SHARED AS INTEGER mx_alt, my_alt, mx_neu, my_neu
DIM AS STRING Param
' Kein Parameter?
IF COMMAND(1) = "" THEN
If MessageBox(0, "Sreensaver testen?", " ", MB_ICONQUESTION OR MB_YESNO) = IDYES THEN
ShowScreensaver
END IF
END
END IF
' Gewünschtes Kommando isolieren
Param = MID(COMMAND(1), 2, 1)
SELECT CASE Param
CASE "s","S"
ShowScreensaver
CASE "c","C"
ConfigureScreensaver
Case "p", "P"
END SELECT
End
SUB ConfigureScreensaver
dim as WNDCLASS wndcls
with wndcls
.style = CS_HREDRAW or CS_VREDRAW
.lpfnWndProc = ProcPtr(WndProc)
.cbClsExtra = 0
.cbWndExtra = 0
.hInstance = GetModuleHandle(NULL)
.hCursor = LoadCursor(NULL, IDC_ARROW)
.hIcon = LoadIcon(NULL, IDI_APPLICATION)
.hbrBackground = GetSysColorBrush(COLOR_WINDOW)
.lpszClassName = StrPtr(ProgrammName)
.lpszMenuName = NULL
end with
RegisterClass @wndcls
dim as HWND hWnd = CreateWindow(_
ProgrammName, ProgrammName, WS_OVERLAPPED or WS_SYSMENU,_
CW_USEDEFAULT, CW_USEDEFAULT, 180, 210,_
NULL, NULL, GetModuleHandle(NULL), NULL)
MessageBox(0, "Einstellungen", " ", MB_ICONINFORMATION)
' ****************************************
' ??? Fehler???
'
' CreateWindow hwnd, SW_NORMAL
UpdateWindow hWnd
' ****************************************
Dim as MSG msg
Do while getmessage(@msg, NULL, 0, 0) <> 0
DispatchMessage @msg
Loop
End msg.wParam
End SUB
SUB ShowScreensaver
' Vollbild, kein weiterer Moduswechsel
Screen 8,32,, 1 Or 4
' Maussymbol nicht anzeigen
SETMOUSE ,,0
SLEEP 50
' Mausposition merken
GETMOUSE mx_alt, my_alt
' Zufallsgenerator initialisieren
RANDOMIZE TIMER
' Grafik initialisieren
DO
' SCREENLOCK 'verhindert unschönes Bildschirmflimmern
spielfeld
' SCREENUNLOCK 'verhindert unschönes Bildschirmflimmern
GETMOUSE mx_neu, my_neu
'wurde die Maus bewegt?
IF mx_neu<>mx_alt OR my_neu<>my_alt OR INKEY <> "" Then
EXIT SUB
END IF
' Zur Senkung der Prozessorlast immer ein bisschen warten
' SLEEP 1
Loop
END Sub
Sub spielfeld
End Sub
function WndProc(byval hWnd as HWND, byval message as UINTEGER,_
byval wParam as WPARAM, byval lParam as LPARAM) as LRESULT
static as HWND hrot, hblau, hgruen
select case message
case WM_DESTROY
PostQuitMessage 0
return 0
case WM_CREATE
CreateWindow("button", "Geschwindigkeit?",_
WS_CHILD or WS_VISIBLE or WS_GROUP or BS_GROUPBOX,_
5,90,160, 90, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
hrot = CreateWindow("button", "100",_
BS_AUTORADIOBUTTON or WS_VISIBLE or WS_CHILD or WS_GROUP,_
10, 110, 70,20, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
hblau = CreateWindow("button", "10",_
BS_AUTORADIOBUTTON or WS_VISIBLE or WS_CHILD,_
10, 130, 70,20, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
hgruen = CreateWindow("button", "1",_
BS_AUTORADIOBUTTON or WS_VISIBLE or WS_CHILD,_
10, 150, 70,20, hWnd, NULL,_
cast(LPCREATESTRUCT,lParam)->hInstance,NULL)
SendMessage hrot, BM_SETCHECK, BST_CHECKED, 0
return 0
end select
return DefWindowProc( hWnd, message, wParam, lParam )
end Function |
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 02.02.2010, 22:45 Titel: |
|
|
Ein Button ist ein Unterfenster des eigentlichen Fensters.
Der FB-Screen, den du erstellst, hat die Eigenschaft, dass du keine Windowsbuttons draufkleben kannst. Du musst also das komplette Fenster selbst erstellen. |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 02.02.2010, 22:54 Titel: |
|
|
Copy and Paste at it highest (oder so ähnlich)
Mach dich doch mal am besten ersteinmal mit den Konzepten von Fenstern, Fensterprozeduren, Fensterklassen, Fensterstile und Fenstereigenschaften vertraut. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 07.02.2010, 20:47 Titel: |
|
|
Es gibt ja die Möglichkeit mit der Texteingabe. Benutzer gibt zum Beispiel einen x-beliebigen Text ein. Begrenzt auf z. Bsp. auf 10 Zeichen. Ich glaube ich habe vor kurzem schon mal was im Internet gefunden. Weiß aber nicht mehr wo. Suche hat mir nicht viel geholfen.
Müsste mit WinAPI gehen. Werde aber noch mal überall suchen.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 07.02.2010, 21:11 Titel: |
|
|
Sowas heist Edit und wird wenn ich mich nicht täusche so erzeugt:
Code: | CreateWindow("EDIT","",WS_CHILD or VS_VISIBLE or ES_LEFT,0,0,100,25,hwnd,0,hInstance,0) |
|
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 07.02.2010, 21:24 Titel: |
|
|
Stueber hat Folgendes geschrieben: | Sowas heist Edit und wird wenn ich mich nicht täusche so erzeugt:
Code: | CreateWindow("EDIT","",WS_CHILD or VS_VISIBLE or ES_LEFT,0,0,100,25,hwnd,0,hInstance,0) |
|
Bei mir funktioniert der Code nicht. Oder besser gesagt nicht so wie ich will. Hmm?
Code: | CreateWindow("COMBOBOX","",WS_CHILD or VS_VISIBLE or ES_LEFT,0,0,100,25,hwnd,NULL,hInstance,NULL) |
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 07.02.2010, 21:31 Titel: |
|
|
Also nochmal, WinAPI Fensterelemente lassen sich nicht auf FreeBASIC-Screens anwenden. Die Funktion funktioniert deswegen nicht, weil es ein Kind-Fenster (Childwindow) für das Hauptfenster erzeugt. Zu erkennen am "WS_CHILD".
Erstell erstmal ein Parentwindow und darauf kannst du dann die Funktion anwenden.
Also: WinAPI-Tutorial durcharbeiten und versuchen zu verstehen und nicht nur Copy&Paste. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 07.02.2010, 21:43 Titel: |
|
|
@MOD:
Mir geht es nur um ein Eingabefeld für Texte/Buchstaben. Begrenzt auf x-Zeichen. Combobox erzeugt schon mal das was ich haben will. Nur kann ich keine Buchstaben eingeben.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 07.02.2010, 21:46 Titel: |
|
|
Wenn es nur sowas ist, dann schreib dir doch deine eigene Inkey-Routine, die ab einer bestimmten Länge dicht macht. Das ist nicht sonderlich schwer. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 08.02.2010, 17:18 Titel: |
|
|
Code: | #Include "windows.bi"
Dim As MSG msg
Dim As HWND hWnd, btn1, edt1
' Create window
hWnd = CreateWindowEx( 0, "#32770", "Hello", WS_OVERLAPPEDWINDOW Or WS_VISIBLE, 100, 100, 500, 300, 0, 0, 0, 0 )
' Create button
btn1 = CreateWindowEx( 0, "BUTTON", "Button #1", WS_VISIBLE Or WS_CHILD, 20, 10, 100, 30, hWnd, 0, 0, 0 )
' Create edit box
edt1 = CreateWindowEx( 0, "EDIT", "Type text here...", ws_border Or WS_VISIBLE Or WS_CHILD Or WS_HSCROLL Or WS_VSCROLL Or ES_AUTOHSCROLL Or ES_AUTOVSCROLL Or ES_MULTILINE, 20, 50, 200, 100, hWnd, 0, 0, 0 )
While GetMessage( @msg, 0, 0, 0 )
TranslateMessage( @msg )
DispatchMessage( @msg )
Select Case msg.hwnd
Case hWnd
Select Case msg.message
Case 273
End
' If left mouse button was pressed in window area then
' check if is edit box text = "". If it is then set
' the edit box text to "Type text here" and set focus
' to the window
Case WM_LBUTTONDOWN
Dim As Zstring*1024 txt
GetWindowText( edt1, txt, SizeOf( txt ) )
If txt = "" Then SetWindowText( edt1, "Type text here..." )
SetFocus( hWnd ) ' Set focus to the window
Case Else
' Create rect variable and store window size in it
Dim As RECT rct: GetClientRect( hWnd, @rct )
' Resize the edit box
MoveWindow( edt1, 20, 50, rct.right-40, rct.bottom-60, TRUE )
End Select
Case btn1
Select Case msg.message
' If left mouse button was pressed in button area then
' check if is edit box text = "". If it is then set
' the edit box text to "Type text here"
Case WM_LBUTTONDOWN
' When button is pressed set the text
' of button to "pressed"
SetWindowText( btn1, "Clicked!" )
Dim As Zstring*1024 txt
GetWindowText( edt1, txt, SizeOf( txt ) )
If txt = "" Then SetWindowText( edt1, "Type text here..." )
' If left mouse button was released from the button area
' then set the button text to "Button #1" and show
' massage box with text from text box
Case WM_LBUTTONUP
SetWindowText( btn1, "Button #1" )
Dim As Zstring*1024 txt
GetWindowText( edt1, txt, SizeOf( txt ) )
MessageBox( hWnd, txt, "Hello", MB_OK )
End Select
Case edt1
Select Case msg.message
' When textbox was pressed then clar the textbox text if
' text = "Type text here..."
Case WM_LBUTTONDOWN
Dim As Zstring*1024 txt
GetWindowText( edt1, txt, SizeOf( txt ) )
If txt = "Type text here..." Then SetWindowText( edt1, "" )
End Select
End Select
Wend |
Habe im Internet einen Quellcode gefunden, wo so eine Editbox drin. Das ist genau das, was ich für mein Programm brauche. Man muss nur lange genug suchen!
Quellcode funktioniert, habe ihn getestet.
Mit freundlichen Grüßen
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 08.02.2010, 17:21 Titel: |
|
|
Ich möcht ja nix sagen, aber da wird genau das gemacht, was ich dir die ganze Zeit prädige, da wird nämlich erst ein eigenes WinAPI-Fenster erstellt und dann erst der Button draufgelegt...ich gebs auf... |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 08.02.2010, 22:17 Titel: |
|
|
Wer ALWIM schon seit längerer Zeit beobachtet, weiß, dass er ganz gerne einfach nicht zuhört. |
|
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.
|
|