Visual c++ aplikacja okienkowa ,problem

0

Cześć,
chcę stworzyć aplikację w visualu, w której znajdzie się rozsypanka z liczb lub wyrazów, które będzie trzeba ułożyć w danym polu w odpowiedniej kolejności. Czy jest to do wykonania w Visualu? Proszę o poradę z jakich ewentualnie kontrolek/panelów trzeba by skorzystać. Będę wdzięczny za odpowiedzi

0

Jest do wykonania, ale jeśli o Visualu mowa, to polecam raczej pisanie w C# czegoś takiego, niż C++.

0

Jesli chodzi o visuala to jestem tego samego zdania co @Azarien
Natomiast jesli koniecznie musi byc to C++, to mozesz skorzystac z biblioteki Qt. Na stronie ow biblioteki znajduje sie wtyczka do pobrania umozliwiajaca przyjemniejsze korzystanie z tej biblioteki (nie dla wersji express).

Zostaje jeszcze do wyboru kilka bibliotek do C++, ale tutaj integracja bedzie mala, tj. Wx, GTK.

I na koniec mozesz skorzystac z surowego API Windowsa, czego nie proponuje, lub wykorzystac wrapper obiektowy na to API jakim jest MFC.

0

Niestety muszę korzystać z C++.
Podpowiecie mi w jaki sposób ustawia się kontrolki label, żeby można było przeciągać je po formie? Dałoby się wrzucić je np do jakiegoś kontenera i zrobić tak, żeby ustawiały się w nim losowo?

0

hmm najprościej by było zrobić chyba tak: potasować zdanie znajdujące się w tablicy. Stworzyć na podstawie tego buttony(albo coś innego byle dało się dlatego wywołać zdarzenie kliknięcia). nazwa buttonu to pojedynczy wyraz zdania. Załóżmy ,że użytkownik kliknie na jakiś przycisk z wyrazem. zapamiętujemy jaką nazwę miał ten button(pojedynczy wyraz). teraz jak klikniemy na inny button to musimy zamienić oba buttony nazwami tak żeby wyrazy zmieniły swoja pozycję. będzie to wyglądało tak jakbyśmy układali zdanie. Możesz np zmienić kolor pierwszego buttona którego wybierzesz ,aby było wszystko bardziej widoczne dla zwykłego użytkownika. To chyba najprostsza metoda. Nie musisz się babrać w QT skoro maż już visuala. Zanim ściągniesz Qt i wszystko skonfigurujesz minie trochę czasu a jest tak prosty program na jakies 20-30 minut że nie opłaca się go marnować

0

Ciekawe jakby to się sprawdzało gdyby zrobić to łącząc 2 kontrolki przez subclassing. Wszystkie komunikaty (poza komunikatami myszy) lecą na STATIC, a mysz na jakąś dragable kontrolkę. Znając Micros**t to pewnie takiej kontrolki nie ma ^^. Ale można to na szybko dodać ręcznie ;)

0

Dzięki za poprzednie odpowiedzi.
Hmm.. aplikacja musi być prosta i czytelna. Mam więc taką koncepcję, żeby wyrazy były prezentowane przez buttony lub labele i wtedy należy je przeciągać na wytyczone pole. Akceptacja ułożonego zdania będzie na podstawie położenia względem siebie buttonów lub labeli. Dałoby się to tak przełożyć?

0

Żeby dodać opcję dragable (czyli przeciągania myszą) trzeba stworzyć superklasę.

Dodajesz gdzieś zmienną globalną:

WNDPROC g_OldWndProc;

Tworzysz nową funkcję dla okienek:

LRESULT CALLBACK	NewWndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    static bool   Dragged = NULL;
    static POINT DragMousePos = {0L, 0L};

    if( Msg == WM_LBUTTONDOWN )
    {
       if ( nMsg == WM_LBUTTONDOWN )
		  {
          POINT Coords;
          Coords.x = LOWORD( lParam );
          Coords.y = HIWORD( lParam );
          
          SetCapture( m_hHandle );

          Dragged = true;

          ClientToScreen( hWnd, &Coords );
          ptDragMousePos = Coords;
      }
		}

		else if ( ( nMsg == WM_LBUTTONUP ||
				          nMsg == WM_NCLBUTTONUP ) &&
				          Dragged )
		{
			if ( Dragged )
			{
				ReleaseCapture( );
				
				 POINT Coords;
         Coords.x = LOWORD( lParam );
         Coords.y = HIWORD( lParam );
         
          ClientToScreen( hWnd, &Coords );
				
				Coords.x -= ptDragMousePos.x;
				Coords.y -= ptDragMousePos.y;
				
				  //Jakas zewnetrzna funkcja
        DragEnd( Coords );
			}
		}
		
		else if( nMsg == WM_MOUSEMOVE &&
               Dragged)
		{
		   //Tutaj możesz pobierać koordynaty myszy i na przykład rysować przesuniętą kontrolkę.
		   //W takim wypadku najłatwiej będzie ukryć poprzednią kontrolkę i stworzyć nową (na 
		   //wierczhu stosu) i ją rysować na odpowiednich koordynatach.
		}
		
		
		return CallWindowProc( g_OldWndProc, hwnd, mesg, wParam, lParam );
}

Przed inicjalizacją tworzysz nową klasę okna na podstawie static (tutaj też przypisujesz wartość zmiennej globalnej):

WNDCLASS wc;
GetClassInfo( hThisInstance, "STATIC", & wc );

//Przypisujesz zmiennej globalną 1 ważną wartość (dzięki temu Twoja kontrolka będzie się zachowywać (prawie) jak STATIC
g_OldWndProc = wc.lpfnWndProc;

//Wypelniasz pola klasy. Jako funkcję klasy podając wyżej utworzoną funkcję:
MyWndClass.lpfnWndProc = NewWndProc;

Kontrolki klasy którą właśnie utworzyłeś powinny się dać przeciągnąć i wywołać funkcję DragEnd. Na podstawie tego powinieneś sobie poradzić.

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