pawellek1995 Temat założony przez niniejszego użytkownika |
[WinAPI, C++] Umieszczanie przycisków, a WM_PAINT » 2013-09-24 17:37:30 Witam,
Mam problem gdyż chcę umieścić przycisk w okienku lecz on po odświeżaniu znika. Mam pętle komunikatów WM_Paint i tam maluje różne kreski linie i chcę aby obok był także ten przycisk lecz jak już napisałem wyżej on po prostu znika. Przycisk umieszczam po:
if( !RegisterClassEx( & wc1 ) ) { MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK ); return 0; }
Oto kod z WM_Paint:
case WM_PAINT:
okno = GetDC( hwnd ); for( int i = 0; i <= 20; i++ ) { MoveToEx( okno, 0 + x,( 50 * i ) + y, NULL ); LineTo( okno, 2000 + x,( 50 * i ) + y ); } for( int i = 0; i <= 20; i++ ) { MoveToEx( okno,( 100 * i ) + x, 0 + y, NULL ); LineTo( okno,( 100 * i ) + x, 1000 + y ); } for( int i = 0; i < 20; i++ ) { sprintf( buf, "%d", i ); TextOut( okno, 50 +( 100 * i ) + x, - 50 + y, buf, strlen( buf ) ); TextOut( okno, 50 +( 100 * i ) + x, 1020 + y, buf, strlen( buf ) ); } for( int i = 0; i < 20; i++ ) { sprintf( buf, "%d", i ); TextOut( okno, - 50 + x, 20 +( 50 * i ) + y, buf, strlen( buf ) ); TextOut( okno, 2050 + x, 20 +( 50 * i ) + y, buf, strlen( buf ) ); } for( int i = 0; i < 20; i++ ) { for( int o = 0; o < 20; o++ ) { wsp[ i ][ o ] = "1234567890"; TextOut( okno, 5 +( 100 * i ) + x, 5 +( 50 * o ) + y, wsp[ i ][ o ], strlen( wsp[ i ][ o ] ) ); } }
Poszukałem chwile i znalazłem iż kontrolki umieszcza się w WM_CREATE ale gdy ją tam umieszczę także znika :( |
|
DejaVu |
» 2013-09-24 18:11:22 Z chwilą przechwytywania komunikatu WM_PAINT jesteś zmuszony do samodzielnej obsługi rysowania wszystkiego w kontekście okna - w tym również przycisków. Przyciski powinny być odmalowane np. poprzez wywołanie domyślnego WM_PAINT-a. Domyślny WM_PAINT zapewniał, że przyciski były odmalowywane kiedy zachodziła potrzeba, a Ty ten kod 'wyciąłeś' informując, że 'Ty chcesz sam decydować o tym co i kiedy ma być rysowane'. |
|
CodeMeister |
» 2013-09-24 18:13:09 http://darkcult.nazwa.pl/wiki/index.php/Kontrolki
HWND g_hPrzycisk; ...i tworzymy (wewnątrz WinMain):
g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Nasz przycisk", WS_CHILD | WS_VISIBLE, 100, 100, 150, 30, hwnd, NULL, hInstance, NULL ); Kod z tego przykładu należy wkleić tuż po instrukcji tworzącej okienko główne
|
//Edited |
|
pawellek1995 Temat założony przez niniejszego użytkownika |
» 2013-09-24 19:05:31 Chodzi mi o to żebym mógł np. strzałkami przesuwać kontrolkę bo napisalem taki kod: case WM_KEYDOWN: switch(( int ) wPar ) { case VK_RIGHT: if( HIBYTE( GetKeyState( VK_CONTROL ) ) ) { x = x - 100; UpdateWindow( hwnd ); } else { x = x - 10; UpdateWindow( hwnd ); } break; case VK_LEFT: if( HIBYTE( GetKeyState( VK_CONTROL ) ) ) { x = x + 100; UpdateWindow( hwnd ); } else { x = x + 10; UpdateWindow( hwnd ); } break; case VK_DOWN: if( HIBYTE( GetKeyState( VK_CONTROL ) ) ) { y = y - 100; UpdateWindow( hwnd ); } else { y = y - 10; UpdateWindow( hwnd ); } break; case VK_UP: if( HIBYTE( GetKeyState( VK_CONTROL ) ) ) { y = y + 100; UpdateWindow( hwnd ); } else { y = y + 10; UpdateWindow( hwnd ); } break; } InvalidateRect( hwnd, NULL, TRUE ); break;
zmienna x i y przetrzymuje zmienne i dzięki temu mogę przesuwać linie za pomoca strzałek czyli tak jakby cały obraz itp.. ale wlasnie nie wiem jak gdzie umieścić tą kontrolkę: hwczytaj = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "WCZYTAJ", WS_CHILD | WS_VISIBLE, 1000 + x, 5 + y, 100, 50, menu,( HMENU ) ID_hwczytaj, hInstance, NULL );
Jak chciałem ją umieścić w WM_PAINT: to mi błąd wywalało. CodeMeister dzięki za linka bardzo przydatna stronka :) |
|
CodeMeister |
» 2013-09-24 19:09:29 Swoją drogą z tego co pamiętam to kurs na tym serwisie jest kopią z darkculta ;)
//Edit yup, copy :) |
|
pawellek1995 Temat założony przez niniejszego użytkownika |
» 2013-09-24 19:15:06 Poza tym jak by ktoś mógł polecić jakis dobry kompilator pod win 7 64 bit bo dev ciągle mi błędy wywala ;/ |
|
DejaVu |
» 2013-09-24 19:16:12 Ja bym proponował utworzyć static-a i dla niego zmienić wm_paint-a, a wm_painta okna dialogowego (czy też okna aplikacji) pozostawić domyślnego. Wówczas możesz określić sobie powierzchnię do rysowania i ustawić dodatkowe przyciski w miejscach, które nie nachodzą na wspomnianego static-a.
/edit:
@up: jeden temat = jeden problem. |
|
CodeMeister |
» 2013-09-24 19:17:44 heh :)
Nie powinno się już używać deva - jest już mocno przestarzały. Polecam CodeBlocks a jeśli chcesz pisać w winAPI to raczej MS Visual C++ ale on jest płatny. chyba że kupisz go na torrentach czy coś. Oczywiście wszyscy są przeciwni takiemu czynowi (taa, xD) |
|
« 1 » 2 |