Avatar billede fredag1 Nybegynder
15. marts 2006 - 09:27 Der er 12 kommentarer og
1 løsning

MFC question

Er der em måde at læse eller skrive data fra  en tekst fil?

Jeg er intresseret i at brugeren skriver i en Edit box? kan dette gørees i  MFC?

Jeg vil skrive og læse fra fil fra win32 app.

the format af input fil skal se f.eks. sådan ud:

Type point1 point2( if applicable)

LINE1 X1 Y1 X2 Y2
NODE1 X Y
LINE2 .. .. .. ..
LINE3 .. .. .. ..
NODE2 .. ..

hvordan kan jeg lave en edit box?
Avatar billede bertelbrander Novice
15. marts 2006 - 20:32 #1
Jeg er ikke sikker på at jeg forstår spørgsmålet,

Vil du lave en applikation der læser en fil, viser det i en edit box og skriver det tilbage til filen? Er der nogen speciel grund til at input skal se ud på den måde?

Er der nogen grund til at blande mfc ind i det?
Avatar billede fredag1 Nybegynder
16. marts 2006 - 09:02 #2
Hvordan åbner du en editbox? Komunikkere med brugeren så han/hun skriver sin input
på edit boxen og programmet læser inputet?  Og det skal ske i win32 omgivelser.
Avatar billede bertelbrander Novice
17. marts 2006 - 00:11 #3
En text editor der er ca. så simpel som det kan blive:

#include <windows.h>
#include <commctrl.h>
#include <fstream>

char CurrentFileName[256];

enum CommandEnum
{
  FileOpenCmd = 1025,
  FileSaveCmd,
  FileCloseCmd,
  AboutCmd,
};

enum WindowCtrlId
{
  EditWindowId = 130
};

HINSTANCE InstanceHandle;
HWND  MainWindow, EditWindow;

void OnFileSave();

bool ReadFile(const char *aFileName)
{
  std::ifstream File(aFileName);
  if(!File)
      return false;
  std::string Line, Text;
  while(std::getline(File, Line))
  {
      Text += Line.c_str();
      Text += "\r\n";
  }
  SendMessage(EditWindow, WM_SETTEXT, 0, (LPARAM )Text.c_str());
  return true;
}

void OnFileOpen()
{
  if(SendMessage(EditWindow, EM_GETMODIFY, 0, 0))
  {
      if(MessageBox(MainWindow, "The current file has been modified\r\nDo you wan't to save it before closing?", "TextEd", MB_YESNO | MB_ICONQUESTION) == IDYES)
      {
        OnFileSave();
      }
  }
  static char Filter[] = "txt (*.txt)\0*.txt\0All (*.*)\0*.*\0";
  OPENFILENAME OpenFilename;
  memset(&OpenFilename, 0, sizeof(OpenFilename));
  OpenFilename.lStructSize = sizeof(OpenFilename);
  OpenFilename.hwndOwner = MainWindow;
  OpenFilename.hInstance = InstanceHandle;
  OpenFilename.lpstrFilter = Filter;
  OpenFilename.lpstrFile = CurrentFileName;
  OpenFilename.nMaxFile = sizeof(CurrentFileName);
  OpenFilename.Flags = OFN_FILEMUSTEXIST;
  OpenFilename.lpstrDefExt = "txt";

  if(GetOpenFileName(&OpenFilename))
  {
      if(!ReadFile(CurrentFileName))
      {
        CurrentFileName[0] = 0;
        std::string Msg = "Failed to open:\r\n";
        Msg += CurrentFileName;
        MessageBox(MainWindow, Msg.c_str(), "TextEditor", MB_OK | MB_ICONWARNING);
      }
  }
}

void OnFileSave()
{
  if(CurrentFileName[0] == 0)
  {  // Need to Get A filename
      static char Filter[] = "txt (*.txt)\0*.txt\0All (*.*)\0*.*\0";
      OPENFILENAME OpenFilename;
      memset(&OpenFilename, 0, sizeof(OpenFilename));
      OpenFilename.lStructSize = sizeof(OpenFilename);
      OpenFilename.hwndOwner = MainWindow;
      OpenFilename.hInstance = InstanceHandle;
      OpenFilename.lpstrFilter = Filter;
      OpenFilename.lpstrFile = CurrentFileName;
      OpenFilename.nMaxFile = sizeof(CurrentFileName);
      OpenFilename.Flags = 0;
      OpenFilename.lpstrDefExt = "txt";
      if(!GetSaveFileName(&OpenFilename))
      {
        CurrentFileName[0] = 0;
        return;
      }
  }
  std::ofstream File(CurrentFileName, std::ios::binary);
  if(!File)
  {
      std::string Msg = "Failed to open:\r\n";
      Msg += CurrentFileName;
      MessageBox(MainWindow, Msg.c_str(), "TextEditor", MB_OK | MB_ICONWARNING);
      CurrentFileName[0] = 0;
      return;
  }
  int TextLength = GetWindowTextLength(EditWindow);
  char *Temp = new char [TextLength + 1];
  GetWindowText(EditWindow, Temp, TextLength + 1);
  File << Temp;
  delete [] Temp;
}

LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  switch (msg)
  {
  case WM_DESTROY:
      if(SendMessage(EditWindow, EM_GETMODIFY, 0, 0))
      {
        if(MessageBox(MainWindow, "The current file has been modified\r\nDo you wan't to save it before closing?", "TextEd", MB_YESNO | MB_ICONQUESTION) == IDYES)
        {
            OnFileSave();
        }
      }
      PostQuitMessage(0);
      break;
  case WM_CREATE:
      MainWindow = hwnd;
      EditWindow = CreateWindow("EDIT",
                                "",
                                WS_VISIBLE | WS_VSCROLL | WS_CHILD | ES_MULTILINE | WS_HSCROLL,
                                20, 20, 100, 100,
                                MainWindow,
                                (HMENU )EditWindowId,
                                InstanceHandle,
                                0);

      if(CurrentFileName[0])
      {
        if(!ReadFile(CurrentFileName))
        {
            std::string Msg = "Failed to open:\r\n";
            Msg += CurrentFileName;
            MessageBox(hwnd, Msg.c_str(), "TextEd", MB_OK);
            CurrentFileName[0] = 0;
        }
      }
      SetFocus(EditWindow);
      break;
  case WM_COMMAND:
      switch(LOWORD(wParam))
      {
      case FileCloseCmd:
        PostQuitMessage(0);
        break;
      case FileOpenCmd:
        OnFileOpen();
        break;
      case FileSaveCmd:
        OnFileSave();
        break;
      case AboutCmd:
        MessageBox(MainWindow, "TextEditor\r\nCopyright Bertel Brander 2006", "TextEditor", MB_OK);
        break;
      }
      break;
  case WM_SIZE:
      RECT ClientRect;
      GetClientRect(hwnd, &ClientRect);
      MoveWindow(EditWindow, ClientRect.left, ClientRect.top, ClientRect.right - ClientRect.left, ClientRect.bottom - ClientRect.top, TRUE);
      break;
  default:
      return DefWindowProc(hwnd, msg, wParam, lParam);
  }
  return 0;
}

HWND CreateMainWindow()
{
  WNDCLASS wc;
  memset(&wc, 0, sizeof(WNDCLASS));
  wc.style = CS_HREDRAW | CS_VREDRAW  | CS_DBLCLKS ;
  wc.lpfnWndProc = (WNDPROC )MainWndProc;
  wc.hInstance = InstanceHandle;
  wc.hbrBackground = (HBRUSH )(COLOR_WINDOW + 1);
  wc.lpszClassName = "SimpleWinWndClass";
  wc.lpszMenuName = 0;
  wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  if(!RegisterClass(&wc))
      return 0;

  HMENU FileMenu = CreateMenu();
  AppendMenu(FileMenu, MF_STRING, FileOpenCmd, "Open");
  AppendMenu(FileMenu, MF_STRING, FileSaveCmd, "Save");
  AppendMenu(FileMenu, MF_SEPARATOR, 0 , 0);
  AppendMenu(FileMenu, MF_STRING, FileCloseCmd, "Close");

  HMENU HelpMenu = CreateMenu();
  AppendMenu(HelpMenu, MF_STRING, AboutCmd, "About");

  HMENU MainMenu = CreateMenu();
  AppendMenu(MainMenu, MF_POPUP, (UINT )FileMenu, "File");
  AppendMenu(MainMenu, MF_POPUP, (UINT )HelpMenu, "Help");

  return CreateWindow("SimpleWinWndClass",
                      "Simple Text Editor",
                      WS_MINIMIZEBOX | WS_VISIBLE | WS_MAXIMIZEBOX |
                      WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION |
                      WS_BORDER | WS_SYSMENU | WS_THICKFRAME,
                      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
                      0,
                      MainMenu,
                      InstanceHandle,
                      0);
}

int WINAPI WinMain(HINSTANCE Instance,
                  HINSTANCE,
                  LPSTR CmdLine,
                  INT)
{
  InstanceHandle = Instance;

  InitCommonControls();

  if(CmdLine[0])
  {
      strcpy(CurrentFileName, CmdLine);
  }
  if((MainWindow = CreateMainWindow()) == (HWND )0)
  {
      MessageBox(0, "Failed to create MainWindow!", "TextEditor", MB_OK);
      return 0;
  }
  ShowWindow(MainWindow, SW_SHOW);
  MSG Msg;
  while(GetMessage(&Msg, 0, 0, 0))
  {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
  }
  return Msg.wParam;
}
Avatar billede fredag1 Nybegynder
20. marts 2006 - 16:06 #4
bertelbrander
Det er bestemt ikke nemt. Det er bare dig der er ekspert. Jeg kan endue ikke kompilere men det går nok.
Tak for den tid du brugte for min opgave!
Avatar billede bertelbrander Novice
20. marts 2006 - 19:54 #5
Det burde være trivielt at oversætte det, hvilke fejl får du nor du forsøger at bygge.
Avatar billede fredag1 Nybegynder
21. marts 2006 - 09:49 #6
error C2039: 'getline' : is not a member of 'std'
error C2065: 'getline' : undeclared identifier


while(std::getline(File, Line)) // <- both errors happen in this line
{
Text += Line.c_str();
Text += "\r\n";
}
Avatar billede bertelbrander Novice
21. marts 2006 - 19:54 #7
Der mangler en:

#include <string>

I toppen.
Avatar billede fredag1 Nybegynder
22. marts 2006 - 11:07 #8
Tak,
Bertal, Jeg tro  jeg gave dig fuld point. Men jeg kan ikke se det i systemet her.
Tak for din indsats.
Avatar billede bertelbrander Novice
23. marts 2006 - 23:19 #9
For at du kan give point skal den du vil give point have lagt et svar, hvis ikke denne har lavet et svar, beder man normalt ham om at gøre det.

Men jeg samler ikke på point, så lave selv et svar og accepter det, så bliver spørgsmålet markeret som lukket og du får dine point tilbage.
Avatar billede fredag1 Nybegynder
24. marts 2006 - 09:32 #10
Fint
Avatar billede bertelbrander Novice
24. marts 2006 - 21:01 #11
Så mangler du kun at acceptere dit svar, marker dit navn ude til venstre og tryk på Accepter.
Avatar billede fredag1 Nybegynder
27. marts 2006 - 11:49 #12
Det har jeg gjort!
Avatar billede bertelbrander Novice
27. marts 2006 - 16:23 #13
I så fald burde dit svar være markeret som accepteret.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester