winapi

Wątek zablokowany 2013-04-14 15:05 przez Rev.

EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

cześć, ruszyłem właśnie winapi i powiedzcie mi czy wszystkie 'zdarzenia' i czynności po naciśnięciu jakiejś kontrolki obsługuje w tej pętli?

Kopiuj
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        
    case WM_COMMAND:
        if( HWND( lParam ) == button )
            {
                //MessageBox( window, "Wcisnales button", "Message", MB_ICONINFORMATION | MB_OK );
                DWORD dlugosc = GetWindowTextLength( edit );
                LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
                
                //std::cout<< dlugosc;
                GetWindowText( edit, Bufor, dlugosc + 1 );
                
                char bufor[dlugosc];
                strcpy(bufor, Bufor );
                
                std::string name(bufor);
                std::cout<< name <<std::endl;
                
                GlobalFree( Bufor );
                
                
            }   
        break;
        
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
        
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    
    return 0;
}

czyli sprawdzam co zostało wciśnięte i mogę tutaj wrzucić klasy i funkcje spełniające przewidzianą funkcjonalność?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:10 dni
1

W większości tak, dopóki nie zaczną się okna modalne które mają niejako własną pętle.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:2 minuty
1
  1. tu nigdzie nie ma pętli. WndProc jest wywoływane przez DispatchMessage, które powinno być w pętli.
  2. wszystkie komunikaty, których nie obsługujesz sam, wpadają do DefWindowProc (nie automatycznie; a tylko dlatego, że tak masz w kodzie)
  3. z czasem ten switch przybierze monstrualne rozmiary. dlatego wskazane jest rozbicie go, np. w ten sposób:
Kopiuj
case WM_COMMAND: return OnWmCommand(hwnd, msg, wParam, lParam);

gdzie OnWmCommand to twoja funkcja która zajmuje się tylko tym komunikatem.

  1. funkcja WndProc jest charakterystyczna dla konkretnej klasy okna. jeśli otworzysz inne okno (choćby messageboksa) to będzie miało własną obsługę komunikatów (gotową albo też napisaną przez ciebie).
edytowany 1x, ostatnio: Azarien
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

powiedziałem w pętli dla uproszczenia, oczywiście to WndProc znajduje się w odpowiedniej pętli...więc do switcha wrzucam własną funkcje w której to dopiero sprawdzam co zostało użyte w programie - tak czy inaczej funkcja ta będzie duża. Czyli coś takiego już przejdzie?

Kopiuj
OnWmCommand(hwnd, msg, wParam, lParam);
{
    if ( HWND (lParam ) == global::save) {
        c_system_file system_file;
        system_file.save();
    }
        //tutaj kolejne sprawdzenia

}
edytowany 3x, ostatnio: emacs
Azarien
zrób tam raczej coś na kształt switch(lParam)
EM
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:271
0

winapi ciąg dalszy ;) w głównym oknie po naciśnięciu buttona tworze i wyświetlam nowe okno i teraz chciałbym żeby to okno było modalne czy jest do tego jakiś styl lub jakaś funkcja? wiem że mogę stworzyć okno dialogowe modalne funkcją DialogBox() ale to mnie nie ratuje...

RE
niech każdy temat nawiązuje do jednego problemu. załóż nowy i to z tytułem, który faktycznie opisuje problem. ten wątek zamykam, a następny z podobnym tytułem wyląduje w koszu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.