Aktuelle Eingabe markieren

Hallo @all,
ich bastle geade an einen Editor. Man kann auch schon Speichern, Öffnen, die Eingabe löschen und die Schriftart ändern. Jetzt habe ich aber ein Problem: Wie kann ich den Eingabetext mittels STRG+A makieren?
Ich habe schon die Abfrage, ob STRG und A gedrückt wurde:
Code:
case WM_CHAR:
        switch (wParam)
        {
            case VK_CONTROL:
                switch (wParam)
                {
                    case 'a': return 0;
                }
                return 0;
        }
        return 0;
Aber wie kann ich jetzt alles makieren?
 
Mehr Details (z.B benutzte GUI Bibliothek/Module => nutzt Du QT,GTK,WinAPI oder "write_to_graphic_buffer" Methode?) wären nicht schlecht ;)
 
Ich benutze eine WinApi, der komplette Code:
Code:
#include <windows.h>
#include <string.h>
#include <commctrl.h>
#include "resource.h"
#include "dialogs.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
//Deklaration der Windows-Nachrichten-Prozedur

HINSTANCE hlnst;

int WINAPI WinMain (HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow)
{
    char szName[] = "Fensterklasse";
    WNDCLASS wc;

    wc.style         = CS_HREDRAW | CS_VREDRAW;   // CS = "class style"
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hI;
    wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (GRAY_BRUSH);
    wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU);
    wc.lpszClassName = szName;

    RegisterClass (&wc);

    HWND hwnd = CreateWindow (szName, "Editor", WS_OVERLAPPEDWINDOW,
                          -4, -2, 1030, 775, NULL, NULL, hI, NULL);

    ShowWindow   (hwnd, iCmdShow);
    UpdateWindow (hwnd);

// Nachrichten-Schleife
    MSG msg;
        while (GetMessage (&msg, NULL, 0, 0))
        {
            TranslateMessage (&msg);
            DispatchMessage (&msg);
        }
    return msg.wParam;
}

// Windows-Nachrichten-Prozedur
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
char string[255];
static HWND hEdit;
POINT P;

switch (message)
{
    case WM_CREATE:
        hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,1024,768,hwnd, (HMENU)IDC_EDIT,(HINSTANCE) GetModuleHandle(NULL), NULL);
        FontInitialize(hEdit);
        return 0;
    case WM_SETFOCUS:
        SetFocus ( hEdit );
        return 0;
    case WM_SIZE:
        MoveWindow(hEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
        return 0;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_FILE_NEW:
                SetDlgItemText(hwnd, IDC_EDIT, "");
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                    SB_SETTEXT, 0, (LPARAM)"Neue Datei...");
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                    SB_SETTEXT, 1, (LPARAM)"Unbenannt");
                return 0;
            case ID_FILE_OPEN:
                OpenFileBox(hwnd);
                return 0;
            case ID_FILE_SAVE:
                SaveFileBox(hwnd);
                return 0;
            case ID_FILE_EXIT:
                DestroyWindow(hwnd);
                break;
            case ID_FILE_FONT:
                FontChooseFont(hEdit);
                FontSetFont(hEdit);
                return 0;
            case ID_FILE_PRINT:
                PrintFile(hInst,hwnd,hEdit,szFileName);
                return 0;
        }
        return 0;
    case WM_CHAR:
        switch (wParam)
        {
            case VK_CONTROL:
                switch (wParam)
                {
                    case 'a': return 0;
                }
                return 0;
        }
        return 0;
    case WM_CLOSE:
        DestroyWindow(hwnd);
    case WM_DESTROY:
        PostQuitMessage (0);
        return 0;
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}
 
Wenn ich aber jetzt STRG und A drücke, piepst er nur,
Code:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
char string[255];
static HWND hEdit;
POINT P;

switch (message)
{
    case WM_CREATE:
        hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,1024,768,hwnd, (HMENU)IDC_EDIT,(HINSTANCE) GetModuleHandle(NULL), NULL);
        FontInitialize(hEdit);
        return 0;
    case WM_SETFOCUS:
        SetFocus ( hEdit );
        return 0;
    case WM_SIZE:
        MoveWindow(hEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);
        return 0;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
            case ID_FILE_NEW:
                SetDlgItemText(hwnd, IDC_EDIT, "");
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                    SB_SETTEXT, 0, (LPARAM)"Neue Datei...");
                SendDlgItemMessage(hwnd, IDC_MAIN_STATUS,
                    SB_SETTEXT, 1, (LPARAM)"Unbenannt");
                return 0;
            case ID_FILE_OPEN:
                OpenFileBox(hwnd);
                return 0;
            case ID_FILE_SAVE:
                SaveFileBox(hwnd);
                return 0;
            case ID_FILE_EXIT:
                DestroyWindow(hwnd);
                break;
            case ID_FILE_FONT:
                FontChooseFont(hEdit);
                FontSetFont(hEdit);
                return 0;
            case ID_FILE_PRINT:
                PrintFile(hInst,hwnd,hEdit,szFileName);
                return 0;
        }
        return 0;
    case WM_CHAR:
        switch (wParam)
        {
            case VK_CONTROL:
                switch (wParam)
                {
                    case 'a':
                        SendDlgItemMessage(hwnd,IDC_EDIT,EM_SETSEL,0,-1);
                        return 0;
                }
                return 0;
            case VK_DELETE:
                GetCursorPos(&P);
                return 0;
        }
        return 0;
    case WM_CLOSE:
        DestroyWindow(hwnd);
    case WM_DESTROY:
        PostQuitMessage (0);
        return 0;
    }
    return DefWindowProc (hwnd, message, wParam, lParam);
}
 
Achso, ich hab mich zu sehr auf Deine Aussage " Ich habe schon die Abfrage, ob STRG und A gedrückt wurde:" verlassen ;)
Code:
   switch (wParam) <---hier
        {
            case VK_CONTROL:
                switch (wParam) <---und hier
                {
                    case 'a': return 0;
                }
                return 0;
        }
        return 0;
ein sehr interessanter Ansatz, der voraussetzt, dass eine Variable gleichzeitig 2 Werte annehmen kann ;)

Eine genaue Lösung fällt mir im Moment nicht ein (da nie gebraucht bzw alle Tastenkombos bei mir immer == Menühotkeys waren), aber
http://www.codeguru.com/forum/archive/index.php/t-205711.html
sollte ein paar Ideen liefern.

Btw: um die Funktionalität der Abfrage zu testen, solltest Du auch erstmal klassische "MessageBox(geht)" oder Ähnliches verwenden und nicht unbedingt neue Funktion (dann bleibt nämlich immer die Frage was von den beiden Sachen nun nicht geht).
 
Wohin kopieren? Klappt denn schon das Markieren einwandfrei?
Über EM_GETSEL kann man feststellen, wieviele Zeichen markiert wurden
http://msdn.microsoft.com/en-us/library/bb761598(VS.85).aspx
also sowas wie:
SendDlgItemMessage(hwin,IDC_EDIT,startpos,endpos);
dann den nötigen Speicher berechnen:
mybuffer=alloziere(endpos-startpos);
und text hineinkopieren:
SendDlgItemMessage(hwin,IDC_EDIT,EM_GETSELTEXT,0,buffer);
http://msdn.microsoft.com/en-us/library/bb774190(VS.85).aspx

Falls Du auch noch Clipboard/Zwischenablage erreichen willst:
EmptyClipboard
http://msdn.microsoft.com/en-us/library/ms649037(VS.85).aspx
und SetClipBoardData mit CF_TEXT
http://msdn.microsoft.com/en-us/library/ms649051(VS.85).aspx
 
Hallo,

Wenn ich aber
Code:
SendDlgItemMessage(hwnd, hEdit, 0, -1);
schreibe, dann meckert der GNU GCC immer:
E:\CodeBlocks\api\main.cpp:103: error: invalid conversion from `HWND__*' to `int'
E:\CodeBlocks\api\main.cpp:103: error: at this point in file
 
Zurück
Oben