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.
#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, TEXT( "The Hello Program" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); 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 ); }
|
|
DejaVu |
» 2012-12-02 20:12:32 Czemu w jednym kawałku kodu dwukrotnie wywołujesz SetWindowText? |
|
GameCrasher87 Temat założony przez niniejszego użytkownika |
» 2012-12-02 20:38:08 Po prostu zapomniałem usunąć. Zedytowałem post. |
|
DejaVu |
» 2012-12-02 20:55:40 Wywołaj poniższą funkcję po zmianie tekstu. ::InvalidateRect( hwnd, NULL, TRUE );
|
|
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:( |
|
xevuel |
» 2012-12-02 21:04:01 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;
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? |
|
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ę. |
|
« 1 » |