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

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 30.07.2007, 15:43 Titel: [Ressourcen/WinAPI|GELÖST] Textfeld auslesen... |
|
|
Joahr.
Man hat in einem Ressourcen Skript ein Textfeld definiert. Jetzt will man mit einem Code: | GetWindowText (???, Usr, GetWindowTextLength(???)) | Den Inhalt auslesen, doch woher bekommt man den Windowhandle? findwindow geht da ja net....  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 31.07.2007, 12:37, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 30.07.2007, 15:50 Titel: |
|
|
Hehe, das Problem hatte Max06 letztens im IRC auch, ich habs net lösen können...
Ich habs probiert indem ich darin einen Text stehen lassen hab und dann das Handle per FindWindow gesucht hab
...hat leider nicht ganz geklappt
Gibt garantiert auch dafür ne API... unter XProfan gabs auch einen Befehl, aber um Verwirrung zu vermeiden lass ich das mal lieber  |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 30.07.2007, 16:00 Titel: Re: [Ressourcen/WinAPI] hWnd von einem Textfeld beschaffen.. |
|
|
csderats hat Folgendes geschrieben: | Joahr.
Man hat in einem Ressourcen Skript ein Textfeld definiert. Jetzt will man mit einem Code: | GetWindowText (???, Usr, GetWindowTextLength(???)) | Den Inhalt auslesen, doch woher bekommt man den Windowhandle? findwindow geht da ja net....  |
Das wird beim erstellen des Editfeldes gleich beim Erstellen zugewiesen.
Code: |
hEdit = CreateWindow(...)
GetDlgItemText( hEdit, IDC_EDIT1, chk_pswd, sizeof(chk_pswd)-1); |
( ist jetzt C-Syntax) |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 30.07.2007, 16:24 Titel: |
|
|
JA.
Ich habe aber _kein_ hEdit. Ich habe da auh nirgendwo was alla CreateWindow/CreateWindowEx
Alles mit den FBedit internen resse editorgemacht.
und ein
Code: | Usr = GetDlgItemText( NULL, Login3, Usr, Len(Usr)-1) |
ist Invalid assignment/conversion in 'Usr = GetDlgItemText( NULL, Login3, Usr, Len(Usr)-1)'  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 30.07.2007, 16:26 Titel: |
|
|
Wenn Du ein hWnd hast, gibts auch ein Fenster dazu.
Wie haste denn das Editfeld erstellt? Soweit ich weiß, geht das nur mit DialogBox(), CreateDialog() oder CreateWindow(), und die liefern (bei Erfolg) das Handle zurück. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 30.07.2007, 16:29 Titel: |
|
|
Code: | Login DIALOGEX 6,6,216,85
CAPTION "ICiv - Login"
FONT 8,"MS Sans Serif",400,0
STYLE WS_CAPTION|WS_VISIBLE|WS_SYSMENU|WS_GROUP|DS_CENTER
BEGIN
CONTROL "Username:",Login1,"Static",WS_CHILD|WS_VISIBLE,13,18,74,9
CONTROL "Passwort:",Login2,"Static",WS_CHILD|WS_VISIBLE,13,43,77,9
CONTROL "",Login3,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP,96,15,110,12,WS_EX_CLIENTEDGE
CONTROL "",Login4,"Edit",WS_CHILD|WS_VISIBLE|WS_TABSTOP|ES_PASSWORD,96,40,110,12,WS_EX_CLIENTEDGE
CONTROL "OK",Login5,"Button",WS_CHILD|WS_VISIBLE|WS_TABSTOP,80,64,57,16
END | Ein
Code: | DialogBoxParam(GetModuleHandle(NULL), Cast(zstring ptr,Login), NULL, @LoginProc, NULL) | Macht den ganzen dialog und alle controls. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 30.07.2007, 16:45 Titel: |
|
|
Ja, das ist das Ressourcen-Script. Wie wird das denn im Quelltext aufgerufen? |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 30.07.2007, 17:35 Titel: |
|
|
Code: | #include once "windows.bi"
#include once "inc/cryptlib.bi"
#include once "win/commctrl.bi"
#include "ICiv.bi"
declare function LoginProc(byval hWnd as HWND, byval uMsg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) as integer
Declare function MainProc(byval hWin as HWND,byval uMsg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as integer
Declare function PrefProc(byval hDlg as HWND,byval uMsg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as bool
dim SHARED hInstance as HINSTANCE
hInstance = GetModuleHandle(NULL)
'''
''' Program start
'''
''
'' Create the Dialog
''
DialogBoxParam(GetModuleHandle(NULL), Cast(zstring ptr,Login), NULL, @LoginProc, NULL)
'DialogBoxParam(hInstance, Cast(ZString Ptr, Main), NULL, @MainProc, NULL)
'DialogBoxParam(hInstance, Cast(ZString Ptr, Preferences), NULL, @PrefProc, NULL)
''
'' Program has ended
''
ExitProcess(0)
end
'''
''' Program end
'''
function LoginProc(byval hWin as HWND,byval uMsg as UINT,byval wParam as WPARAM,byval lParam as LPARAM) as integer
dim as long id, event, x, y
dim hBtn as HWND
Dim As HWND hUsr, hPW
dim rect as RECT
Dim As String PW, Usr
select case uMsg
case WM_INITDIALOG
'
case WM_CLOSE
EndDialog(hWin, 0)
'
case WM_COMMAND
id=loword(wParam)
event=hiword(wParam)
select case id
case Login5
EndDialog(hWin, 0)
hUsr=GetDlgItem(hWin,Login3)
hPW=GetDlgItem(hWin,Login4)
GetDlgItemText( hUsr, Login3, Usr, len(Usr)-1)
'GetWindowText (Login4, PW, GetWindowTextLength(Login4))
If Usr = "csde_rats" Then
'If *PW = "123" then
DialogBoxParam(hInstance, Cast(ZString Ptr, Main), NULL, @MainProc, NULL)
'End if
End if
'
end select
case WM_SIZE
GetClientRect(hWin,@rect)
hBtn=GetDlgItem(hWin,Login5)
x=rect.right-100
y=rect.bottom-35
MoveWindow(hBtn,x,y,97,31,TRUE)
'
case else
return FALSE
'
end select
return TRUE
end function |
Wenn ich da auf "OK" klicke: ICiv.exe hat ein Problem festgestellt und muss beendet werden  _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 30.07.2007, 19:00 Titel: |
|
|
Also, wie schon gesagt: Einen Dialog erstellt man mit CreateDialog oder (in Deinem Fall wohl eher angebracht) mit DialogBox. Der Rückgabewert ist das Handle des Dialogfensters. In der zugehörigen Dialogprozedur müssen bei WM_INITDIALOG die verschiedenen Elemente des Dialogs initialisiert werden, d. h., da wird für das Editfeld die ID zugewiesen. Fensterhandle und ID des Editfeldes werden dann in GetDlgItemText abgefragt.
Hier ein Beispiel, allerdings in C: http://pronix.linuxdelta.de/C/win32/win32_5.shtml
(Leider gibt es solche Tutorials noch nicht in FB, wäre mal ne Aufgabe für einen fleißigen Progger... ). |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.07.2007, 08:58 Titel: |
|
|
Aufruf des Dialogs:
Code: |
case ID_EDITFELD: 'Erstellen des Dialogs
DialogBox( hInst,
MAKEINTRESOURCE(IDR_TEXTDIALOG),
hWnd,
(DLGPROC)CheckEditProc );
break;
|
In diesem Fall wird der Dialog in einem Menü aufgerufen (ID_EDITFELD). Du kannst ihn natürlich direct bei WM_CREATE des Hauptfensters erstellen.
Ich hoffe, Du kennst Dich mit MAKEINTRESSOURCE aus.
In der Dialogprozedur steht dann folgendes:
Code: | switch( uMsg )
{
'Beim Initialisieren mit bestimmten Werten besehen
case WM_INITDIALOG :
SetDlgItemText( hDlg, IDC_EDIT1, "passwort");
SetDlgItemInt ( hDlg, IDC_EDIT2, 12345, TRUE);
break;
'die Eingabefelder auswerten
case WM_COMMAND :
(...)
|
Wie gesagt, es ist C-Syntax. Aber so furchtbar groß sind die Unterschiede in dem Fall nicht, es sind alles nur API-Aufrufe.
Das switch ist das C-Pendant zur select-case-Anweisung in Basic. |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 31.07.2007, 12:23 Titel: |
|
|
Zitat: | DialogBoxParam(hInstance, Cast(ZString Ptr, Main), NULL, @MainProc, NULL) | In das fett hinterlegte NULL wird also der hWnd des Fensters geschrieben... ok.
MAKEINTRESSOURCE? Hmmm noch nie von gehört
Ahh
Code: | SetDlgItemText(hWin, Login3, "passwort") | setzt schonmal den Text *thumbup*
edit:
Hmm.
Wenn ich es so mache: Code: | hUsr=GetDlgItem(hWin,Login3)
hPW=GetDlgItem(hWin,Login4)
GetDlgItemText(hUsr, Login3, Usr, 30 )
GetDlgItemText(hPW, Login4, PW, 30) | Stürzt es ab (ICiv hat ein Problem festgestellt....).
So liest er nichts: Code: | GetDlgItemText(hWin, Login3, Usr, 30 )
GetDlgItemText(hWin, Login4, PW, 30) | Was für Strings müssen Usr und PW eigtl. sein? Normaler (jetzt der Fall), ZString oder WString?
nochma edit:
Code: | Dim As ZString * 31 PW, Usr
GetDlgItemText(hWin, Login3, Usr, 30 )
GetDlgItemText(hWin, Login4, PW, 30) |
ES FUNKTIONIERT!!!!
EInfach EIN Zeichen größer dimmen *thumbup*
und schon stürzt es nicht mehr ab *freu* _________________ If hilfreicher_Beitrag then klick(location.here)
Klick
Zuletzt bearbeitet von csde_rats am 31.07.2007, 12:39, insgesamt 2-mal bearbeitet |
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.07.2007, 12:34 Titel: |
|
|
MAKEINTRESSOURCE (Make Int (to) Ressource) ist ein Makro, mit dem die ID einer Ressource in den zugehörigen Integerwert umgewandelt wird. Vereinfacht das Einbinden der Ressourcen im Quelltext.
Die Strings können normale Strings sein. Z- oder W- ist unnötig.
Zuletzt bearbeitet von Elektronix am 31.07.2007, 12:41, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
|
Nach oben |
|
 |
Elektronix
Anmeldungsdatum: 29.06.2006 Beiträge: 742
|
Verfasst am: 31.07.2007, 12:44 Titel: |
|
|
Gern geschehen. Was länge gährt, wird endlich.... nee, irgendwie falsch...  |
|
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.
|
|