Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Zmiana wyglądu kalkulatora za pomocą radiobuttona[winapi]

trophy250 06 Dec 2009 21:59 1868 7
  • #1
    trophy250
    Level 10  
    Witam was. Mam pytanie programuję w WinApi i zrobiłem kalkulator do którego wpisuje się do EDITA 1 Liczbę potem do 2 EDITA 2 liczbę i się wybiera jakie to ma być działanie. Chcę zrobić coś takiego że jak przycisnę "radio buttona" to ma się zamienić poprzedni kalkulator na inny(podobny jak w Windowsie) a jak od klikam radio buttona to się pojawia stary kalkulator zn. ten pierwszy co wyżej opisałem z editami.
    p.s w windowsowym kalkulatorze są takie też opcje że po kliknięciu się zmienia dodatkowe funkcje itp.
    mam już kod programu z samymi BUTTONAMI (jak windowsowy calc) chodzi o to jak to zmieniać? odświeżać czy jak?
  • #2
    dr_bones
    Level 16  
    eeee...
    1) rozumiem, że musisz wprogramować w WinApi - bo jak nie musisz to sobie daruj, jest tak toporne a masz masę narzędzi które cię wyręczą w projektowaniu GUI
    2) no generalnie jak klikasz radiobuttona to obslugujesz jego 'kliknięcie' jak nastąpi zdarzenie kliknięcia to w petli zdarzeń musisz wywolac procedure ktora ukryje stary kalkulator a wyswietli nowy ew. przelaczy jakas zmienna zeby cala obsluga kalkulatora szla w inne miejsce - nie wiem jak to wyswietlasz na ilu formatka itp. ale mniej wiecej tak

    ale wroce do pkt 1) moze inni sie ze mna nie zgodza ale winapi jest troche archaiczena i mega niewygodne

    bns
  • #3
    Stanley_P
    Level 27  
    trophy250 wrote:
    Witam was. Mam pytanie programuję w WinApi i zrobiłem kalkulator do którego wpisuje się do EDITA <...>


    Witam

    A czy do zrobienia tego czegoś (kalkulatora?) nie wystarczy Ci np. takie coś:
    http://www.autoitscript.com/autoit3/
    :?:
    Proste w użyciu, generalnie najczęściej służy do sterowania innymi aplikacjami, ale można również robić aplikacje GUI ze standardowymi kontrolkami. W pakiecie są edytory (kodu i GUI), kompilator, help, etc. Jest darmowe, całość zajmie na nośniku raptem około 30MB, bez problemu działa jako portable.

    Tu polskie forum AutoIt:
    http://www.autoit.xaa.pl/index.php
    a tu gotowa wersja portable:
    http://chomikuj.pl/stanley_p/AutoIt

    Pozdrawiam -

    Stanley
  • #4
    trophy250
    Level 10  
    OKi. A wiecie może jak ruszyć progres bara(pasek stanu ładowania)?? zrobiłem program który za zadanie ma tylko załadować progress`a do końca i odpalić inną aplikację. ale progres stoi na 1 kresce. dodaje się funkcją STEPIT ale musi być jakieś zdarzenie. Jak zrobię przycisk i będę go klikał to jest ok ale chodzi aby nie klikać zęby się automatycznie załadował. Próbowałem odświeżać okno i uchwyt do progressa UpdateWindow, pętlą for i nic nie działa. Może macie jakieś pomysły??
    p.s te przełączanie kalkulatora zrobiłem oknami dialogowymi :)
  • #5
    arnoldziq
    Moderator of Programming
    Jeżeli używasz ProgressBar to powinna być ta własność Position.
    Zrób pętlę od Progressbar.Min do Progressbar.Max i ustawiaj Position.
  • #6
    trophy250
    Level 10  
    A jak to mogę zrobić? możesz napisać tudaj tą pętlę? Gdzie ją wstawić w command czy create? z góry dzięki
    p.s robiłęm tak
    
    for(int l=0;l<100;l++)
    {
      (pasek,PBM_STEPIT,0,0)
    }
    

    Ale nei widać jak się łąduje kreska po kresce tylko jak odrazu ejst cały pasek
    robiłem tez tak
    
    for(int l=0;l<100;l++)
    {Sleep(1000);
      (pasek,PBM_STEPIT,0,0);
    }
    

    ale program się zawieszał i odwieszał dobbiero jak był załadowany pasek :(
  • #7
    trophy250
    Level 10  
    Co do paska to TIMER załatwił sprawę :P.
    Możecie (jak wiecie jak) poprawić ten kod kalkulatora aby wreszcie działał :(
    
    #include <windows.h>
    #include<string>
    #define mnoz 1000
    #define dzie 1001
    #define odej 1002
    #define dodaj 1003
    using namespace std;
    
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    HWND klik1,klik2,klik3,klik4,klik5,klik6,klik7,klik8,klik9,edit;
    HWND mno,dziel,raz,od,dod,row,kas;
    int dzialanie;
    HINSTANCE *wsk;
    
    float liczba,liczba1,liczba2,liczba3,liczba4,liczba5,liczba6,liczba7,liczba8,liczba9,wynik;
    char wyn[10];
    
    char szClassName[ ] = "WindowsApp";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {wsk=&hThisInstance;
        HWND hwnd;               
        MSG messages;           
        WNDCLASSEX wincl;        
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Windows App",       /* Title Text */
               WS_BORDER, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               300,                 /* The programs width */
               400,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
               case WM_CREATE:
                    
                    
       klik1=CreateWindowEx(0,"BUTTON","1",WS_CHILD|WS_VISIBLE,25,60,70,60,hwnd,(HMENU)1,*wsk,NULL);
       klik2=CreateWindowEx(0,"BUTTON","2",WS_CHILD|WS_VISIBLE,110,60,70,60,hwnd,(HMENU)2,*wsk,NULL);       
       klik3=CreateWindowEx(0,"BUTTON","3",WS_CHILD|WS_VISIBLE,195,60,70,60,hwnd,(HMENU)3,*wsk,NULL);
       klik4=CreateWindowEx(0,"BUTTON","4",WS_CHILD|WS_VISIBLE,25,135,70,60,hwnd,(HMENU)4,*wsk,NULL);
       klik5=CreateWindowEx(0,"BUTTON","5",WS_CHILD|WS_VISIBLE,110,135,70,60,hwnd,(HMENU)5,*wsk,NULL);
       klik6=CreateWindowEx(0,"BUTTON","6",WS_CHILD|WS_VISIBLE,195,135,70,60,hwnd,(HMENU)6,*wsk,NULL);
       klik7=CreateWindowEx(0,"BUTTON","7",WS_CHILD|WS_VISIBLE,25,210,70,60,hwnd,(HMENU)7,*wsk,NULL);
       klik8=CreateWindowEx(0,"BUTTON","8",WS_CHILD|WS_VISIBLE,110,210,70,60,hwnd,(HMENU)8,*wsk,NULL);       
       klik9=CreateWindowEx(0,"BUTTON","9",WS_CHILD|WS_VISIBLE,195,210,70,60,hwnd,(HMENU)9,*wsk,NULL);
      //99999999999999999999999999999999999999999999999999999999999999999999999999999999999
       dod=CreateWindowEx(0,"BUTTON","+",WS_CHILD|WS_VISIBLE,70,285,30,30,hwnd,(HMENU)10,*wsk,NULL);
       od=CreateWindowEx(0,"BUTTON","-",WS_CHILD|WS_VISIBLE,120,285,30,30,hwnd,(HMENU)11,*wsk,NULL);
       dziel=CreateWindowEx(0,"BUTTON","/",WS_CHILD|WS_VISIBLE,170,285,30,30,hwnd,(HMENU)12,*wsk,NULL);
       mno=CreateWindowEx(0,"BUTTON","*",WS_CHILD|WS_VISIBLE,220,285,30,30,hwnd,(HMENU)13,*wsk,NULL);       
      //99999999999999999999999999999999999999999999999999999999999999999999999999999999999999990
      row=CreateWindowEx(0,"BUTTON","=",WS_CHILD|WS_VISIBLE,145,325,95,40,hwnd,(HMENU)14,*wsk,NULL);
      kas=CreateWindowEx(0,"BUTTON","C",WS_CHILD|WS_VISIBLE,60,325,60,40,hwnd,(HMENU)15,*wsk,NULL);
       //00000000000000000000000000000000000000000000000000000000000000000000000000000000
       edit=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_VISIBLE,10,10,270,35,hwnd,NULL,*wsk,NULL);   
            break;
            //----------------------------------------------------------------------------
            case WM_COMMAND:
              
                 switch(wParam)
    {
                           case 1:
                                {
                                 
                                    
                                
            SetWindowText(edit,"1");
          DWORD dl1;
          dl1 = GetWindowTextLength(edit);
          LPSTR bf1= (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl1 + 1);
          GetWindowText(edit, bf1, dl1 + 1);
          liczba = atof(bf1); 
     
           
                               }
                      break;
                         case 2:
                      {
                 SetWindowText(edit,"2");
          DWORD dl2;
          dl2 = GetWindowTextLength(edit);
          LPSTR bf2 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl2 + 1);
          GetWindowText(edit, bf2, dl2 + 1);
          liczba= atof(bf2);     
                           } 
                              break;
                      case 3:
                       {
                      SetWindowText(edit,"3");
          DWORD dl3;
          dl3 = GetWindowTextLength(edit);
          LPSTR bf3 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl3 + 1);
          GetWindowText(edit, bf3, dl3 + 1);
          liczba = atof(bf3); 
                                    }
                                    break;
                               case 4:
                       {
                      SetWindowText(edit,"4");
          DWORD dl4;
          dl4 = GetWindowTextLength(edit);
          LPSTR bf4 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl4 + 1);
          GetWindowText(edit, bf4, dl4 + 1);
          liczba = atof(bf4); 
                                    }
                                    break;
                       case 5:
                       {
                      SetWindowText(edit,"5");
          DWORD dl5;
          dl5 = GetWindowTextLength(edit);
          LPSTR bf5 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl5 + 1);
          GetWindowText(edit, bf5, dl5 + 1);
          liczba = atof(bf5); 
                                    }
                                    break;
                 
                  case 6:
                       {
                      SetWindowText(edit,"6");
          DWORD dl6;
          dl6 = GetWindowTextLength(edit);
          LPSTR bf6 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl6 + 1);
          GetWindowText(edit, bf6, dl6 + 1);
          liczba = atof(bf6); 
                                    }
                                    break;
                  case 7:
                       {
                      SetWindowText(edit,"7");
          DWORD dl7;
          dl7 = GetWindowTextLength(edit);
          LPSTR bf7 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl7 + 1);
          GetWindowText(edit, bf7, dl7 + 1);
          liczba = atof(bf7); 
                                    }
                                    break;
                 
                 
                  case 8:
                       {
                      SetWindowText(edit,"8");
          DWORD dl8;
          dl8 = GetWindowTextLength(edit);
          LPSTR bf8 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl8 + 1);
          GetWindowText(edit, bf8, dl8 + 1);
          liczba = atof(bf8); 
                                    }
                                    break;
                 
                  case 9:
                       {
                      SetWindowText(edit,"9");
          DWORD dl9;
          dl9 = GetWindowTextLength(edit);
          LPSTR bf9 = (LPSTR)HeapAlloc(GetProcessHeap(), 0x1 | 0x8, dl9 + 1);
          GetWindowText(edit, bf9, dl9 + 1);
          liczba = atof(bf9); 
                                    }
                                    break;
                                    
                                    
                                    
     
                                    
                                    
                                    case 10:
                                         dzialanie=dodaj;break;
                                   case 11:
                                        dzialanie=odej;break;
                                        case 12:
                                             //if(!liczba)
    // MessageBox(hwnd, "dzielenie przez zero", "Error", MB_OK);
        //  else
          
                                             dzialanie=dzie; break;
                                        case 13:
                                             dzialanie=mnoz; break;
                                             case 14:
                                                   switch(dzialanie)
                                                   {    case dodaj:
                                                                wynik=liczba+liczba;break;
                                                                case odej:
                                                                     wynik=liczba-liczba;break;
                                                                     case dzie:
                                                                          wynik=liczba/liczba;break;
                                                                          case mnoz:
                                                                               wynik=wynik*liczba;break;
                                                                               }
                                                                                                                    wsprintf(wyn, "%.d", wynik);
          SetWindowText(edit,wyn); break;    
                                                                               
                                                                    
                                                  
                                                  
         
     
                                         
                                         
                                         
     //;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                             
    }
    
              break;   
                 
                 
                 //--------------------------------------------------------------------
                case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    
    

    Będę bardzo wdzięczny. Pozdrawiam
  • #8
    trophy250
    Level 10  
    Nikt nie wie jak ten kod poprawić??