speichern unter...



  • Hi.
    Ich hab von WinAPI egtl keine Ahnung muss aber dennoch ein Programm proggen, in dem man den Speichern Dialog aufruft. Nun weiß ich nicht wie da der Befehl zu lautet



  • Fredi schrieb:

    Hi.
    Ich hab von WinAPI egtl keine Ahnung muss aber dennoch ein Programm proggen, in dem man den Speichern Dialog aufruft. Nun weiß ich nicht wie da der Befehl zu lautet

    LoL, wer gibt denn solche Aufgaben ? 😕

    Also du brauchst die Struktur OPENFILENAME (MSDN-LINK) und die Funktion GetSaveFileName() (MSDN-LINK)

    😉



  • Ich weiß zwar nicht ob man das darf so einen Link zu posten, aber ich tue das jetzt erstmal:

    [url]
    http://www.winapi.net/index.php?inhalt=s26
    [/url]



  • -=Chris=- schrieb:

    Ich weiß zwar nicht ob man das darf so einen Link zu posten, aber ich tue das jetzt erstmal:

    [url]
    http://www.winapi.net/index.php?inhalt=s26
    [/url]

    Du darfst. 😉



  • Wenn ich das so einbaue erhalte ich aber 2 Linkerfehler:

    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""int __cdecl PopFileSaveDlg(struct HWND__ *,char *,wchar_t *)" (?PopFileSaveDlg@@YAHPAUHWND__@@PADPA_W@Z)" in Funktion ""long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z)".
    
     fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    

    Wes passt da nicht?



  • Zeig mal dein Quellcode. Hast du das wirklich alles so rauskopiert? Und hast du die beiden Zeilen

    // Funktionsprototypen
    void PopFileInitialize (HWND);
    BOOL PopFileSaveDlg (HWND , PTSTR , PTSTR);
    

    Auch in ner Header-Datei reingepackt oder ganz oben in deiner .c/.cpp datei geschrieben?

    MfG schirrmie



  • Ich hab es ohne Header gemacht

    #define UNICODE 
    #include <windows.h>
    #include <commdlg.h>
    
    namespace fix
    {
    	const unsigned short IDM_NEW			= 0;	// Neue Datei 
        const unsigned short IDM_OPEN			= 1;	// Öffnen
    	const unsigned short IDM_SAVE			= 2;	// Speichern
        const unsigned short IDM_SAVEAS			= 3;	// Speichern unter...
        const unsigned short IDM_QUIT			= 4;	// beenden
        const unsigned short IDM_UNDO			= 5;	// Rückgängig
    	const unsigned short IDM_REDO			= 6;	// Wiederherstellen
    	const unsigned short IDM_CUT			= 7;	// Auschneiden
    	const unsigned short IDM_COPY			= 8;	// Kopieren
    	const unsigned short IDM_PASTE			= 9;	// Einfügen
    	const unsigned short IDM_SELECTALL		= 10;	// Alles auswählen
    	const unsigned short IDM_DESELECTALL	= 11;	// Alles abwählen
    } 
    // Funktionsprototypen
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ;
    void PopFileInitialize(HWND);
    BOOL PopFileSaveDlg(HWND , PTSTR , PTSTR);
    
    // Globale Variablen
    	WPARAM						wParam;
    	::HWND						hWnd;
        ::WNDCLASS					wndcls; 
        ::MSG						msg; 
    	HMENU						hMenu_			= CreateMenu(); 
        HMENU						hMenuTemp		= CreateMenu(); 
    	HMENU						hMenuObject		= CreateMenu();
    	HMENU						hMenuTemp2		= CreateMenu();
    	static						OPENFILENAME ofn;
    	char						lpstrDateiname[MAX_PATH+2];
    	HANDLE						hFile;
    
    int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) 
    { 
    // -- Obermenü -- 
        // Das Dateinemü 
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_NEW, L"&Neu\tStrg + N"); 
        AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_OPEN, L"&Öffnen ...\tStrg + 0"); 
        AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_SAVE, L"&Speichern\tStrg + S"); 
        AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_SAVEAS, L"&Speichern unter ..."); 
        AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL); 
        AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_QUIT, L"&Beenden\tStrg + Q"); 
        AppendMenu(hMenu_, MF_POPUP, (UINT_PTR)hMenuTemp, L"&Datei"); 
    	hMenuTemp = CreateMenu();
    
    	// Das Bearbeitenmenü
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_UNDO, L"&Rückgängig\tStr + Z");
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_REDO, L"&Wiederherstellen\tStr + Y");
    	AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL); 
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_CUT, L"&Ausschneiden\tStr + X");
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_COPY, L"&Kopieren\tStr + C");
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_PASTE, L"&Einfügen\tStr + V");
    	AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL); 
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_SELECTALL, L"&Alles auswählen\tStr + A");
    	AppendMenuW(hMenuTemp, MF_STRING, fix::IDM_DESELECTALL, L"&Alles auswählen\tStr + Shift + A");
    	AppendMenu(hMenu_, MF_POPUP, (UINT_PTR)hMenuTemp, L"&Bearbeiten");
    
    	hMenuTemp = CreateMenu();
    	wndcls.cbClsExtra = 0; 
        wndcls.cbWndExtra = 0; 
        wndcls.hbrBackground = static_cast<HBRUSH>(::GetStockObject((int)WHITE_BRUSH)); 
        wndcls.hCursor = NULL; 
        wndcls.hIcon = NULL; 
        wndcls.hInstance = hInstance; 
        wndcls.lpfnWndProc = WindowProc; 
        wndcls.lpszClassName = L"app"; 
        wndcls.lpszMenuName = NULL;  // <= Menu rein 
        wndcls.style = CS_HREDRAW | CS_VREDRAW; 
    
        if(!::RegisterClassW(&wndcls)) 
            return -1; 
    
        hWnd = ::CreateWindowW( L"app", L"Level-Editor" , WS_OVERLAPPEDWINDOW, 0, 0, 1280, 783, ::GetDesktopWindow(), hMenu_, hInstance, NULL); 
    
        if(!hWnd) 
            return -1; 
    	WORD wNotifityCode;
    	WORD wId=1;
    
        ::ShowWindow(hWnd, nCmdShow); 
        ::UpdateWindow(hWnd); 
    
        while(::GetMessageW(&msg, NULL, NULL, NULL)) 
        { 
            ::TranslateMessage(&msg); 
            ::DispatchMessageW(&msg); 
        } 
        return 0; 
    } 
    
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 
        switch(uMsg) 
        { 
        case WM_CLOSE: 
            PostQuitMessage(0); 
            return 0; 
    	case WM_COMMAND: 
    		if(LOWORD(wParam) == fix::IDM_NEW) // Neue Datei
    		{ 
    			MessageBox(hWnd, L"Sie haben auf Neu gedrückt gedrückt!", L"Neu", MB_OK); 
    			break;
    		}
    		if(LOWORD(wParam) == fix::IDM_OPEN) // Datei öffnen
    		{ 
    			MessageBox(hWnd, L"Sie haben auf Öffnen gedrückt!", L"Öffnen", MB_OK); 
    			break;
    		}
    		if(LOWORD(wParam) == fix::IDM_SAVE) // speichern
    		{ 
    			PopFileInitialize (hwnd); // Initialisierung
    			PopFileSaveDlg (hwnd, lpstrDateiname, NULL); // Systemdialog anzeigen
    			// Keine best. Datei ersetzen!
    			hFile = CreateFile(ofn.lpstrFile ,GENERIC_WRITE, 0, (LPSECURITY_ATTRIBUTES) NULL,
                 CREATE_NEW, FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL); 
    			// ..
    			// Datei speichern
    			// ..
    			CloseHandle(hFile);
    			break;
    		}
    		if(LOWORD(wParam) == fix::IDM_QUIT) // Beenden
    		{
    			DestroyWindow(hWnd);
    			return -1;
    			break;
    		}
        }; 
        return ::DefWindowProcW(hwnd, uMsg, wParam, lParam); 
    } 
    
    void PopFileInitialize (HWND hwnd)
    {
    // welche Dateitypen sollen gespeichert werden können
       static TCHAR szFilter[] = TEXT ("Textdateien (*.TXT)\0*.txt\0") \
       TEXT ("ASCII-Dateien (*.ASC)\0*.asc\0") \
       TEXT ("Alle Dateien (*.*)\0*.*\0\0");
    
       ZeroMemory(&ofn, sizeof(OPENFILENAME));
       ofn.lStructSize = sizeof (OPENFILENAME);
       ofn.hwndOwner = hwnd;
       ofn.hInstance = NULL;
       ofn.lpstrFilter = szFilter;
       ofn.lpstrCustomFilter = NULL;
       ofn.nMaxCustFilter = 0;
       ofn.nFilterIndex = 0;
       ofn.lpstrFile = NULL; // Bei Öffnen bzw. Schließen gesetzt
       ofn.nMaxFile = MAX_PATH;
       ofn.lpstrFileTitle = NULL; // Bei Öffnen bzw. Schließen gesetzt
       ofn.nMaxFileTitle = MAX_PATH;
       ofn.lpstrInitialDir = NULL;
       ofn.lpstrTitle = NULL;
       ofn.Flags = 0; // Bei Öffnen bzw. Schließen gesetzt
       ofn.nFileOffset = 0;
       ofn.nFileExtension = 0;
       ofn.lpstrDefExt = TEXT ("txt");
       ofn.lCustData = 0L;
       ofn.lpfnHook = NULL;
       ofn.lpTemplateName = NULL;
    }
    
    // Den "Speichern unter" Dialog anzeigen und das Handle zum File zurückliefern
    BOOL PopFileSaveDlg (HWND hwnd, PTSTR pstrFileName, PTSTR pstrTitleName)
    {
       ofn.hwndOwner = hwnd;
       ofn.lpstrFile = pstrFileName;
       ofn.lpstrFileTitle = pstrTitleName;
       ofn.Flags = OFN_HIDEREADONLY | OFN_CREATEPROMPT;
    
       return GetSaveFileName (&ofn);
    }
    

    Aber da krieg ich noch einen Fehler

    error C2664: 'PopFileSaveDlg': Konvertierung des Parameters 2 von 'char [262]' in 'PTSTR' nicht möglich
            Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    


  • Glaube du vermischt hier UNICODE und ANSI:

    MSDN schrieb:

    PTSTR: A PWSTR ifUNICODE is defined, a PSTR otherwise.

    Versuch man PTCHAR anstatt char*
    und TCHAR anstatt char



  • Es klappt super danke 🙂


Anmelden zum Antworten