Textverarbeitung unter Winapi



  • Hallo,

    Ich hätte eine Frage zur Winapi Programmierung.

    ich Prgrammiere mit MV 2010 Express unf für MS Systeme.

    Folgendes möchte ich machen.

    Ich habe eine TXT Datei die wie Folgt ausieht:

    09.09.10 gdghgdMistfhsgh Äpfel dadMistfsfg 3.55 asfsjaMistfgh
    09.09.10 g<sfhgMistfhfhf Birnen asdMistfsfg 1.78 asfsjaMistfgh
    09.09.10 gdähgdMistfoogh Pflaumen dudMistfiufg 0.79 aasdsjaMistfhbgf

    Ich möchte diese TXT in ein Fenster Laden und dabei gleich Etwas Sortieren und bearbeiten.

    Also soll Z.b sowas alles Raus gelöscht werden gdghgdMistfhsgh und der Rest soll dann mit unterschiedlichen Farben Angezeigt werden. Etwa So:

    09.09.10 Äpfel(in rot) 3.55
    09.09.10 Birnen (in Gelb) 1,78
    09.09.10 Birnen (in Blau) 0,79

    Das bekomme ich bis jetzt hin:
    Ich kann den gesamten Text rein laden und alles augeben.
    Hier der Code(zum Teil von www.pronix.de):

    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
          //...zeug
          case WM_COMMAND:
                switch(LOWORD(wParam))
                {
                    case ID_FILE_EXIT:
                        PostMessage(hwnd, WM_CLOSE, 0, 0);
                        break;
                    case ID_FILE_OPEN:
                        OpenFileBox(hwnd);
                        break;
                     case ID_VERSION:
                        MessageBox(NULL, "Version 1.0","Version",MB_OK );
                        break;
              default:
              return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    void OpenFileBox(HWND hwnd)
    {
        OPENFILENAME ofn;
        char szFileName[MAX_PATH] = "";
    
        ZeroMemory(&ofn, sizeof(ofn));
    
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner   = hwnd;
        ofn.lpstrFilter = "Text Datei (*.txt)\0*.txt\0"
                          "C Datei (*.c)\0*.c\0"
                          "Alle Dateien (*.*)\0*.*\0";
        ofn.lpstrFile   = szFileName;
        ofn.nMaxFile    = MAX_PATH;
        ofn.Flags       = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
        ofn.lpstrDefExt = "txt";
    
        if(GetOpenFileName(&ofn))
        {
            HWND hEdit = GetDlgItem(hwnd, IDC_MAIN_EDIT);
            if(LoadText(hEdit, szFileName))
            {
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                                   SB_SETTEXT, 0, (LPARAM)"Geöffnet...");
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                                   SB_SETTEXT, 1, (LPARAM)szFileName);
            }
        }
    }
    
    BOOL LoadText(HWND hEdit, LPCTSTR pszFileName)
    {
        HANDLE hFile;
        BOOL bSuccess = FALSE;
    
        hFile = CreateFile(pszFileName, GENERIC_READ,
                           FILE_SHARE_READ, NULL,
                           OPEN_EXISTING, 0, NULL);
    
        if(hFile != INVALID_HANDLE_VALUE)
        {
            DWORD dwFileSize;
    
            dwFileSize = GetFileSize(hFile, NULL);
            if(dwFileSize != 0xFFFFFFFF)
            {
                LPSTR pszFileText;
    
                pszFileText =(char *) GlobalAlloc(GPTR, dwFileSize + 1);
                if(pszFileText != NULL)
                {
                    DWORD dwRead;
                    if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL) )
                    {
                        pszFileText[dwFileSize] = '\0';
                        bSuccess = Textausgabe(pszFileText, hEdit);
    	            }
                    GlobalFree(pszFileText);
                }
            }
            CloseHandle(hFile);
        }
        return bSuccess;
    }
    
    BOOL Textausgabe(LPSTR text, HWND hwd)
    {
            // ihr würde ich jetzt die Textbearbeitung machen
    	SetWindowText(hwd, text);            
            rueckgabe = TRUE;
    	return rueckgabe;
    }
    

    Nur weiß ich nicht wie ich einzelne Text stellen herausfilter kann.
    Weiß da jemand was?
    Ich hätte mir gedacht das ich den Text in einzelne Strings einteile und dann verschieden Überprüfungen machen und diesen dann einzeln ausgebe.

    Da ich noch neu in der Winapi Programmierung bin würde ich mich über Beispiel Codes freuen.

    Mfg
    Turis



  • Also Text zeilenweise mit

    fgets
    

    einlesen
    Zeile dann mit

    sscanf(buffer,"%s %*s %s %*s %s,datum,obst,preis...
    

    parsen

    if (strcmp(obst,"Birne")==0) Color=RGB(weiss,jetzt,nich); //Blau
    

    und dann in einem Richedit ausgeben (hab diese funktion mal wo gefunden

    void AddText(HWND hwnd, char *szTextIn, COLORREF crNewColor)
    {
       char *Text = (char *)malloc(lstrlen(szTextIn) + 5);
       CHARFORMAT cf;
       int iTotalTextLength = GetWindowTextLength(hwnd);
       int iStartPos = iTotalTextLength;
       int iEndPos;
        char txt[50];
        int line,zeichen;
        int ret;
    
       strcpy(Text, szTextIn);
       strcat(Text, "\r\n");
    
       SendMessage(hwnd, EM_SETSEL, (WPARAM)(int)iTotalTextLength, (LPARAM)(int)iTotalTextLength);
       SendMessage(hwnd, EM_REPLACESEL, (WPARAM)(BOOL)FALSE, (LPARAM)(LPCSTR)Text);
    
       free(Text);
    
       cf.cbSize      = sizeof(CHARFORMAT);
       cf.dwMask      = CFM_COLOR | CFM_UNDERLINE | CFM_BOLD;
       cf.dwEffects   = (unsigned long)~(CFE_AUTOCOLOR | CFE_UNDERLINE | CFE_BOLD);
       cf.crTextColor = crNewColor;
    
       iEndPos = GetWindowTextLength(hwnd);
    
       SendMessage(hwnd, EM_SETSEL, (WPARAM)(int)iStartPos, (LPARAM)(int)iEndPos);
       ret=SendMessage(hwnd, EM_SETCHARFORMAT, (WPARAM)(UINT)SCF_SELECTION, (LPARAM)&cf);
       SendMessage(hwnd, EM_HIDESELECTION, (WPARAM)(BOOL)TRUE, (LPARAM)(BOOL)FALSE);
    
       SendMessage(hwnd, EM_LINESCROLL, (WPARAM)(int)0, (LPARAM)(int)1);
    
        line=SendMessage(hwnd,EM_GETLINECOUNT,0,0);
        /*if (line>6) //auf 6 Zeilen einschränken
        {
        zeichen=SendMessage(hwnd,EM_LINELENGTH,0,0);
        SendMessage(hwnd, EM_SETSEL, (WPARAM)(int)0, (LPARAM)(int)zeichen+2);
        SendMessage(hwnd, EM_REPLACESEL, (WPARAM)(BOOL)FALSE, (LPARAM)(LPCSTR)"");
        */
    
        }
    }
    


  • Ich danke dir, ich werd mich ran setzen und ein wenig was ausprobieren.

    -Turis



  • Hallo,

    ich hätte da noch eine Frage.
    Mein Text sieht jetzt nicht so aus: "Birne Datum Preis"
    Sonders so: "Birne,Datum,Preis" wie kann ich beim Parsen jetzt am "," trennen?

    -Turis


Anmelden zum Antworten