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

WM PAINT WIN API

Ostatnio zmodyfikowano 2013-01-04 17:47
Autor Wiadomość
miadko
Temat założony przez niniejszego użytkownika
WM PAINT WIN API
» 2013-01-02 20:39:34
Witajcie

Czy istnieje jakaś komenda/makro/funkcja, żeby można było wyczyścić w trakcie działania programu wszystko to, co naskrobałem w moim okieneczku obsługując WM_PAINT:  (funkcja LRESULT CALLBACK)?
A jeżeli nie ma, jest możliwosć zmiany moich malowideł na inne w trakcie działąnia mojego programu?
Z góry dzięki za odpowiedź

P-72785
xevuel
» 2013-01-02 20:44:01
A nie możesz zamalować okna na biało/czarno/cokolwiek?
P-72788
miadko
Temat założony przez niniejszego użytkownika
» 2013-01-02 22:02:27
Bo chciałem zrobić program, w którym znajduje się okienko dialogowe, gdzie można wybrać i język programu, i kolor okna.
Procedura mojego okna to (do przycisku OK):
C/C++
case ID_BUTTON1:
{
    HWND hCombo = GetDlgItem( hwnd, ID_COMBOBOX1 );
    HWND h2Combo = GetDlgItem( hwnd, ID_COMBOBOX2 );
    int combo = ComboBox_GetCurSel( hCombo );
    int combox = ComboBox_GetCurSel( h2Combo );
    if( combo == 0 )
    {
        if( combox == 0 )
             EndDialog( hwnd, 700 );
        else if( combox == 1 )
             EndDialog( hwnd, 701 );
        else if( combox == 2 )
             EndDialog( hwnd, 702 );
        else if( combox == 3 )
             EndDialog( hwnd, 703 );
        else if( combox == 4 )
             EndDialog( hwnd, 704 );
        else if( combox == 5 )
             EndDialog( hwnd, 705 );
       
    }
    else if( combo == 1 )
    {
        if( combox == 0 )
             EndDialog( hwnd, 900 );
        else if( combox == 1 )
             EndDialog( hwnd, 901 );
        else if( combox == 2 )
             EndDialog( hwnd, 902 );
        else if( combox == 3 )
             EndDialog( hwnd, 903 );
        else if( combox == 4 )
             EndDialog( hwnd, 904 );
        else if( combox == 5 )
             EndDialog( hwnd, 905 );
       
    }
}; break;

Wszystko było już podeklarowane, plik zasobów jest zrobiony.
Pod WIN MAIN w funkcji LRESULT CALLBACK napisałem:
C/C++
case WM_PAINT:
{
    if( ret == 0 || ret == 700 || ret == 900 )
         standard( hWnd, Ps, hDC );
    else if( ret == 701 || ret == 901 )
         czerwony( hWnd, Ps, hDC );
   
}
break;

Funkcja standard to:
C/C++
void standard( HWND hWnd, PAINTSTRUCT Ps, HDC hdC )
{
    hdC = BeginPaint( hWnd, & Ps );
    HBRUSH Pedzel1, Pudelko2;
    HPEN Olowek1, Piornik2;
    Pedzel1 = CreateSolidBrush( 0xA6EEA2 );
    Olowek1 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko2 =( HBRUSH ) SelectObject( hdC, Pedzel1 );
    Piornik2 =( HPEN ) SelectObject( hdC, Olowek1 );
    Rectangle( hdC, - 1, - 1, 431, 500 );
    HBRUSH Pedzel4, Pudelko4;
    HPEN Olowek4, Piornik4;
    Pedzel4 = CreateSolidBrush( 0x56DF4F );
    Olowek4 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko4 =( HBRUSH ) SelectObject( hdC, Pedzel4 );
    Piornik4 =( HPEN ) SelectObject( hdC, Olowek4 );
    Rectangle( hdC, 431, - 1, 800, 500 );
    HBRUSH Pedzel3, Pudelko3;
    HPEN Olowek3, Piornik3;
    Pedzel3 = CreateSolidBrush( 0xF0F0F0 );
    Olowek3 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko3 =( HBRUSH ) SelectObject( hdC, Pedzel3 );
    Piornik3 =( HPEN ) SelectObject( hdC, Olowek3 );
    Rectangle( hdC, 137, 250, 287, 400 );
    HBRUSH PedzelZiel, Pudelko;
    HPEN OlowekCzerw, Piornik;
    PedzelZiel = CreateSolidBrush( 0x27AE20 );
    OlowekCzerw = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko =( HBRUSH ) SelectObject( hdC, PedzelZiel );
    Piornik =( HPEN ) SelectObject( hdC, OlowekCzerw );
    Rectangle( hdC, 30, 30, 195, 225 );
    SelectObject( hdC, Pudelko );
    SelectObject( hdC, Piornik );
    DeleteObject( OlowekCzerw );
    DeleteObject( PedzelZiel );
    HBRUSH PedzelNieb, Pudelko1;
    HPEN OlowekCzarny, Piornik1;
    PedzelNieb = CreateSolidBrush( 0x27AE20 );
    OlowekCzarny = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko1 =( HBRUSH ) SelectObject( hdC, PedzelNieb );
    Piornik1 =( HPEN ) SelectObject( hdC, OlowekCzarny );
    Rectangle( hdC, 230, 30, 395, 225 );
    POINT stary;
    MoveToEx( hdC, 187, 250, & stary );
    LineTo( hdC, 187, 400 );
    MoveToEx( hdC, 237, 250, & stary );
    LineTo( hdC, 237, 400 );
    MoveToEx( hdC, 137, 250, & stary );
    LineTo( hdC, 137, 400 );
    MoveToEx( hdC, 287, 250, & stary );
    LineTo( hdC, 287, 400 );
    MoveToEx( hdC, 288, 251, & stary );
    LineTo( hdC, 288, 401 );
    MoveToEx( hdC, 289, 252, & stary );
    LineTo( hdC, 289, 402 );
    MoveToEx( hdC, 137, 250, & stary );
    LineTo( hdC, 287, 250 );
    MoveToEx( hdC, 137, 300, & stary );
    LineTo( hdC, 287, 300 );
    MoveToEx( hdC, 137, 350, & stary );
    LineTo( hdC, 287, 350 );
    MoveToEx( hdC, 137, 400, & stary );
    LineTo( hdC, 288, 400 );
    MoveToEx( hdC, 138, 401, & stary );
    LineTo( hdC, 289, 401 );
    MoveToEx( hdC, 139, 402, & stary );
    LineTo( hdC, 290, 402 );
    MoveToEx( hdC, 430, 25, & stary );
    LineTo( hdC, 430, 425 );
    MoveToEx( hdC, 430, 416, & stary );
    LineTo( hdC, 730, 416 );
    MoveToEx( hdC, 430, 415, & stary );
    LineTo( hdC, 730, 415 );
    MoveToEx( hdC, 430, 32, & stary );
    LineTo( hdC, 730, 32 );
    MoveToEx( hdC, 430, 33, & stary );
    LineTo( hdC, 730, 33 );
    MoveToEx( hdC, 31, 225, & stary );
    LineTo( hdC, 196, 225 );
    MoveToEx( hdC, 32, 226, & stary );
    LineTo( hdC, 197, 226 );
    MoveToEx( hdC, 231, 225, & stary );
    LineTo( hdC, 396, 225 );
    MoveToEx( hdC, 232, 226, & stary );
    LineTo( hdC, 397, 226 );
    MoveToEx( hdC, 195, 31, & stary );
    LineTo( hdC, 195, 226 );
    MoveToEx( hdC, 196, 32, & stary );
    LineTo( hdC, 196, 227 );
    MoveToEx( hdC, 395, 31, & stary );
    LineTo( hdC, 395, 226 );
    MoveToEx( hdC, 396, 32, & stary );
    LineTo( hdC, 396, 227 );
    EndPaint( hWnd, & Ps );
    EndPaint( hWnd, & Ps );
}

a funkcja czerwony to:
C/C++
void czerwony( HWND hWnd, PAINTSTRUCT Ps, HDC hdC )
{
    hdC = BeginPaint( hWnd, & Ps );
    HBRUSH Pedzel1, Pudelko2;
    HPEN Olowek1, Piornik2;
    Pedzel1 = CreateSolidBrush( 0x7282F3 );
    Olowek1 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko2 =( HBRUSH ) SelectObject( hdC, Pedzel1 );
    Piornik2 =( HPEN ) SelectObject( hdC, Olowek1 );
    Rectangle( hdC, - 1, - 1, 431, 500 );
    HBRUSH Pedzel4, Pudelko4;
    HPEN Olowek4, Piornik4;
    Pedzel4 = CreateSolidBrush( 0x241CED );
    Olowek4 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko4 =( HBRUSH ) SelectObject( hdC, Pedzel4 );
    Piornik4 =( HPEN ) SelectObject( hdC, Olowek4 );
    Rectangle( hdC, 431, - 1, 800, 500 );
    HBRUSH Pedzel3, Pudelko3;
    HPEN Olowek3, Piornik3;
    Pedzel3 = CreateSolidBrush( 0xF0F0F0 );
    Olowek3 = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko3 =( HBRUSH ) SelectObject( hdC, Pedzel3 );
    Piornik3 =( HPEN ) SelectObject( hdC, Olowek3 );
    Rectangle( hdC, 137, 250, 287, 400 );
    HBRUSH PedzelZiel, Pudelko;
    HPEN OlowekCzerw, Piornik;
    PedzelZiel = CreateSolidBrush( 0x241CED );
    OlowekCzerw = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko =( HBRUSH ) SelectObject( hdC, PedzelZiel );
    Piornik =( HPEN ) SelectObject( hdC, OlowekCzerw );
    Rectangle( hdC, 30, 30, 195, 225 );
    SelectObject( hdC, Pudelko );
    SelectObject( hdC, Piornik );
    DeleteObject( OlowekCzerw );
    DeleteObject( PedzelZiel );
    HBRUSH PedzelNieb, Pudelko1;
    HPEN OlowekCzarny, Piornik1;
    PedzelNieb = CreateSolidBrush( 0x241CED );
    OlowekCzarny = CreatePen( PS_SOLID, 1, 0x000000 );
    Pudelko1 =( HBRUSH ) SelectObject( hdC, PedzelNieb );
    Piornik1 =( HPEN ) SelectObject( hdC, OlowekCzarny );
    Rectangle( hdC, 230, 30, 395, 225 );
    POINT stary;
    MoveToEx( hdC, 187, 250, & stary );
    LineTo( hdC, 187, 400 );
    MoveToEx( hdC, 237, 250, & stary );
    LineTo( hdC, 237, 400 );
    MoveToEx( hdC, 137, 250, & stary );
    LineTo( hdC, 137, 400 );
    MoveToEx( hdC, 287, 250, & stary );
    LineTo( hdC, 287, 400 );
    MoveToEx( hdC, 288, 251, & stary );
    LineTo( hdC, 288, 401 );
    MoveToEx( hdC, 289, 252, & stary );
    LineTo( hdC, 289, 402 );
    MoveToEx( hdC, 137, 250, & stary );
    LineTo( hdC, 287, 250 );
    MoveToEx( hdC, 137, 300, & stary );
    LineTo( hdC, 287, 300 );
    MoveToEx( hdC, 137, 350, & stary );
    LineTo( hdC, 287, 350 );
    MoveToEx( hdC, 137, 400, & stary );
    LineTo( hdC, 288, 400 );
    MoveToEx( hdC, 138, 401, & stary );
    LineTo( hdC, 289, 401 );
    MoveToEx( hdC, 139, 402, & stary );
    LineTo( hdC, 290, 402 );
    MoveToEx( hdC, 430, 25, & stary );
    LineTo( hdC, 430, 425 );
    MoveToEx( hdC, 430, 416, & stary );
    LineTo( hdC, 730, 416 );
    MoveToEx( hdC, 430, 415, & stary );
    LineTo( hdC, 730, 415 );
    MoveToEx( hdC, 430, 32, & stary );
    LineTo( hdC, 730, 32 );
    MoveToEx( hdC, 430, 33, & stary );
    LineTo( hdC, 730, 33 );
    MoveToEx( hdC, 31, 225, & stary );
    LineTo( hdC, 196, 225 );
    MoveToEx( hdC, 32, 226, & stary );
    LineTo( hdC, 197, 226 );
    MoveToEx( hdC, 231, 225, & stary );
    LineTo( hdC, 396, 225 );
    MoveToEx( hdC, 232, 226, & stary );
    LineTo( hdC, 397, 226 );
    MoveToEx( hdC, 195, 31, & stary );
    LineTo( hdC, 195, 226 );
    MoveToEx( hdC, 196, 32, & stary );
    LineTo( hdC, 196, 227 );
    MoveToEx( hdC, 395, 31, & stary );
    LineTo( hdC, 395, 226 );
    MoveToEx( hdC, 396, 32, & stary );
    LineTo( hdC, 396, 227 );
    EndPaint( hWnd, & Ps );
}

Problem mam jednak taki, że kiedy okienko zwróci 701 lub 901, nie robi się czerwono... i nie mogę własnie dojść co robię źle. Dlatego spytałem się o funkcję czyszczącą, bo może moje pierwotne malowidła wadzą, ale jak stwierdziłeś, że zamaluj czymkolwiek, to spróbowałem zamalować to co narysowałem w funkcji standard tym co narysowałem w funkcji czerwony.
combo odnosi się do comboboxa z wyborem języka, a combox do wyboru kolorku.
Sprawdziłem na innym okienku, do którego wkleiłem od razu do WM_PAINT procedurę na malowanie w odcieniach zielonych i procedurę na malowanie na czerwono i one normalnie działają, tak jak to zrobiłem coś niedostyka...

Z góry dzięki za podpowiedź, gdzie popełniam błąd.

P-72796
miadko
Temat założony przez niniejszego użytkownika
» 2013-01-04 17:41:57
Nikt nie wie, gdzie mogłem popełnić błąd? ;(
Chciałbym bardzo taki program napisac, a nie wiem, gdzie robię błąd...
P-72905
kubawal
» 2013-01-04 17:47:03
C/C++
//gdy trzeba odmalowac okienko:
InvalidateRect( hWnd, NULL, TRUE );

I tyle :)
P-72906
« 1 »
  Strona 1 z 1