使用Create / ReadFile - C编写文件内容

时间:2010-03-03 21:38:30

标签: c winapi

我正在尝试使用公共对话框读取小文本文件的内容,将文件中的文本传递到缓冲区,并通过使窗口无效并强制重新绘制将其绘制到表单中。

除了在屏幕上显示文本外,一切都有效,当我点击对话框上的OK按钮时,没有文字出现。

我是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 个答案:

答案 0 :(得分:1)

CreateFile(W)的第一个参数类型是LPCWSTR(常量WString)。

ofn.lpstrFileLPWSTR(WString)

所以&ofn.lpstrFile代码错误(作为LPWSTR*)。

答案 1 :(得分:0)

这:ReadFile(fileHandle,fileText,1023,0,0);

应该是:ReadFile(fileHandle, &fileText,1023,0,0);

使用char*而不是数组。 char指针基本上将指向数组中的第一项。