Запись содержимого файла с использованием Create / ReadFile - C - PullRequest
0 голосов
/ 04 марта 2010

Я пытаюсь прочитать содержимое небольшого текстового файла с помощью обычного диалогового окна, передать текст в файле в буфер и нарисовать его в форме, сделав окно недействительным и заставив перерисовать.

Все работает за исключением отображения текста на экране, когда я нажимаю кнопку ОК в диалоговом окне, текст не отображается.

Я новичок в C, поэтому мог пропустить ключевое слово или использовать неверный указатель.

Вот фрагмент моего кода:

LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
    CHAR fileText[1024];
    HDC hdc;
    OPENFILENAME ofn;
    TCHAR szFile[MAX_PATH];
    HANDLE fileHandle;
    RECT clientArea;
    PAINTSTRUCT pStruct;

    // Act on current message
    switch(message)    
    {
    case WM_CREATE:
        AddMenus(hMainWindow);
        break;

    case WM_COMMAND:


        switch(LOWORD(wParam))
        {
        case IDM_FILE_OPEN:

            ZeroMemory(&ofn, sizeof(ofn));
            ofn.lStructSize = sizeof(ofn);
            ofn.lpstrFile = szFile;
            ofn.lpstrFile[0] = '\0';
            ofn.hwndOwner = hMainWindow;
            ofn.nMaxFile = sizeof(szFile);
            ofn.lpstrFilter = TEXT("All files(*.*)\0*.*\0");
            ofn.nFilterIndex = 1;
            ofn.lpstrInitialDir = NULL;
            ofn.lpstrFileTitle = NULL;
            ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

            if(GetOpenFileName(&ofn))
            {
                fileHandle = CreateFile(&ofn.lpstrFile,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
                ReadFile(fileHandle,fileText,1023,0,0);
                CloseHandle(fileHandle);
            }

            GetClientRect(hMainWindow, &clientArea);
            InvalidateRect(hMainWindow,
                            &clientArea,
                            TRUE
                            );          

            break;
        case IDM_FILE_QUIT:
            SendMessage(hMainWindow, WM_CLOSE, 0, 0);
            break;

        }
        break;

    case WM_PAINT:

        hdc = BeginPaint(hMainWindow, &pStruct);

        DrawTextA(hdc,
                fileText, 
                -1,
                &clientArea,
                DT_WORDBREAK);

        EndPaint(hMainWindow, &pStruct);

        break;

    case WM_DESTROY:

        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hMainWindow, message, wParam, lParam);
    }
    return 0;
}

Где я точно ошибаюсь? Кроме того, я знаю, что он не идеален в своей концепции, поскольку моя цель - просто заставить его работать, а затем пересмотреть его.

Спасибо, что уделили время.

Ответы [ 2 ]

1 голос
/ 04 марта 2010

CreateFile * Тип первого параметра (W) - LPCWSTR (Constant WString).

ofn.lpstrFile является LPWSTR (WString)

Так что &ofn.lpstrFile неверен в вашем коде (будучи LPWSTR*).

0 голосов
/ 04 марта 2010

Это: ReadFile(fileHandle,fileText,1023,0,0);

Должно быть: ReadFile(fileHandle, &fileText,1023,0,0);

используйте char* вместо массива. Указатель char в основном будет указывать на первый элемент в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...