0

編集ボックスと 2 つのボタンを備えたダイアログ ボックスを作成しました。保存および読み込みボタン。

保存をクリックすると、エディット ボックス内のテキストを txt ファイルに保存し、読み込み、その txt ファイルをエディット ボックスに読み込みます。現在、保存/読み込みボタンが機能していないようです。保存ボタンは、選択したファイルに保存する代わりに「u」というファイルを作成するようで、ファイルが選択された後、読み込みボタンは何もしません。これが私がこれまでに持っているものです:

#include <Windows.h>
#include <commdlg.h>
#include <fstream>
#include <string>
#include "resource.h"
using namespace std;

// Globals
HWND ghMainWnd = 0;
OPENFILENAME ofn;


// Handles
static HWND hEditBox    = 0;
static HWND hSaveButton = 0;
static HWND hLoadButton = 0;

// Contains file.
char szFile[100];

void save()
{

    char text[260];

    GetWindowText( hEditBox, text, 260 );

    ofstream saveFile( szFile, ios_base::binary );

    int length = strlen( text );
    saveFile.write( (char*)&length, sizeof(length) );
    saveFile.write( text, length );

}

void load()
{

    char text[260];

    ifstream loadFile( szFile, ios_base::binary );

    int length = 0;
    loadFile.read((char*)&length, sizeof(length));

    loadFile.read( text, length );

    text[length] = '\0';

    SetWindowText( hEditBox, text );
}

BOOL CALLBACK
WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{

    ZeroMemory( &ofn , sizeof( ofn ) );

    ofn.lStructSize     = sizeof( ofn );
    ofn.hwndOwner       = hWnd;
    ofn.lpstrFile       = szFile;
    ofn.lpstrFile[0]    = '\0';
    ofn.nMaxFile        = sizeof( szFile );
    ofn.lpstrFilter     = "All\0*.*\0Text\0*.TXT\0";
    ofn.nFilterIndex    = 1;
    ofn.lpstrFileTitle  = "Open/Save File Dialog";
    ofn.nMaxFileTitle   = 0;
    ofn.lpstrInitialDir = NULL;
    ofn.Flags           = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

    switch( msg )
    {
    case WM_INITDIALOG:
        hEditBox    = GetDlgItem( ghMainWnd, IDC_EDIT );
        hSaveButton = GetDlgItem( ghMainWnd, ID_SAVE );
        hLoadButton = GetDlgItem( ghMainWnd, ID_OPEN );
    return true;

    case WM_COMMAND:
        switch( LOWORD( wParam ) )
        {
        case ID_SAVE:
            GetSaveFileName( &ofn );
            save();
        return true;

        case ID_OPEN:
            GetOpenFileName( &ofn );
            load();
        return true;
        }
    return true;

    case WM_CLOSE:
        DestroyWindow( hWnd );
    return true;

    case WM_DESTROY:
        PostQuitMessage( 0 );
    return true;
    }

    return false;
}

INT WINAPI
WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR cmdLine, int showCmd )
{

    ghMainWnd = CreateDialog( hInstance, MAKEINTRESOURCE( IDD_TXTDLG ), 0, WndProc );
    ShowWindow( ghMainWnd, showCmd );

    MSG msg;
    ZeroMemory( &msg, sizeof( MSG ) );

    while( GetMessage( &msg, 0, 0, 0 ) )
    {
        if( ghMainWnd == 0 || !IsDialogMessage( ghMainWnd, &msg ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
    }

    return (int)msg.wParam;
}
4

1 に答える 1

0

何が起こっているかを確認するための最良のアプローチは、呼び出しの直前にファイルの名前を表示することです。デバッガーでそれを実行し、それが何であるかを表示して、それが間違っているかどうかを確認できます。問題が関数の呼び出しにあるのか、名前を読み取ることにあるのかを理解するのに役立ちます。charをGetWindowTextで使用できることを覚えていません(おそらく、Unicode以外でも問題ありません)。

また、万が一の場合に備えて、文字列が空かどうかを確認するための処理を追加する必要があります。おそらく、名前が有効であることを確認することさえできます。

于 2012-11-29T23:20:10.440 に答える