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

[C++, WinAPI] SetWindowText nie działa natychmiast?

Ostatnio zmodyfikowano 2012-12-02 21:24
Autor Wiadomość
GameCrasher87
Temat założony przez niniejszego użytkownika
[C++, WinAPI] SetWindowText nie działa natychmiast?
» 2012-12-02 18:27:25
Witam,
jestem nowy w programowaniu okienkowym. Mam poniższy kod który po kliknięciu w przycisk powinien o pokazać w textboxie "MK".
Program działa ale nie do końca tak jakbym chciał. Mianowicie tekst pokazuje się dopiero po tym jak klikne w textboxa i nacisne jakiś klawisz na klawiaturze. Chciałbym aby od razu tekst pojawił się w textboxie.

C/C++
/*------------------------------------------------------------
   HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
                 (c) Charles Petzold, 1998
  ------------------------------------------------------------*/

#include <windows.h>
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
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;
    HWND g_hPrzycisk;
    HWND tekstbox;
   
   
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wndclass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndclass.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;
   
    if( !RegisterClass( & wndclass ) )
    {
        MessageBox( NULL, TEXT( "This program requires Windows NT!" ),
        szAppName, MB_ICONERROR );
        return 0;
    }
   
    hwnd = CreateWindow( szAppName, // window class name
    TEXT( "The Hello Program" ), // window caption
    WS_OVERLAPPEDWINDOW, // window style
    CW_USEDEFAULT, // initial x position
    CW_USEDEFAULT, // initial y position
    CW_USEDEFAULT, // initial x size
    CW_USEDEFAULT, // initial y size
    NULL, // parent window handle
    NULL, // window menu handle
    hInstance, // program instance handle
    NULL ); // creation parameters
   
    g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Wczytaj Plik", WS_CHILD | WS_VISIBLE,
    0, 0, 150, 30, hwnd, NULL, hInstance, NULL );
   
    tekstbox = CreateWindowEx( 0, "EDIT", " ", WS_CHILD | WS_VISIBLE | WS_BORDER,
    0, 100, 250, 200, hwnd, 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;
    LPSTR Bufor;
    DWORD dwRozmiar, dwPrzeczyt;
    HANDLE hPlik;
    TCHAR mk[] = "Marcinek";
    HWND g_hPrzycisk;
    HWND tekstbox;
   
   
    switch( message )
    {
       
    case WM_COMMAND:
        if( g_hPrzycisk ) {
            SetWindowText( tekstbox, "MK" );
        }
       
       
       
       
       
    case WM_PAINT:
        hdc = BeginPaint( hwnd, & ps );
       
        GetClientRect( hwnd, & rect );
       
        DrawText( hdc, mk, - 1, & rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER );
       
        EndPaint( hwnd, & ps );
        return 0;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        return 0;
    }
    return DefWindowProc( hwnd, message, wParam, lParam );
}
P-70251
DejaVu
» 2012-12-02 20:12:32
Czemu w jednym kawałku kodu dwukrotnie wywołujesz SetWindowText?
P-70252
GameCrasher87
Temat założony przez niniejszego użytkownika
» 2012-12-02 20:38:08
Po prostu zapomniałem usunąć. Zedytowałem post.
P-70254
DejaVu
» 2012-12-02 20:55:40
Wywołaj poniższą funkcję po zmianie tekstu.
C/C++
::InvalidateRect( hwnd, NULL, TRUE );
P-70255
GameCrasher87
Temat założony przez niniejszego użytkownika
» 2012-12-02 21:01:51
Próbowałem wstawić InvalidateRect( hwnd, NULL, TRUE ); i InvalidateRect( tekstbox, NULL, TRUE ); nawet UpdateWindow (hwnd) ; i UpdateWindow (tekstbox) ;
Niestety to samo:(
P-70256
xevuel
» 2012-12-02 21:04:01
C/C++
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow )
{
    static TCHAR szAppName[] = TEXT( "HelloWin" );
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    HWND g_hPrzycisk;

C/C++
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
   
   
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;
    LPSTR Bufor;
    DWORD dwRozmiar, dwPrzeczyt;
    HANDLE hPlik;
    TCHAR mk[] = "Marcinek";
    HWND g_hPrzycisk;
    HWND tekstbox;
Zagadka: do czego uchwytem są g_hPrzycisk i tekstbox?

Dodatkowo po każdym WM_COMMAND wywoła się WM_PAINT, to celowe?
P-70257
GameCrasher87
Temat założony przez niniejszego użytkownika
» 2012-12-02 21:24:11
OK wszystko poprawiłem i działa. Dzięki za zagadkę.
P-70259
« 1 »
  Strona 1 z 1