Text an Cursorposition kopieren



  • 😃 Alles klar :).

    Hier der gesamte Code :
    Die Main.c:

    #include <windows.h>
    
    #include "Main.h"
    
    static char g_szClassName[] = "MyWindowClass";
    static HINSTANCE g_hInst = NULL;
    
    #define IDC_MAIN_TEXT   1001
    
    BOOL LoadFile(HWND hEdit, LPSTR pszFileName)
    {
       HANDLE hFile;
       BOOL bSuccess = FALSE;
    
       hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
          OPEN_EXISTING, 0, 0);
       if(hFile != INVALID_HANDLE_VALUE)
       {
          DWORD dwFileSize;
          dwFileSize = GetFileSize(hFile, NULL);
          if(dwFileSize != 0xFFFFFFFF)
          {
             LPSTR pszFileText;
             pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
             if(pszFileText != NULL)
             {
                DWORD dwRead;
                if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
                {
                   pszFileText[dwFileSize] = 0; // Null terminator
                   if(SetWindowText(hEdit, pszFileText))
                      bSuccess = TRUE; // It worked!
                }
                GlobalFree(pszFileText);
             }
          }
          CloseHandle(hFile);
       }
       return bSuccess;
    }
    
    BOOL SaveFile(HWND hEdit, LPSTR pszFileName)
    {
       HANDLE hFile;
       BOOL bSuccess = FALSE;
    
       hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0,
          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
       if(hFile != INVALID_HANDLE_VALUE)
       {
          DWORD dwTextLength;
          dwTextLength = GetWindowTextLength(hEdit);
          if(dwTextLength > 0)// No need to bother if there's no text.
          {
             LPSTR pszText;
             pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
             if(pszText != NULL)
             {
                if(GetWindowText(hEdit, pszText, dwTextLength + 1))
                {
                   DWORD dwWritten;
                   if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
                      bSuccess = TRUE;
                }
                GlobalFree(pszText);
             }
          }
          CloseHandle(hFile);
       }
       return bSuccess;
    }
    
    BOOL DoFileOpenSave(HWND hwnd, BOOL bSave)
    {
       OPENFILENAME ofn;
       char szFileName[MAX_PATH];
    
       ZeroMemory(&ofn, sizeof(ofn));
       szFileName[0] = 0;
    
       ofn.lStructSize = sizeof(ofn);
       ofn.hwndOwner = hwnd;
       ofn.lpstrFilter = "Gothic Script Files (*.d)\0*.d\0Save Files\0*.sav\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
       ofn.lpstrFile = szFileName;
       ofn.nMaxFile = MAX_PATH;
       ofn.lpstrDefExt = "txt";
    
       if(bSave)
       {
          ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
             OFN_OVERWRITEPROMPT;
    
          if(GetSaveFileName(&ofn))
          {
             if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
             {
                MessageBox(hwnd, "Save file failed", "Error",
                   MB_OK | MB_ICONEXCLAMATION);
                return FALSE;
             }
             if(SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
             {
                MessageBox(hwnd, "File saved successfully", "Succes",
                MB_OK | MB_ICONEXCLAMATION);
                return TRUE;
             }
          }
       }
       else
       {
          ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
          if(GetOpenFileName(&ofn))
          {
             if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
             {
                MessageBox(hwnd, "Load of file failed", "Error",
                   MB_OK | MB_ICONEXCLAMATION);
                return FALSE;
             }
             if(LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName))
             {
                MessageBox(hwnd, "File loaded successfully", "Succes",
                   MB_OK | MB_ICONEXCLAMATION);
                return FALSE;
             }
          }
       }
       return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
    {
    
            HDC hdc ;
            PAINTSTRUCT ps;
            RECT rect ;
       switch(Message)
       {
          case WM_CREATE:
             CreateWindow("EDIT", "",
                WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE |
                   ES_WANTRETURN,
                CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                hwnd, (HMENU)IDC_MAIN_TEXT, g_hInst, NULL);
    
             SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,
                (WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
          break;
          case WM_SIZE:
             if(wParam != SIZE_MINIMIZED)
                MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),
                   HIWORD(lParam), TRUE);
          break;
          case WM_SETFOCUS:
             SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
          break;
          case WM_COMMAND:
             switch(LOWORD(wParam))
             {
                case CM_FILE_OPEN:
                   DoFileOpenSave(hwnd, FALSE);
                break;
                case CM_FILE_SAVEAS:
                   DoFileOpenSave(hwnd, TRUE);
                break;
                case CM_FILE_EXIT:
                     /*MessageBox (NULL, "Wirklich beenden?","ENDE",4);  //JA/NEIN
                     if (IDYES)
                     {*/
                     PostMessage(hwnd, WM_CLOSE, 0, 0);
                     /*}*/
                break;
                case CM_ABOUT:
                   MessageBox (NULL, "Morpheus Gothic File Editor\nCopyright:\nDieser Editor darf nicht-kommerziel unverändert weitergegeben werden", "About...", 0);
                break;
                case CM_FUNC_NPC_KNOWSINFO:
    
                break;
                case CM_HELP :
                     MessageBox (NULL, "Wähle aus dem Rollout \"Gothic-Optionen\" die passende Option heraus", "HELP",0);        
                break;
                case CM_FILE_NEW :
                     MessageBox (hwnd, "Not yet implemented","Sorry" , MB_ICONINFORMATION | MB_OK);
                break;
                case CM_FILE_SAVE :
                     MessageBox (NULL, "Not yet implemented","Sorry" , MB_ICONINFORMATION | MB_OK);
                break;
             }
          break;
          case WM_CLOSE:
             DestroyWindow(hwnd);
          break;
          case WM_DESTROY:
             PostQuitMessage(0);
          break;
          default:
             return DefWindowProc(hwnd, Message, wParam, lParam);
       }
       return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nCmdShow)
    {
       WNDCLASSEX WndClass;
       HWND hwnd;
       MSG Msg;
    
       HWND nwnd;
    
       g_hInst = hInstance;
    
       WndClass.cbSize        = sizeof(WNDCLASSEX);
       WndClass.style         = 0;
       WndClass.lpfnWndProc   = WndProc;
       WndClass.cbClsExtra    = 0;
       WndClass.cbWndExtra    = 0;
       WndClass.hInstance     = g_hInst;
       WndClass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
       WndClass.hCursor       = LoadCursor(NULL, IDC_ARROW);
       WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
       WndClass.lpszMenuName  = "MAINMENU";
       WndClass.lpszClassName = g_szClassName;
       WndClass.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
       if(!RegisterClassEx(&WndClass))
       {
          MessageBox(0, "Window Registration Failed!", "Error!",
             MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
          return 0;
       }
    
       hwnd = CreateWindowEx(
          WS_EX_CLIENTEDGE,
          g_szClassName,
          "Morpheus' File Editor für Gothic",
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,  
          NULL, NULL, g_hInst, NULL);
    
       if(hwnd == NULL)
       {
          MessageBox(0, "Window Creation Failed!", "Error!",
             MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
          return 0;
       }
    
       ShowWindow(hwnd, nCmdShow);
       UpdateWindow(hwnd);
    
       while(GetMessage(&Msg, NULL, 0, 0))
       {
          TranslateMessage(&Msg);
          DispatchMessage(&Msg);
       }
       return Msg.wParam;
    }
    

    Die Main.h:

    #define CM_FILE_SAVEAS	9072
    #define CM_FILE_EXIT	9071
    #define CM_FILE_OPEN	9070
    #define CM_ABOUT        9069
    #define CM_HELP         9077
    #define CM_FILE_NEW     9078
    #define CM_FILE_SAVE    9079
    
    #define CM_FUNC_NPC_KNOWSINFO 9073
    #define CM_FUNC_NPC_HASITEMS 9074
    #define CM_FUNC_B_GIVEINVITEMS 9075
    #define CM_FUNC_AI_STOPPROCESS 9076
    

    Die menu.rc:

    #include "Main.h"
    
    MAINMENU MENU
    {
     POPUP "&File"
     {
      MENUITEM "&New", CM_FILE_NEW
      MENUITEM "&Open...", CM_FILE_OPEN
      MENUITEM "&Save"    , CM_FILE_SAVE
      MENUITEM "Save &As...", CM_FILE_SAVEAS
      MENUITEM SEPARATOR
      MENUITEM "&Exit", CM_FILE_EXIT
     }
    
    POPUP "&Gothic-Funktionen"
     {
           MENUITEM "Npc_KnowsInfo", CM_FUNC_NPC_KNOWSINFO
           MENUITEM "Npc_HasItems" , CM_FUNC_NPC_HASITEMS
           MENUITEM SEPARATOR
           MENUITEM "B_GiveInvItems", CM_FUNC_B_GIVEINVITEMS
           MENUITEM "AI_StopProcessInfos", CM_FUNC_AI_STOPPROCESS
     }
    
     POPUP "&Help"
     {
           MENUITEM "H&ilfe", CM_HELP
           MENUITEM "&About", CM_ABOUT
     }
    
    }
    

    Die Msdn Funktion habe ich wieder rausgelöscht.

    MfG, C++Progger



  • Entschuldige, ich muss jetzt weg und kann erst morgen deinen Code durchsehen.
    BTW: Wo willst du was wofür machen?

    Greetz, Swordfish



  • Swordfish schrieb:

    Entschuldige, ich muss jetzt weg und kann erst morgen deinen Code durchsehen.
    BTW: Wo willst du was wofür machen?

    Greetz, Swordfish

    Die Frage verstehe ich jetzt nicht...

    Bis morgen denne ;).

    MfG, C++Progger



  • Hallo? Es ist schon übermorgen ;). Ich will was lernen 😞

    MfG, C++Progger



  • Ja, entschuldige ich hatte gestern 39.8°C Fieber. Heute sind's noch um die 38°C. Sprich: Denken tut mir im moment ein bisschen weh... 😞

    C++Progger schrieb:

    Swordfish schrieb:

    Entschuldige, ich muss jetzt weg und kann erst morgen deinen Code durchsehen.
    BTW: Wo willst du was wofür machen?

    Die Frage verstehe ich jetzt nicht...

    Du hast doch versucht, irgendwo eine Funktion zu verwenden, die du in der MSDN gefunden hast!? Was wolltest du mit dieser Funktion bezwecken?

    Greetz, Swordfish



  • Swordfish schrieb:

    Ja, entschuldige ich hatte gestern 39.8°C Fieber. Heute sind's noch um die 38°C. Sprich: Denken tut mir im moment ein bisschen weh... 😞

    [Thread-Hijacking-Begin]
    Oha, na dann mal gute Besserung! 👍
    [Thread-Hijacking-End]



  • @CodeFinder: Danke! Ich hoff' wirklich, dass ich am Abend wieder halbwegs fitt bin (meine Freundin kommt 😉 )

    Greetz, Swordfish



  • Sagstmal, hassu ICQ o.ä., habsch disch schonmal gefrägt, aber da hast nix zu gesagt 🙄



  • Nö, hab' z. Zt. leider nur einen absoluten "Schmalband"-Internetzugang und damit ist mir ICQ zu teuer. Aber Breitband mit Flat kommt demnächst 😉

    Greetz, Swordfish



  • Swordfish schrieb:

    [...]

    C++Progger schrieb:

    Swordfish schrieb:

    Entschuldige, ich muss jetzt weg und kann erst morgen deinen Code durchsehen.
    BTW: Wo willst du was wofür machen?

    Die Frage verstehe ich jetzt nicht...

    Du hast doch versucht, irgendwo eine Funktion zu verwenden, die du in der MSDN gefunden hast!? Was wolltest du mit dieser Funktion bezwecken?

    Greetz, Swordfish

    Damit wollte ich das Problem beheben, welches auch im Thread Titel steht. Dass der Text an die Cursor Position geschrieben wird.

    MfG, C++Progger



  • Swordfish schrieb:

    Nö, hab' z. Zt. leider nur einen absoluten "Schmalband"-Internetzugang und damit ist mir ICQ zu teuer. Aber Breitband mit Flat kommt demnächst 😉

    Greetz, Swordfish

    Hm k, wenns soweit ist, schick mal deine ICQ-Nr. an >> cpp-coding@arcor.de <<, dann kansch dich adden 😉



  • Deine Kopfschmerzen tun mir ja leid Schwordfish. Kann jemand anders für ihn "einspringen" bitte? 😉

    MfG, C++Progger



  • C++Progger schrieb:

    Deine Kopfschmerzen tun mir ja leid Schwordfish. Kann jemand anders für ihn "einspringen" bitte? 😉
    MfG, C++Progger

    erkläre doch mal dein problem, habe nämlich den überblick verloren 😉 oder hängst noch immer an den parametern fest?



  • miller_m schrieb:

    erkläre doch mal dein problem, habe nämlich den überblick verloren 😉 oder hängst noch immer an den parametern fest?

    😡 Muss ich das jetzt 20 Mal erklären?! Ich will das jemand mir den Code erklärt, wie ich meinen Text da an die Cursorposition kriege. Mit der MSDN komme ich nicht klar. Ich brauche jemanden, der mir das erklärt.

    MfG, C++Progger



  • erster parameter ist das handle des controls an den du die message senden möchtest. da du beim erstellen nicht das handle speicherst (imho ein fehler)
    musst du anders darauf zurückgreifen. (was du schon du es öftern gemacht hast)

    C++Progger schrieb:

    GetDlgItem(hwnd, IDC_MAIN_TEXT);
    

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/DialogBoxes/DialogBoxReference/DialogBoxFunctions/GetDlgItem.asp

    zweiter param ist die id der message die du versenden möchtest

    msdn schrieb:

    wParam
    Specifies whether the replacement operation can be undone. If this is TRUE, the operation can be undone. If this is FALSE , the operation cannot be undone.

    dritter: true oder false, hängt wohl stark von deiner anwendung ab

    msdn schrieb:

    lParam
    Pointer to a null-terminated string containing the replacement text.

    zb: (LPARAM)TEXT("ich bin ein copy und paste <progger>");



  • Okay, aber wie sieht der vollständige Code aus, den ich einfügen muss? IMHO erklärt MSDN das nicht.

    MfG, C++Progger



  • C++Progger schrieb:

    miller_m schrieb:

    erkläre doch mal dein problem, habe nämlich den überblick verloren 😉 oder hängst noch immer an den parametern fest?

    😡 Muss ich das jetzt 20 Mal erklären?! Ich will das jemand mir den Code erklärt, wie ich meinen Text da an die Cursorposition kriege. Mit der MSDN komme ich nicht klar. Ich brauche jemanden, der mir das erklärt.

    Ich find's unglaublich, wie du dich hier aufspielst. Meiner Meinung nach solltest du für ein solches Gehabe gar keine Hilfestellung mehr bekommen. Es gibt genug Tutorials im Netz. Such dir eines aus und lerne. Man muss nicht sooo viel Grips haben, um sich die Grundlagen von C/C++ beizubringen. Nur allzu faul sollte man nicht sein...



  • WebFritzi schrieb:

    Ich find's unglaublich, wie du dich hier aufspielst. Meiner Meinung nach solltest du für ein solches Gehabe gar keine Hilfestellung mehr bekommen. Es gibt genug Tutorials im Netz. Such dir eines aus und lerne. Man muss nicht sooo viel Grips haben, um sich die Grundlagen von C/C++ beizubringen. Nur allzu faul sollte man nicht sein...

    Es tut mir leid :(. Es ist nur, die MSDN Bibliothek ist für Anfänger wie mich absolut unübersichtlich für einen Anfänger wie mich 😮. Da verliert man schnell die Übersicht.

    Und bei Linkseiten zu Tutorials wird häufig die Seite nicht gefunden, oder man kommt auf irgendwelchen Service Seiten raus, die nix mit C++ zu tun haben.

    http://www.onlinetutorials.de/cpp-005.htm

    Das 3. von oben wäre wohl richtig, aber der Link geht (natürlich nicht).

    MfG, C++Progger



  • oben rechts findest du ein haufen tutorials, übrigens winapi ist primär c-programmierung, sprich beschäftige erst mit den grundlagen dann steigst du in die winapi ein. es bringt dir nichts einfach alles zusammen zu kopieren.



  • C++Progger schrieb:

    Es tut mir leid :(. Es ist nur, die MSDN Bibliothek ist für Anfänger wie mich absolut unübersichtlich für einen Anfänger wie mich 😮. Da verliert man schnell die Übersicht.

    Na, OK. Ist aber schön, dass du dich entschuldigst. Macht nicht jeder. Du warst sicher nur gerade sauer, weil du nichts passendes gefunden hast. Das kenne ich. Man ist manchmal ungeduldig.
    Nimm dir Zeit, C zu lernen. Ja, fang ruhig zuerst bei C an. C++ brauchst du in mit der WinAPI eh nicht.


Anmelden zum Antworten