Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Wert aus Editfeldern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.06.2006, 01:29 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hi,

ich hab hier irgendwie ein Problem, den Wert aus nem Editfeld auszulesen.
Vielleicht kann mir ja jemand mal schnell auf die Sprünge helfen ..

C++:
            LPARAM name;
            int length;
            length = SendMessage(hwndTextfield, EM_LINELENGTH, 0, 0);
            name = (LPARAM)calloc(length, sizeof(LPARAM));
            SendMessage(hwndTextfield, EM_GETLINE, 0, name);


name ist leer ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.06.2006, 13:26 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das mit der LPARAM Variablen ist...merkwürdig um es mal vorsichtig zu vormulieren

So sollte es klappen:

C++:
char *name;
int length;
length = SendMessage(hwndTextfield, EM_LINELENGTH, 0, 0);
name = (char*)calloc(length, sizeof(char));
SendMessage(hwndTextfield, EM_GETLINE, 0, (LPARAM)name);


LPARAM ist ein 32 Bit Datentyp.

Wenn dein Edit Control nur eine Zeile hat dann solltest du aber WM_GETTEXTLENGTH und WM_GETTEXT nehmen.



PS @Flosoft: Nicht einfach deinen Post löschen, wenn ich drauf antworte

Dieser Post wurde am 23.06.2006 um 13:27 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.06.2006, 14:08 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Ich poste einfach mal meinen kompletten Quelltext, weil ich es irgendwie nicht gebacken bekomme ...:

C++:
#include <windows.h>
#define ID_button 1
#define ID_textfield 2
#define ID_listbox 3
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(
                   HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   PSTR szCmdLine,
                   int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("HelloWin");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon( NULL, IDI_HAND );
    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if(!RegisterClass(&wndclass))
    {
        MessageBox( NULL,
                    TEXT("Fehler, Programm benötigt UNICODE und somit mindestens Windows NT"),
                    szAppName,
                    MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(
            szAppName,
            TEXT("Test"),
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            NULL,
            NULL,
            hInstance,
            NULL
        );

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

    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

LRESULT CALLBACK WndProc(
                         HWND hwnd,
                         UINT message,
                         WPARAM wParam,
                         LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    switch(message)
    {
    case WM_CREATE:
        HWND hwndButton;
        HWND hwndTextfield;
        HWND hwndList;
        HWND hwndStatic;
        hwndButton = CreateWindow(
            TEXT("Button"),
            TEXT("Send"),
            WS_CHILD | WS_VISIBLE | WS_BORDER,
            0,
            0,
            100, 30, hwnd, (HMENU)ID_button, ((LPCREATESTRUCT) lParam)->hInstance, NULL);

        hwndTextfield = CreateWindow(
            TEXT("edit"),
            NULL,
            WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,
            0, 30, 100, 20, hwnd, (HMENU)ID_textfield,
            ((LPCREATESTRUCT)lParam)->hInstance, NULL);

        hwndList = CreateWindow(
            TEXT("listbox"),
            NULL,
            WS_CHILD | WS_VISIBLE | LBS_STANDARD,
            0, 50,
            100, 80,
            hwnd,
            (HMENU)ID_listbox,
            (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),
            NULL);

        return 0;
    
    case WM_COMMAND:
        if(LOWORD(wParam) == ID_button)
        {
            char *name;
            int length;
            length = SendMessage(hwndTextfield, WM_GETTEXTLENGTH, 0, 0);
            name = (char*)calloc(length, sizeof(char));
            SendMessage(hwndTextfield, WM_GETTEXT, 0, (LPARAM)name);
            SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)name);
        }
        return 0;

    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}


Ich will einfach nur, das beim klicken auf "Send" der Inhalt aus dem Textfeld genommen wird und in der Liste erscheint ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.06.2006, 14:15 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Also erstmal solltest du deine HWND Variablen Global machen damit die immer einen Wert enthalten und nicht nach WM_CREATE verloren gehen. Außerdem musst du bei WM_GETTEXT angeben wieviele Zeichen geholt werden sollen (inklusive abschließender 0).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.06.2006, 14:31 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Es lag Tatsache an den HWNDs. Dank dir, wieder was gelernt !
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.06.2006, 11:48 Uhr
~ManiacL33T
Gast



Zitat von Guybrush Threepwood:
Also erstmal solltest du deine HWND Variablen Global machen damit die immer einen Wert enthalten und nicht nach WM_CREATE verloren gehen. Außerdem musst du bei WM_GETTEXT angeben wieviele Zeichen geholt werden sollen (inklusive abschließender 0).


in vielen büchern etc. lese ich immer das global variablen = böse variablen sind. Ist das bei HWND's eine Ausnahme?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
29.06.2006, 12:24 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das ist Unsinn
Man sollte Variablen natürlich nur global machen wenn man sie auch global braucht um den Platz zu sparen. Es macht z.B. keinen Sinn eine Variable die du nur in einer Funktion brauchst global zu machen, denn dann wird sie beim Starten des Programms angelegt und erst beim Beenden wieder freigegeben. Machst du sie lokal in die Funktion wird sie erst beim Aufruf der Funktion angelegt und nach Beenden der Funktion wieder freigegeben.

Wenn du die Variable aber jetzt überall im Programm brachst und sie nicht per Funktionsparameter übergeben kannst (oder du das dann z.B. an jede Funktion übergeben müsstest) dann macht man die natürlich global.
Dabei ist es unwichtig welchen Typ die Variable hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
29.06.2006, 15:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi, grundsätzlich gilt bei variablen: immer den kleinsten bereich nehmen der geht:

lokaler block
lokale funktion
(klasse)
(namespace)
lokale datei (static)
global
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: