代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

使用create/readfile-c写入文件内容

  •  0
  • Jamie Keeling  · 技术社区  · 14 年前

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

    除了在屏幕上显示文本,当我单击对话框上的“确定”按钮时,没有任何文本显示,一切都正常工作。

    我是新来的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 回复  |  直到 14 年前
        1
  •  1
  •   Bertrand Marron    14 年前

    CreateFile (w)的第一个参数的类型是 LPCWSTR (常数wstring)。

    ofn.lpstrFile 是一个 LPWSTR (WSTON)

    所以 &ofn.lpstrFile 你的代码是错误的 LPWSTR* )

        2
  •  0
  •   Tony The Lion    14 年前

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

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

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