Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

02.04.2011, 08:20

FileDialog öffnen mit C++ Win32 (also das was schon standardmäßig dabei ist)

HI, wie kann ich einen FileDialog öffnen, folgender Code funktioniert bei mir nicht

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
*   All the Code is written by Kevin Riehl alias Developer_X
*   Copyright 2011
*/

#include <windows.h>
#include <string.h>
#include <iostream>

using namespace std;

string openfilename(char *filter = "All Files (*.*)\0*.*\0", HWND owner = NULL)
{
    OPENFILENAMEW ofn;
    char fileName[MAX_PATH] = "";
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;  ofn.lpstrDefExt = "";
    string fileNameStr;
    if ( GetOpenFileName(&ofn) )
        fileNameStr = fileName;
    return fileNameStr;
}
int main()
{
  cout << openfilename().c_str() << endl;

    return 0;
}


Fehlermeldung :

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'std::string openfilename(char*, HWND__*)':|
F:\C++ Projekte\Diagramm Maker\main.cpp|28|error: 'OPENFILENAMEW' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|28|error: expected ';' before 'ofn'|
F:\C++ Projekte\Diagramm Maker\main.cpp|30|error: 'ofn' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|31|error: 'OPENFILENAME' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|36|error: 'OFN_EXPLORER' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|36|error: 'OFN_FILEMUSTEXIST' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|36|error: 'OFN_HIDEREADONLY' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp|38|error: 'GetOpenFileName' was not declared in this scope|
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'int main()':|
F:\C++ Projekte\Diagramm Maker\main.cpp|44|warning: deprecated conversion from string constant to 'char*'|
||=== Build finished: 8 errors, 1 warnings ===|


Was kann ich machen, um den code zu verrichtigen, oder wie soll ich die Sache angehen, ich will einen FileDialog, bei dem man sich eine Datei sucht,
und dann den Pfad bekommt, in string oder c_string. Wichtig wäre mir auch noch entscheiden zu können, wo man bei der Dateisuche beginnt, z.B. auf dem Desktop,
versteht ihr?

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

GameProggD3D

Frischling

Beiträge: 67

Wohnort: Walding

Beruf: Schüler

  • Private Nachricht senden

2

02.04.2011, 09:05

Du hast anscheinend Probleme mit dem Sichtbarkeitsbereich:
'OPENFILENAMEW' was not declared in this scope

Der Compiler kennt anscheinend keinen OPENFILENAMEW.Dadurch kommt auch das:
'ofn' was not declared in this scope
Programmiere Zombie-Spiel mit nem Freund

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

02.04.2011, 09:25

Ja das weiß ich auch, was kann ich tun, damit das endlich funktioniert?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

02.04.2011, 11:03

Offenbar verwendest du ja einen anderen Compiler als MSVC. Darum mal die Frage: Sind deine Windows Header die du da hast up to date? Kann es sein dass du bei deinen Headern noch irgend ein #define setzen musst damit die Funktionen die es erst ab Windows 2000 gibt aktiviert werden?

Generell vielleicht noch der Hinweis: Wenn du nicht explizit mit OPENFILENAMEA usw. arbeitest solltest du TCHAR statt char verwenden.

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

5

02.04.2011, 13:35

Die Makros WIN32_LEAN_AND_MEAN und NOGDI dürfen NICHT definiert sein, dann bindet der commdlg.h automatisch ein, in welcher die gewünschten Funktionen beinhaltet sind.

Includier mal zusätzlich die commdlg.h nach dem Windows-Header, ist zwar nicht die sauberste Lösung, aber anscheinend macht der das nicht von alleine bei dir.

Mfg Rushh0ur

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

6

02.04.2011, 14:07

danke für den Tipp mit dem include, ich habe aber immer noch ein Problem :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string openfilename(char *filter = "All Files (*.*)\0*.*\0", HWND owner = NULL)
{
    OPENFILENAMEW ofn;
    char fileName[MAX_PATH] = "";
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;  ofn.lpstrDefExt = "";
    string fileNameStr;
    if ( GetOpenFileName(&ofn) )
        fileNameStr = fileName;
    return fileNameStr;
}


Es kommen wieder Fehlermeldungen, und ich weiß nicht, was WChar und so ist, kann mir einer sagen was ich noch ändern muss, danke, ich kenne mich nicht mit der API davon aus :(

Quellcode

1
2
3
4
5
6
7
8
9
10
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'std::string openfilename(char*, HWND__*)':|
F:\C++ Projekte\Diagramm Maker\main.cpp|30|error: int-array initialized from non-wide string|
F:\C++ Projekte\Diagramm Maker\main.cpp|34|error: cannot convert 'char*' to 'const WCHAR*' in assignment|
F:\C++ Projekte\Diagramm Maker\main.cpp|37|error: cannot convert 'const char [1]' to 'const WCHAR*' in assignment|
F:\C++ Projekte\Diagramm Maker\main.cpp|39|error: cannot convert 'OPENFILENAMEW*' to 'tagOFNA*' for argument '1' to 'BOOL GetOpenFileNameA(tagOFNA*)'|
F:\C++ Projekte\Diagramm Maker\main.cpp|40|error: invalid conversion from 'WCHAR*' to 'char'|
F:\C++ Projekte\Diagramm Maker\main.cpp|40|error:   initializing argument 1 of 'std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]'|
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'int main()':|
F:\C++ Projekte\Diagramm Maker\main.cpp|45|warning: deprecated conversion from string constant to 'char*'|
||=== Build finished: 6 errors, 1 warnings ===|

m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

02.04.2011, 14:10

Du verwendest OPENFILENAMEW zusammen mit char strings, das kann natürlich nicht funktionieren. Wie oben schon erwähnt, wenn du eine explizite Variante verwendest (*A bzw. *W) dann musst du auch die expliziten Charactertypen dazu verwenden, in dem Fall also wchar_t....

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

8

02.04.2011, 14:17

Ich habe eine kleine Änderung vorgenommen, und jetzt klappt das viel besser. Es gibt aber immer noch ein Problem :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string openfilename(char *filter = "All Files (*.*)\0*.*\0", HWND owner = NULL)
{
    OPENFILENAME ofn;
    char fileName[MAX_PATH] = "";
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;  ofn.lpstrDefExt = "";
    string fileNameStr;
    if (GetOpenFileName(ofn))
        fileNameStr = fileName;
    return fileNameStr;
}

Quellcode

1
2
3
4
5
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'std::string openfilename(char*, HWND__*)':|
F:\C++ Projekte\Diagramm Maker\main.cpp|39|error: cannot convert 'OPENFILENAME' to 'tagOFNA*' for argument '1' to 'BOOL GetOpenFileNameA(tagOFNA*)'|
F:\C++ Projekte\Diagramm Maker\main.cpp||In function 'int main()':|
F:\C++ Projekte\Diagramm Maker\main.cpp|45|warning: deprecated conversion from string constant to 'char*'|
||=== Build finished: 1 errors, 1 warnings ===|


Ihr müsst euch vorstellen, wie es wäre, wenn ihr überhaupt nicht verstehen würdet, was die Fehlermeldung soll, versteht ihr?
Bitte, sagt mir was ich noch machen soll, der hat einmal ein Problem bei der Parameterübergabe von OPENFILENAME und einmal bei der "Conversion" von einem string to char*.
Was soll ich noch ändern?

Bitte zeigt mir den richtigen Code.

M.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

9

02.04.2011, 14:32

Also mit Genörgel und Gedrängel kommst du hier bestimmt nicht viel weiter!
Vermutlich hat es auch nichts mit "dem richtigen Code" zu tun, sondern mit der Konfiguration (Zeichensatz usw.) deines Projekts,
der richtigen Verwendung (und Verständnis) von Datentypen usw. usf..
fka tm

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

02.04.2011, 14:48

Die Funktion GetOpenFileName() will einen Pointer...mit der Variante oben hast du jetzt aber wieder das Problem mit ANSI vs. UNICODE. Wenn du unbedingt mit char arbeiten willst dann machs so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string openfilename(char *filter = "All Files (*.*)\0*.*\0", HWND owner = NULL)
{
    OPENFILENAMEA ofn;
    char fileName[MAX_PATH] = "";
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = owner;
    ofn.lpstrFilter = filter;
    ofn.lpstrFile = fileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;  ofn.lpstrDefExt = "";
    string fileNameStr;
    if (GetOpenFileNameA(&ofn))
        fileNameStr = fileName;
    return fileNameStr;
}

Werbeanzeige