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

[WinAPI, C++] Umieszczanie przycisków, a WM_PAINT

Ostatnio zmodyfikowano 2013-09-24 19:50
Autor Wiadomość
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:
C/C++
if( !RegisterClassEx( & wc1 ) ) {
    MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
    return 0;
}
Oto kod z WM_Paint:
C/C++
case WM_PAINT:

//polecenia dla komunikatu WM_PAINT
// text = BeginPaint( hwnd, & ps );
//Tutaj ta funkcja:
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 :(
P-92607
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'.
P-92608
CodeMeister
» 2013-09-24 18:13:09
http://darkcult.nazwa.pl/wiki​/index.php/Kontrolki


HWND g_hPrzycisk;

...i tworzymy (wewnątrz WinMain):
C/C++
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
P-92609
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:
C/C++
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ę:
C/C++
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 :)
P-92612
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 :)
P-92615
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 ;/
P-92617
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.
P-92619
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)
P-92620
« 1 » 2
  Strona 1 z 2 Następna strona