Problem z SDLem i WinAPI w jednym oknie

0

Witam,

Mam problem z WinAPI. Mam program napisany praktycznie w całości napisany w SDLu, no i potrzebowałem tylko okienka "Otwórz jako...". Postępowałem zgodnie ze stroną http://darkcult.gamedev.pl/ gdzie jest opisane takie okienko. No i... program działa bez zarzutu, ale kiedy wywołuję to okienko (poprzez przycisk) wtedy muszę sporo czekać (jakieś pięć sekund) zanim program wróci do normy. Jak to można przyspieszyć? Przecież nawet w takim Paincie szybciej to idzie, pomimo, że są takie same okna... Czy to może być coś z SDLem? Poza tym jakby tego było mało, to niektóre kontrolki (chodzi o przyciski) zaczynają świrować (np. podświetkać się), zwłaszcza, że tam nie było w ogóle myszki.

Ktoś mi na którymś forum zapytał się o jakiejś obsłudze komunikatów (dokładnie: "A w jaki sposób w SDL'u podpiąłeś swoją obsługę komunikatów? Bo sdl chyba nie ma takiej opcji, albo ja o tym nie wiem?"). Że nie bardzo czaję o co chodzi, a nie chciałbym się uczyć całego WinAPI, bo nie mam teraz na to czasu (potrzebuję szybko wyjaśnić o co chodzi - proszę nie pytajcie dlaczego).

Funkcja wygląda tak:

int window_open_image(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil, char *temp)

{    
     SDL_Surface *tytul, *tekst;
     bool already = false;
     OPENFILENAME ofn;
     ZeroMemory(&ofn,sizeof(ofn));
     ofn.lStructSize = sizeof(OPENFILENAME);
     ofn.hwndOwner = NULL;
     ofn.lpstrFilter = "Obraz PNG\0*.png\0Obraz JPEG\0*.jpg;*.jpeg\0Bitmapy BMP\0*.bmp\0";
     char sNazwaPliku[MAX_PATH] = ""; 
     ofn.nMaxFile = MAX_PATH;
     ofn.lpstrFile = sNazwaPliku;
     ofn.lpstrDefExt = "png";
     ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
     if(GetOpenFileName(&ofn))
     {
      strcpy(temp,sNazwaPliku);
     }
     else return 0;
}

a wywołuję ją po naciśnięciu przycisku:

   
if(otworz.pressed)
   {
    if(window_open_image((HINSTANCE)1,NULL," ",0,temp.wallpaper));
    otworz.pressed = false;
   }

Z góry dzięki za pomoc

0

odlacz rysowanie przed wywoalniem okna po zamknieciu przywroc moze pomoze

0

Raczej pokaz gdzie i w jaki sposob wywolujesz odrysowywanie w SDL. Kolejka komunikatow to kluczowe zagadnienie, decydujace kiedy twoja grafika ma byc odrysowywana.

0

Rysowanie chodzi wam o SDL_Flip() ??

Zauważyłem jedną ciekawą rzecz - że kiedy okno WinAPI jest włączone żadna kontrolka wtedy nie działa. Ale chyba on zapamiętuję trasę myszki (nie umiem tego wyjaśnić!) i po zamknięciu okna stara się ją odtworzyć. tutaj zarzucam funkcję:

int settings_tapeta(int x, int y)
{
 /*
 
  CHANGEABLE
 
 */
 fstream pliczek((char*)"./temp/wallpaper.tmp",ios::in);
 apperance_options temp;
 {
  temp = main_apperance;
 }
 char przyklad[18];
 SDL_Event event;
 SDL_Surface *tekst;
 bool quit = false;
 
 clear_place(x + 170, y + 83);
 
 /*
 
   CREATE BUTTONS AND OTHERS
 
 */

 button anuluj(x + 10, y + 410,"Anuluj",ICON,"./images/system/icons/stop_mini.png");
 button potwierdz(x + 340, y + 410,"Potwierdz",ICON,"./images/system/icons/info_mini.png");
 button reset(x + 240, y + 410,"Resetuj",ICON,"./images/system/icons/warning_mini.png");
 button otworz(x + 300, y + 340,"Wybierz...",NO_ICON);
 choose_box tapeta(x + 170, y + 60,"Tapeta");
 choose_box styl(x + 250, y + 60,"Styl");
 
 //
 
 choose_true_false pierwszy(x + 350,y + 140,"");
 choose_true_false drugi(x + 400,y + 140,"");
 choose_true_false trzeci(x + 350,y + 180,"");
 choose_true_false czwarty(x + 400,y + 180,"");
 choose_true_false piaty(x + 375,y + 160,"");
 
 //
 
 multibox_button tapeta1(x + 170,y + 130,"We like peppers"," ",START);
 multibox_button tapeta2(x + 170,y + 160,"Kubuntu ring"," ");
 multibox_button tapeta3(x + 170,y + 190,"Egsistence"," ");
 multibox_button tapeta4(x + 170,y + 220,"Binar"," ",END);
 
 //
 
 multibox_button silnik(x + 10,y + 60,"Silnik","./images/system/icons/gear.png",START);
 multibox_button ekrann(x + 10,y + 90,"Ekran","./images/system/icons/desktop.png");
 multibox_button dzwiek(x + 10,y + 150,"Dzwiek","./images/system/icons/sound.png");
 multibox_button bezpieczenstwo(x + 10,y + 180,"Bezpieczenstwo","./images/system/icons/security.png");
 multibox_button inne(x + 10,y + 210,"Inne","./images/system/icons/ok.png");
 multibox_button clear2(x + 10,y + 240," "," ");
 multibox_button clear31(x + 10,y + 270," "," ");
 multibox_button clear32(x + 10,y + 300," "," ");
 multibox_button clear33(x + 10,y + 330," "," ");
 multibox_button clear4(x + 10,y + 360," "," ", END);
 
 insert_box blabla(x + 170,y + 300);
 
 //
 
 tekst = TTF_RenderUTF8_Solid(big_antykwa, (char*)"Tapeta:", kolor_czarny);
 load_surface(x + 170, y + 80,tekst,ekran);
 tekst = TTF_RenderUTF8_Solid(antykwa, (char*)"Dostępne tapety:", kolor_czarny);
 load_surface(x + 170, y + 110,tekst,ekran);
 tekst = TTF_RenderUTF8_Solid(antykwa, (char*)"Położenie:", kolor_czarny);
 load_surface(x + 370, y + 110,tekst,ekran);
 tekst = TTF_RenderUTF8_Solid(antykwa, (char*)"Wybierz inną tapetę:", kolor_czarny);
 load_surface(x + 170, y + 340,tekst,ekran);
 switch(temp.wallpaper_location)
 {
  case 0:
  {
   if(pierwszy.true_false_events(x + 351, y + 141,true)) pierwszy.show();
   pierwszy.pressed = true;
   drugi.pressed = false;
   trzeci.pressed = false;
   czwarty.pressed = false;
   piaty.pressed = false;
  }
  case 1:
  {
   if(drugi.true_false_events(x + 401, y + 141,true)) drugi.show();
   pierwszy.pressed = false;
   drugi.pressed = true;
   trzeci.pressed = false;
   czwarty.pressed = false;
   piaty.pressed = false;
  }
  case 2:
  {
   if(trzeci.true_false_events(x + 351, y + 181,true)) trzeci.show();
   pierwszy.pressed = false;
   drugi.pressed = false;
   trzeci.pressed = true;
   czwarty.pressed = false;
   piaty.pressed = false;
  }
  case 3:
  {
   if(czwarty.true_false_events(x + 401, y + 181,true)) czwarty.show();
   pierwszy.pressed = false;
   drugi.pressed = false;
   trzeci.pressed = false;
   czwarty.pressed = true;
   piaty.pressed = false;
  }
  case 4:
  {
   if(piaty.true_false_events(x + 376, y + 161,true)) piaty.show();
   pierwszy.pressed = false;
   drugi.pressed = false;
   trzeci.pressed = false;
   czwarty.pressed = false;
   piaty.pressed = true;
  }
 }  
 SDL_Flip(ekran);
 while(quit != true)
 {
  while(SDL_PollEvent(&event))
  {
   pressed = false;
   if( event.type == SDL_MOUSEMOTION ) 
   {
    mouse_x = event.motion.x;
    mouse_y = event.motion.y; 
   }
   if( event.type == SDL_MOUSEBUTTONDOWN )
   {
    if( event.button.button == SDL_BUTTON_LEFT )
    {
     pressed = true;
    }
    else pressed = false;
   }
   /*
   
    BUTTONS REACTIONS
   
   */
   if(anuluj.button_events(mouse_x, mouse_y,pressed)) anuluj.show();
   if(potwierdz.button_events(mouse_x, mouse_y,pressed)) potwierdz.show();
   if(reset.button_events(mouse_x, mouse_y,pressed)) reset.show();
   if(otworz.button_events(mouse_x, mouse_y,pressed)) otworz.show();
   if(tapeta.box_events(mouse_x, mouse_y,pressed)) tapeta.show();
   if(tapeta.pressed);
   if(styl.box_events(mouse_x, mouse_y,pressed)) styl.show();
   if(styl.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return STYLE;
   }   
   if(silnik.multibox_button_events(mouse_x, mouse_y,pressed)) silnik.show();
   if(silnik.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return ENGINE;
   }
   if(ekrann.multibox_button_events(mouse_x, mouse_y,pressed)) ekrann.show();
   if(ekrann.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return WINDOW;
   }
   if(dzwiek.multibox_button_events(mouse_x, mouse_y,pressed)) dzwiek.show();
   if(dzwiek.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return SOUNDS;
   }
   if(bezpieczenstwo.multibox_button_events(mouse_x, mouse_y,pressed)) bezpieczenstwo.show();
   if(bezpieczenstwo.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return SECURITY;
   }
   if(inne.multibox_button_events(mouse_x, mouse_y,pressed)) inne.show();
   if(inne.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return OTHER;
   }
   if(anuluj.pressed)
   {
    check_and_drop_ap(temp,x,y);
    return 100;
   }
   if(potwierdz.pressed)
   {
    save_options_ap(temp);
    return 101;
   }
   /*
  
  
   */
    if(pierwszy.true_false_events(mouse_x, mouse_y,pressed)) pierwszy.show();
    if(pierwszy.pressed)
    {
     drugi.pressed = false;
     trzeci.pressed = false;
     czwarty.pressed = false;
     piaty.pressed = false;
     pierwszy.show();
     drugi.show();
     trzeci.show();
     czwarty.show();
     piaty.show();
     temp.wallpaper_location = 0;
    }
    if(drugi.true_false_events(mouse_x, mouse_y,pressed)) drugi.show();
    if(drugi.pressed)
    {
     pierwszy.pressed = false;
     trzeci.pressed = false;
     czwarty.pressed = false;
     piaty.pressed = false;
     pierwszy.show();
     drugi.show();
     trzeci.show();
     czwarty.show();
     piaty.show();
     temp.wallpaper_location = 1;
    }
    if(trzeci.true_false_events(mouse_x, mouse_y,pressed)) trzeci.show();
    if(trzeci.pressed)
    {
     pierwszy.pressed = false;
     drugi.pressed = false;
     czwarty.pressed = false;
     piaty.pressed = false;
     pierwszy.show();
     drugi.show();
     trzeci.show();
     czwarty.show();
     piaty.show();
     temp.wallpaper_location = 2;
    }
    if(czwarty.true_false_events(mouse_x, mouse_y,pressed)) czwarty.show();
    if(czwarty.pressed)
    {
     pierwszy.pressed = false;
     drugi.pressed = false;
     trzeci.pressed = false;
     piaty.pressed = false;
     pierwszy.show();
     drugi.show();
     trzeci.show();
     czwarty.show();
     piaty.show();
     temp.wallpaper_location = 3;
    }
    if(piaty.true_false_events(mouse_x, mouse_y,pressed)) piaty.show();
    if(piaty.pressed)
    {
     pierwszy.pressed = false;
     drugi.pressed = false;
     trzeci.pressed = false;
     czwarty.pressed = false;
     pierwszy.show();
     drugi.show();
     trzeci.show();
     czwarty.show();
     piaty.show();
     temp.wallpaper_location = 4;
    }
   /*
   
   
   */
   if(blabla.insert_events(mouse_x, mouse_y,pressed,przyklad)) blabla.show();
   if(tapeta1.multibox_button_events(mouse_x, mouse_y,pressed)) tapeta1.show();
   if(tapeta1.pressed)
   {
    strcpy(temp.wallpaper,"./images/system/we_likes_pepper.png");
    tapeta1.pressed = false;
   }
   if(tapeta2.multibox_button_events(mouse_x, mouse_y,pressed)) tapeta2.show();
   if(tapeta2.pressed)
   {
    strcpy(temp.wallpaper,"./images/system/kubuntu_ring.jpg");
    tapeta2.pressed = false;
   }
   if(tapeta3.multibox_button_events(mouse_x, mouse_y,pressed)) tapeta3.show();
   if(tapeta3.pressed)
   {
    tapeta3.pressed = false;
   }
   if(tapeta4.multibox_button_events(mouse_x, mouse_y,pressed)) tapeta4.show();
   if(tapeta4.pressed)
   {
    tapeta4.pressed = false;
   }
   if(otworz.button_events(mouse_x, mouse_y,pressed)) otworz.show();
   if(otworz.pressed)
   {
    while(window_open_image((HINSTANCE)1,NULL," ",0))
    {
     mouse_x = 100;
     mouse_y = 100;
    }
    otworz.pressed = false;
   }
  }
 }
}

Aha i teraz spróbowałem dać funkcję tego okna ("Otwórz jako") w pętli, która zeruje wartości myszki, ale kiszka....

Z góry dzięks za pomoc

Z góry dzięki za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1