Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinAPI] GetWindowText() nie wczytuje tekstu do bufora

Ostatnio zmodyfikowano 2014-07-08 00:15
Autor Wiadomość
Vister26
Temat założony przez niniejszego użytkownika
» 2014-07-07 23:38:02
Możesz porównać czy uchwyt używany w bloku WM_COMMAND jest identyczny z tym tworzonym wcześniej używając funkcji GetDlgItem( HWND_Rodzica, ID_okna/kontrolki ).
Użyłem tej funkcji. Zwróciło uchwyt do kontrolki hCommandLine, czyli wnioskuje, że tu jest OK.

Chyba najlepiej będzie jak wrzucę cały kod:
C/C++
#if defined(UNICODE) && !defined(_UNICODE)
#define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
#define UNICODE
#endif

#include <tchar.h>
#include <windows.h>
#include <iostream>

#define ID_BUTTON1         101
#define ID_STATICTEXTBOX1  201
#define ID_COMANDLINE      301

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );

/*  Make the class name into a global variable  */
TCHAR szClassName[] = _T( "WindowsApp" );

/* Uchwyty do kontrolek */
HWND hCommandLine;
HWND hExecButton;
HWND hStaticDebugBox;

/* Bufor przechowuje tekst wpisany do textboksa */
LPSTR CommandLineBuf;

using std::cout;
using std::endl;

int WINAPI WinMain( HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow )
{
    HWND hwnd; /* This is the handle for our window */
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */
   
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    wincl.cbSize = sizeof( WNDCLASSEX );
   
    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
    wincl.hCursor = LoadCursor( NULL, IDC_ARROW );
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default colour as the background of the window */
    wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
    /* Register the window class, and if it fails quit the program */
    if( !RegisterClassEx( & wincl ) )
         return 0;
   
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx(
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    _T( "Komunikator WINAPI by Vister26" ), /* Title Text */
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    800, /* The programs width */
    400, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );
   
   
    hStaticDebugBox = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE | SS_LEFT,
    10, 10, 763, 270, hwnd,( HMENU ) ID_STATICTEXTBOX1, hThisInstance, NULL );
   
    hCommandLine = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER,
    10, 290, 763, 20, hwnd,( HMENU ) ID_COMANDLINE, hThisInstance, NULL );
   
    hExecButton = CreateWindowEx( 0, "BUTTON", "Execute", WS_CHILD | WS_VISIBLE,
    660, 320, 100, 30, hwnd,( HMENU ) ID_BUTTON1, hThisInstance, NULL );
   
    SetWindowText( hStaticDebugBox, "test test test test test" );
   
    /* Make the window visible on the screen */
    ShowWindow( hwnd, nCmdShow );
   
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while( GetMessage( & messages, NULL, 0, 0 ) )
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage( & messages );
        /* Send message to WindowProcedure */
        DispatchMessage( & messages );
    }
   
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message ) /* handle the messages */
    {
    case WM_DESTROY:
        PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
        break;
       
    case WM_COMMAND:
        if( wParam == ID_BUTTON1 )
        {
            int czydobrze = 0;
           
            //CommandLineBuf =( LPSTR ) GlobalAlloc( GPTR, GetWindowTextLength( hCommandLine ) + 1 );
           
            czydobrze = GetWindowText( hCommandLine, CommandLineBuf, 50 );
            cout << czydobrze << endl;
            SetDlgItemText( hwnd, ID_STATICTEXTBOX1, CommandLineBuf );
           
            //GlobalFree( CommandLineBuf );
        }
       
        default: /* for messages that we don't deal with */
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}
P-113485
Monika90
» 2014-07-07 23:46:24
CommandLineBuf jest równe NULL
P-113487
Vister26
Temat założony przez niniejszego użytkownika
» 2014-07-07 23:58:43
Dzięki! Ten komentarz rozjaśnił mi umysł ;) Po odkomentowaniu linijki z alokacją i zwalnianiem pamięci program zaczął działać jak należy.

Dziękuję wszystkim za pomoc, w szczególności Monice90!

I jeszcze jedno małe pytanko na koniec: w moim przypadku lepiej jest używać GlobalAlloc() czy LocalAlloc()?
P-113490
Monika90
» 2014-07-08 00:15:06
Nie wiem jaka jest różnica między Global a LocalAlloc. Prawdopodobnie najlepiej jest używać tego co oferuje C++, czyli kontenerów string, vector<char>, albo inteligentnych wskaźników unique_ptr<char[]>.

w Twoim przypadku nawet lokalna tablica mogłaby wystarczyć:
C/C++
if( wParam == ID_BUTTON1 )
{
    const int buffer_size = 256;
    char buffer[ buffer_size ] = { };
    int czydobrze = GetWindowText( hCommandLine, buffer, buffer_size );
    cout << czydobrze << endl;
    SetDlgItemText( hwnd, ID_STATICTEXTBOX1, buffer );
}
P-113491
1 « 2 »
Poprzednia strona Strona 2 z 2