Durchsuchen Button
lima-city → Forum → Programmiersprachen → C/C++ und D
anzeigen
break
button
code
datei
dialog
durchsuchen
fenster
flag
funktion
http
null
output
pfad
speichern
switch
text
textfeld
url
windows
-
Ich such schon einige Zeit nach diesem klassischen Durchsuchen Button, der wenn man draufklickt ein Fenster öffnet indem man eine Datei auswählen kann und der Pfad dann in einer Editbox steht...
Greets -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo portal715,
im Allgemeinen wirst Du Dir sowas selber basteln müssen.
Dazu brauchst Du ein Textfeld, einen Button mit "..." als Beschriftung, den Du neben dem Textfeld positionierst und natürlich den Datei-Öffnen-Dialog.
Wenn auf den Button geklickt wird, dann musst Du den Datei-Öffnen-Dialog (als modalen Dialog) anzeigen und wenn der Benutzer auf 'Öffnen' geklickt hat, dann musst Du den Pfad in das Textfeld eintragen.
Je nachdem womit Du programmierst kannst Du daraus ja ein Widget machen, das Du dann wiederverwenden kannst. -
hmm, gibt es das nicht schon vorgefertigt, es wird ja überall gebraucht. siehe installationen downloads undso
-
Zumindest für Windows gibt es das als Dialogfenster, wie man es von Java her kennt:
openFileDialog
Für Linux muss man sich das wahrscheinlich selbst zusammenbasteln, da hier eigentlich die Konsolenanwendung im Vordergrund steht. -
Hallo portal715,
wenn Du uns verraten würdest, womit Du Deine GUI programmierst (Qt, wxWidgets, MFC, FLTK, Win32 API, ...), dann könnte man ja schauen, ob es da sowas schon gibt. Aber wie schon gesagt, im Allgemeinen muss man sowas selber machen.
Den Datei-Öffnen-Dialog gibt es natürlich überall schon vorgefertigt. -
Achso, sry voll vergessen :)
Ich fang erst gerade an die ganzen Steuerelemente zu lernen und ich dacht mir als kleine Übung könnt ich ja einen Durchsuchen Button machen mit einer Editbox in der der Pfad dann steht, dann hab ich eben nix gefunden bzw ich bin mit der ganzen Sucherei noch nicht ganz vertraut was die Suche am Anfang natürlich erschwert und darum dacht ich ich frag mal euch :)
Vllt hilft euch das weiter:
C++/WinAPI
Wie schon gesagt ich kenn mich damit noch nicht wirklich aus, bin noch am Testen und Lesen :), leider lässt mich in diesem Fall mein Buch im Stich...
Beitrag zuletzt geändert: 27.2.2011 1:07:14 von portal715 -
Hallo portal715,
in der Windows API gibt es sowas leider nicht.
Zum Anzeigen eines Datei-Öffnen-Dialoges kannst Du die Funktion GetOpenFilename() verwenden. Ein Beispiel dazu findest Du hier.
Das Textfeld und den Button musst Du mit CreateWindowEx() erstellen. Z.B. so:
HWND hEdit, hButton; hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE , 0, 0, 100, 20, hwnd, 0, GetModuleHandle(NULL), NULL); hButton = CreateWindow( "Button","...", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE , 100,0,20,20,hwnd,(HMENU)ID_BUTTON,GetModuleHandle(NULL),0);
hwnd ist der Handle Deines Fensters und ID_BUTTON musst Du vorher irgendwo definieren (z.B. #define ID_BUTTON 200).
Wenn Du in Deiner Window-Callback-Funktion eine WM_COMMAND-Message mit wParam == ID_BUTTON bekommst, dann musst Du den Dialog anzeigen.
Den Text des Textfeldes kannst Du dann mit Edit_SetText(hEdit, "<Pfad>") setzen.
Als kleine Einstiegshilfe kannst Du Dir mal das hier anschauen: http://www.winprog.org/tutorial/
Und eine Übersicht über alle Controls findest Du hier: http://msdn.microsoft.com/en-us/library/bb773169(v=VS.85).aspx
Edit:
Ich habe ein kleines Beispiel gebastelt:
file_edit.h:
#ifndef _FILE_EDIT_H_ #define _FILE_EDIT_H_ #include <windows.h> class FileEdit { private: HWND h_panel; HWND h_edit; HWND h_button; FileEdit(const FileEdit& fe); ~FileEdit(); static LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); void onSize(int width, int height); void onButton(); public: FileEdit(HWND parent); const char * getText(); void setText(const char * text); void setPosition(int x, int y); void setSize(int width, int height); }; #endif // _FILE_EDIT_H_
file_edit.cpp:
#include "file_edit.h" #include <vector> static ATOM class_id = 0; static std::vector<FileEdit*> instances; static const unsigned long ID_BUTTON = 200; FileEdit::~FileEdit() { for(unsigned long i = 0; i<instances.size();i++) { if(instances[i] == this) { instances.erase(instances.begin()+i); break; } } } LRESULT CALLBACK FileEdit::wnd_proc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { unsigned long idx; FileEdit * fe=NULL; for(idx = 0; idx<instances.size();idx++) { if(instances[idx]->h_panel == hwnd) { fe = instances[idx]; break; } } if(!fe) return DefWindowProc(hwnd, msg, w_param, l_param); switch(msg) { case WM_SIZE: if(w_param != SIZE_MINIMIZED) fe->onSize((int)LOWORD(l_param),(int)HIWORD(l_param)); return 0; break; case WM_COMMAND: if(w_param == ID_BUTTON) fe->onButton(); return 0; break; case WM_DESTROY: delete fe; return 0; break; default: return DefWindowProc(hwnd, msg, w_param, l_param); } } void FileEdit::onSize(int width, int height) { MoveWindow(h_edit,0,0,width-21,height,TRUE); MoveWindow(h_button,width-20,0,20,height,TRUE); } void FileEdit::onButton() { OPENFILENAME ofn; char path[MAX_PATH]; memset(&ofn, 0, sizeof(OPENFILENAME)); path[0]=0; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = h_panel; ofn.lpstrFile = path; ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = "All\0*.*\0"; ofn.nFilterIndex = 1; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn) == TRUE) SetWindowText(h_edit, path); } FileEdit::FileEdit(HWND parent): h_panel(NULL), h_edit(NULL), h_button(NULL) { HINSTANCE h_inst = GetModuleHandle(NULL); if(!class_id) { WNDCLASSEX wndcl; wndcl.hInstance = h_inst; wndcl.lpszClassName = "file_edit"; wndcl.lpfnWndProc = FileEdit::wnd_proc; wndcl.style = 0; wndcl.cbSize = sizeof(WNDCLASSEX); wndcl.hIcon = NULL; wndcl.hIconSm = NULL; wndcl.hCursor = NULL; wndcl.lpszMenuName = NULL; wndcl.cbClsExtra = 0; wndcl.cbWndExtra = 0; wndcl.hbrBackground = (HBRUSH)COLOR_BACKGROUND; class_id = RegisterClassEx(&wndcl); } h_panel = CreateWindow( "file_edit", "", WS_VISIBLE|WS_CHILD, 0, 0, 100, 20, parent, NULL, h_inst, NULL); h_edit = CreateWindowEx( WS_EX_CLIENTEDGE, "Edit", "", WS_VISIBLE|WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, h_panel, NULL, h_inst, NULL); h_button = CreateWindow( "Button", "...", BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, h_panel, (HMENU)ID_BUTTON, h_inst, NULL); instances.push_back(this); } const char * FileEdit::getText() { static char path[MAX_PATH]; if(GetWindowText(h_edit, path, MAX_PATH)) return path; else return ""; } void FileEdit::setText(const char * text) { SetWindowText(h_edit, text); } void FileEdit::setPosition(int x, int y) { RECT rect; GetWindowRect(h_panel, &rect); MoveWindow(h_panel, x, y, rect.right-rect.left, rect.bottom-rect.top, TRUE); } void FileEdit::setSize(int width, int height) { RECT rect; GetWindowRect(h_panel, &rect); ScreenToClient(GetParent(h_panel), (LPPOINT)&rect.left); ScreenToClient(GetParent(h_panel), (LPPOINT)&rect.right); MoveWindow(h_panel, rect.left, rect.top, width, height, TRUE); }
main.cpp
#include <windows.h> #include "file_edit.h" static LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param) { switch (msg) { case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc(hwnd, msg, w_param, l_param); } return 0; } int WINAPI WinMain (HINSTANCE h_inst, HINSTANCE h_prev_inst,LPSTR cmd_line, int cmd_show) { HWND hwnd; MSG msg; WNDCLASSEX wndcl; wndcl.hInstance = h_inst; wndcl.lpszClassName = "main_window"; wndcl.lpfnWndProc = wnd_proc; wndcl.style = 0; wndcl.cbSize = sizeof(WNDCLASSEX); wndcl.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndcl.hIconSm = LoadIcon (NULL, IDI_APPLICATION); wndcl.hCursor = LoadCursor (NULL, IDC_ARROW); wndcl.lpszMenuName = NULL; wndcl.cbClsExtra = 0; wndcl.cbWndExtra = 0; wndcl.hbrBackground = (HBRUSH)COLOR_BACKGROUND; if (!RegisterClassEx (&wndcl)) { MessageBox(NULL, "Error registering class 'main_window'.","Error",MB_OK|MB_ICONERROR); return 1; } hwnd = CreateWindow( "main_window", "FileEdit Test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 400, NULL, NULL, h_inst, NULL); if(!hwnd) { MessageBox(NULL, "Error createing main window.","Error",MB_OK|MB_ICONERROR); return 1; } FileEdit * fe = new FileEdit(hwnd); fe->setPosition(0,0); fe->setSize(300,20); fe = new FileEdit(hwnd); fe->setPosition(0,22); fe->setSize(300,20); fe = new FileEdit(hwnd); fe->setPosition(0,44); fe->setSize(300,20); ShowWindow (hwnd, cmd_show); while(GetMessage (&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; }
Beim linken musst Du auch comdlg32.lib (VC++) bzw. libcomdlg32.a (gcc) einbinden.
Edit 2: Ich hatte WM_DESTROY vergessen.
Beitrag zuletzt geändert: 27.2.2011 15:01:46 von darkpandemic -
Hey darkpandemic,
so in etwa? Es fehlen eben noch die genauen Einstellungen.
case WM_COMMAND: { switch (wParam) { // Wurde "Durchsuchen" angeklickt? case ID_BTN_DURCHSUCHEN: { //GetOpenFilename() Edit_SetText(hEdit, "<Pfad>") } } }
Ich hab solange etwas weitergebastelt und noch ein Problem.
Ich möchte den Pfad der Datei später in einer Datei speichern, da der Pfad aber ein Array ist habe ich ein wenig den Durchblick verloren...
switch (wParam) { // Wurde "Save" angeklickt? case ID_BTN_SAVE: { char szText[256]; // Text aus der Editbox holen GetWindowText (hEditBox, szText, 256); MessageBox ( NULL, szText, "Info", MB_OK); // Pfad in eine Datei speichern ofstream Output ("Path.cfg", ios::trunc); Output.write ((char*) &szText[256], sizeof (szText[256])); Output.close ();
die msgbox ist nur zur Überprüfung des Arrays drin.
Die Funktion soll den Pfad als erstes in das char Array szText schreiben und dann eben in die Datei "Path.cfg"
Greets
-
Hallo portal715,
ich habe ja oben noch ein funktionierendes Beispiel hineditiert.
In der Window-Callback muss ungefähr Folgendes stehen:
switch(msg) { // ... case WM_COMMAND: switch(wParam) { case ID_BTN_DURCHSUCHEN: { OPENFILENAME ofn; char path[MAX_PATH]; memset(&ofn, 0, sizeof(OPENFILENAME)); path[0]=0; ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFile = path; ofn.nMaxFile = MAX_PATH; ofn.lpstrFilter = "All\0*.*\0"; ofn.nFilterIndex = 1; ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; if(GetOpenFileName(&ofn) == TRUE) Edit_SetText(hEdit, path); // falls Edit_SetText() unbekannt ist, dann SetWindowText(hEdit, path) return 0; } case ID_BTN_SAVE: { char path[MAX_PATH]; GetWindowText(hEdit, path, MAX_PATH); ofstream Output ("Path.cfg", ios::trunc); Output << path; Output.close(); return 0; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } //... }
Beitrag zuletzt geändert: 27.2.2011 18:11:39 von darkpandemic -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage