Funkcja zaprzyjaźniona i HINSTANCE

0

Wymyśliłem, że tworze swoją klasę okien. Każde okno wygląda inaczej (w zależności od
podanego pędzla), przy zachowaniu wspólnej klasy(WNDCLASSEX).
Plik .h

#ifndef Nowa_Kontrolka_h_
  #define Nowa_Kontrolka_h_
  
class Nowa_Kontrolka;

#include<windows.h>
#include<iostream>

LRESULT CALLBACK fZdarz(HWND hWindow, UINT zdarzenie, WPARAM wParam, LPARAM lParam);

class Nowa_Kontrolka
{
  private:
          static int licznik;//liczy ilosc obiektów
          HWND uchwyt;
          HBITMAP tlo;
          static WNDCLASSEX WndClass;
  public:
         Nowa_Kontrolka(HWND Rodzic, HINSTANCE hInst, HBITMAP bitmapa);
         //Zaprzyjaźniam funkcje zdarzeniową, by mogła sięgać po 'tlo'
         friend LRESULT CALLBACK fZdarz(HWND hWindow, UINT zdarzenie, WPARAM wParam, LPARAM lParam);
};
  
#endif

Plik .cpp

#include"Nowa_Kontrolka.h"
extern HINSTANCE *hInstance;

int Nowa_Kontrolka::licznik = 0;

WNDCLASSEX Nowa_Kontrolka::WndClass = {
                                       sizeof(WNDCLASSEX),
                                       0,
                                       fZdarz,
                                       0,0,
                                       *hInstance,
                                       LoadIcon(NULL, IDI_APPLICATION),
                                       LoadCursor(NULL, IDC_ARROW),
                                       (HBRUSH)COLOR_WINDOW,
                                       NULL,
                                       "Nowa_Kontrolka",
                                       LoadIcon(NULL, IDI_APPLICATION)  };



//******************************************************************************
Nowa_Kontrolka::Nowa_Kontrolka(HWND Rodzic, HINSTANCE hInst, HBITMAP bitmapa)
{
  ++licznik;//stworzono nowy obiekt
  
  //Jeśli jest to pierwszy obiekt tej klasy
  if( licznik < 2 )
     RegisterClassEx(&WndClass);
  
  tlo = bitmapa;
  
  uchwyt = CreateWindowEx( WS_EX_TOOLWINDOW,
                           "Nowa_Kontrolka",
                           "Oto nowa kontrolka",
                           WS_CHILD|WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                           10,10,  100,100,
                           Rodzic,
                           0,
                           hInst,
                           NULL);
}

//******************************************************************************
LRESULT CALLBACK fZdarz(HWND hWindow, UINT zdarzenie, WPARAM wParam, LPARAM lParam)
{
   switch(zdarzenie)
   {     
      case WM_DESTROY:
           {
              PostQuitMessage(0);
              break;        
           }
      case WM_PAINT:
           {
              HDC hdcKontekst = GetDC(hWindow);
              HDC hdcPamiec = CreateCompatibleDC(hdcKontekst);
              DeleteObject( SelectObject(hdcPamiec, tlo) );//błąd - 'tlo' undeclared
              
              BITMAP rozmiar;
              GetObject(hdcPamiec, sizeof(BITMAP), &rozmiar);
              
              BitBlt(hdcKontekst,  200,    100,   rozmiar.bmWidth, rozmiar.bmHeight,
                     hdcPamiec, 0, 0, SRCCOPY);  
              
              DeleteDC(hdcPamiec);
              ReleaseDC(hWindow, hdcKontekst);      
              break;
           }
   } 
       
   return DefWindowProc(hWindow, zdarzenie, wParam, lParam);
}

Nie wiem skąd ten błąd skoro funkcja jest zaprzyjaźniona. Z tego co wiem to wskaźnik "*hInstance"
tu nie pasuje, bo musi być on znany już w trakcie kompilacji i okno w ogóle się nie wyświetli.
Niestety na razie tego nie sprawdze, bo mam inny błąd. Proszę o pomoc.
</php>

0

Plik .cpp
exern HINSTANCE* hInstance; //HINSTANCE*?

sizeof(WNDCLASSEX),
0,
fZdarz,
0,0,
*hInstance, //*hInstance..? po co przekazywac przez wskaznik? patrz wyzej.. przekaz to miedzy modulami przez wartosc, to i tak jest wartosc stala przez caly czas dzialania programu

////

extern HINSTANCE hInstance; < to oznacza, ze to zmeinna globalna z INNEGO pliku .cpp. nie masz innego pliku.cpp z taka zmienna globalna, wiec wywala ci sie podczas linkowania ze brak symbolu..

///

a sama wartosc hInstance dostajesz bodajze w parametrac winmain()
http://msdn2.microsoft.com/en-us/library/ms633559(VS.85).aspx

ps...wez sie zainteresuj jakims MFC albo ATL zamiast je pisac z palca od zera :)

0
//Zaprzyjaźniam funkcje zdarzeniową, by mogła sięgać po 'tlo'

by mogła sięgać po 'tlo' fZdarz musi wiedzieć którego obiektu i z jakiej klasy jest to tlo. Funkcja ta nie jest metodą, ale odwołujesz się do składowej klasy jakby była.

Nie wiem skąd ten błąd skoro funkcja jest zaprzyjaźniona.

Funkcja zaprzyjaźniona != metoda ;)

Z tego co wiem to wskaźnik "*hInstance" tu nie pasuje, bo musi być on znany już w trakcie kompilacji i okno w ogóle się nie wyświetli.

Nie wiem po co to hInstance jeżeli przekazujesz tą wartość w konstruktorze?

Reasumując: fZdarz powinna dostać wskaźnik do obiektu klasy Nowa_Kontrolka. Można tak to zrobić (mogą być błędy):

uchwyt = CreateWindowEx( WS_EX_TOOLWINDOW,
                           "Nowa_Kontrolka",
                           "Oto nowa kontrolka",
                           WS_CHILD|WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                           10,10,  100,100,
                           Rodzic,
                           0,
                           hInst,
                           this); //<---

[...]

case WM_CREATE:
{   
   CREATESTRUCT *pcs=(CREATESTRUCT*)lParam;
   SetWindowLongPtr(hWindow,GWLP_USERDATA,pcs->lpCreateParams);
   return 0;
}

default:
{
    Nowa_Kontrolka* ptr=(Nowa_Kontrolka*)GetWindowLongPtr(hWindow, GWLP_USERDATA);
    if(ptr)return ptr->procedura_okienkowa_jako_metoda(....);
}
    [...]
0

Kurde. Teraz to już nic nie wiem [glowa].

"ps...wez sie zainteresuj jakims MFC albo ATL zamiast je pisac z palca od zera :)"

Mógłbyś bardziej przybliżyć temat? Co to w ogóle jest?

Mój nauczyciel od programowania mówi, żebym skorzystał z czegoś takiego jak GUI, zamiast pisać wszyściutko od zera. Skoro są gotowe rzeczy, to po co w ogóle zajmować się nauką WINAPI ? ;-).

0

Co to w ogóle jest?

Obiektowy odpowiednik WinAPI. Jest jeszcze VCL (C++ Builder), wxWidgets, Qt, SmartWin itd.

0

Na Windowsa najlepszy jest Windows Forms w .NET

0

A tak w ogole hInstace wcale nie trzeba przekazywac bo hInstance=GetModuleHandle(NULL) o ile dobrze pamietam - to zadziala zawsze chyba ze tworzysz okna w bibliotece dll.

Skoro są gotowe rzeczy, to po co w ogóle zajmować się nauką WINAPI ? ;-)

Własnie. Chociaz jednak czasami znajomosc WinApi moze sie przydac, ale nie az tak czesto. MFC chyba tez juz raczej nie warto sie uczyc.

0

Gdzie mógłbym dostać informacje na temat Windows Forms w .NET lub GUI, jak zacząć, <ort>skąd</ort> itp.
Proszę o odpowiedz :-|

0

Gdzie? Wszędzie - poszukaj a znajdziesz. Pełno jest kursów do .NET, na msdn na stronie Microsoftu i w helpie od Visual C# tez (najlepiej jak laczy sie z msdn przez internet).

Wspomniane wxWidgets ja osobiscie tez bardzo lubie wiec radzilbym albo C#/NET albo wxWidgets.

wxWidgets ma jeszcze ta zalete ze utworzone aplikacje mozna odpalic na kazdym kompie, a .NET wymagaja zainstalowanego .NET framework w odpowiedniej wersji.
Jezeli jednak chcesz sie nauczyc czegos, co ulatwi znalezienie pracy w przyszlosci, to C# i NET uczyc sie chyba najbardziej warto.

Do wxWidgets polecam wxDevC++ i dokumentacje wxWidgets.

0

Co do windows forms i c++ to poszukaj na torrentach kursu "global profit". Opisuje visual ee 2005.

Są to filmiki pokazujące jak się to je. Nie jest to nic wielkiego ale na początek da Ci pewien obraz jak to się robi.

0

Z tego co zdążyłem się teraz dowiedzieć o c#, wynika, że jest on wypasiony(super :-)) do tworzenia programów. A Gry(głównie z tego powodu zająłem się programowaniem), Grafika??? Wszystko spoko, tylko musiałbym się uczyć wszystkiego od początku, kupić jakieś książki itp. :-/. Szkoda mi też czasu, który spędziłem na naukę C++ i WINAPI. Wolałbym raczej pozostać przy c++ i znaleźć odpowiedni sposób na tworzenie interfejsu graficznego, ale skoro C# daje jakąś tam przyszłość, to może rzeczywiście warto ;-)

0

Szkoda mi też czasu, który spędziłem na naukę C++ i WINAPI.

Złe podejście - co sie nauczyles to twoje. Poza tym, znajomosc C++ naprawde ci sie przyda podczas nauki C# - jak juz zaczniesz to sie sam przekonasz.

Jest jeszcze C++/CLI dla .NET, ale raczej rzadko jest to uzywane, jak .NET to w zasadzie tylko C#.

0
TOM# napisał(a)

Szkoda mi też czasu, który spędziłem na naukę C++ i WINAPI.

Powiem wiecej! bardzo bardzo zle podejscie !

Ja znajac WinAPI w bardzo szybki sposob przeszedlem na .NET (mozna powiedziec, wiedzialem wiecej). Poza .NET i WinAPI (czy generalnie jakis bibliotek) skupil bym sie na samym podejsciu do programowania (jak zaprojektowac aplikacje, jak zaprojektowac logike w tejze aplikacji, interfejs uzytkownika <- to UI moze sie wydawac na poczatku banalne ale wystraczy dac kilka swoich aplikacji przecietnemu obywatelowi ...). Jezyki, biblioteki beda zmieniac sie co chwila, to tylko narzedzia i tez sie zuzywaja, powstaja lepsze!

W dodatku jesli interesuje Ciebie grafika i gry to masz tu bardzo duze pole do popisu. Od zapozanania sie z nowymi(sprzetowo bo znane od x lat) technikami jak sledzenie promieni czy fizyka ruchu (odksztalcenia, odbicia) poprzez kompresje obrazow do filtrowania. Tu programowania niewiele (tj. nie trzeba znac jakis super bibliotek wystraczy if, while, for) zato pozostalych elementow ...

Juz nawet sam problem n kulek (odbicia sprezyste) w szescianie, z pozoru latwy, nastrecza sporo trudnosci (gdy odbic sie musi wiecej niz 2 kulki razem oraz gdy zdezenia nie sa centralne). A to przecieŻ gry ... i optymalizacja takich zagadnie dopiero pokazuje jak mozna przyspieszyc. A co by bylo gdyby to byly zderzenia niesprezyste (np kraksa 3 samochodow jak najbardziej realna ?!). W koncu do tego dazy sie w grach.

Wiec jesli chcesz kupowac ksiazki to raczej nie do programowania samego w sobie, tego jest na kilogramy w internecie, pozostale elementy za to nie sa specjalnie opisane (albo bardzo krotko, niezrozumiale).

0

Podejście złe w sumie, ale polecanie NET do pisania gier to IMO sadyzm jest. Jeśli znasz C++, to nie zmieniaj może na razie języka tylko dlatego, że NET ma obsługę GUI! A do poćwiczenia GUI zainstaluj sobie:
Turbo C++ Explorer
albo
CodeBlocks + wxWidgets

z czego kompilatory Borlanda zasadniczo są do bani, jeśli chodzi o wydajność aplikacji, ale z porównaniu z NETem to i tak z moich ograniczonych, empirycznych doświadczeń wynika, że wymiatają. A w obsłudze nic przyjemniejszego niż VCL nie znajdziesz! (pod Windows przynajmniej)

w CodeBlocks możesz pisać wszystko jak leci, takie lepsze Dev C++. możesz pod nie podpiąć sporo kompilatorów w szczególności i Visual Studio i MinGW. wxWidgets pod CodeBlocks może na początku straszy (np uporanie się z instalacją/kompilacją źródeł), ale jak to przejdziesz, to jest bardzo sympatyczny edytor graficzny.

wxDev C++ odwala za ciebie wszystkie rzeczy początkowe, ale edytor GUI toporny jest, jak jasna cholera. To już lepiej pisać cały kod ręcznie (co i tak będzie bajką w porównaniu z WinAPI ;] )

0

Ranides: ale w codeblocks nie ma mozliwosci wizualnego projektowania okienek, trzeba albo klepac recznie kod albo korzystac z formatu zasobów wxWidgets.
To nie jest wygodne, zwłaszcza dla poczatkujacych. wxDevCPP ma sporo bugów i jest juz nie rozwijany, ale ja wlasnie tylko ze wzgledu na mozliwosc projektowania GUI z niego korzystam

0

Jest jeszcze wxFormBuilder.

0

Jest jeszcze wxFormBuilder.

I ktos mowil ze to wxDevCPP jest toporny.... tylko jedno pytanie: chce miec dialog a na nim kontrolki i ma to wygladac w ten sposob, ze wrzuce kontrolke do okna, ustawie jej pozycje i rozmiar myszą tak jak to sie robi w kazdym innym programie do projektowania GUI.

Czy jest to możliwe? Rozumiem, sizery moze i dobra rzecz ale ja nie cierpie jak mnie sie zmusza do czegos, moze nie chce akurat z nich korzystac...

Podobnie za cholere nie moge umiescic kontrolki na panelu. Dam sizer, na niego panel, a na panel chce dac kontrolke - nie da sie.

0

Podobnie za cholere nie moge umiescic kontrolki na panelu. Dam sizer, na niego panel, a na panel chce dac kontrolke - nie da sie.

Da się ;-P Dajesz sizer, a później kontrolkę. Nie wiem w czym problem? To co podałem, to tylko przykład tego, że nie jest się skazanym na Dev'a jak chce się wyklikiwać GUI w wxWidget. Być może są lepsze designery...

0

No ale wlasnie nie moge, bo kontrolka nie wchodzi "na panel" tylko ustawia sie obok niego na sizerze, jak to robisz ze ci sie udaje? W koncu panel jest w sekcji "Containers", wiec powinno sie dac dodawac kontrolki do niego.

Jeszcze o sizerach - czy koniecznie trzeba z nich korzystac? Przydaja sie jezeli rozmiar okna sie zmienia, wtedy automatycznie sie kontrolki ustawiaja ale jezeli jest okno o jednym stalym rozmiarze to chyba lepiej recznie ustawic pozycje X,Y, a w ogole po co sa wlasciwosci X,Y kontrolek skoro przy uzyciu sizerow sa i tak ignorowane? :)

Ogolnie najwieksza zaleta tego programu jest to ze generuje skrypty xrc, czego w dev'ie nie uswiadczysz, poza wspomnianymi rzeczami nawet mi sie podoba.

Aha i czemu nie mozna zmienic rozmiaru kontrolki mysza? :>

0

No ale wlasnie nie moge, bo kontrolka nie wchodzi "na panel" tylko ustawia sie obok niego na sizerze, jak to robisz ze ci sie udaje?

Przecież pisałem, że na panelu ustawiasz sizer i do niego dodajesz kontrolkę.

Jeszcze o sizerach - czy koniecznie trzeba z nich korzystac?

Ogólnie rzecz biorąc nie. Ja z nich korzystam, bo ułatwiają tworzenie okna - nie trzeba się bawić z przeliczaniem współrzędnych, centrowaniem kontrolek itd. No chyba, że mówisz o sizerach w kontekście tego programu, wtedy innego wyboru nie masz.

Aha i czemu nie mozna zmienic rozmiaru kontrolki mysza?

Taki to już urok tego programu ;)

0

Otello, w CodeBlocks obecnie można używać dwóch modułów do układania kontrolek, jeden to właśnie wxFormBuilder, drugi to wxSmith. Można sobie wybrać który się chce podczas tworzenia projektu. Ja używam wxSmitha akurat i na przykład nie mam problemów z sizerami, to znaczy że wszystko sobie na sztywno po X,Y ustawiam i jestem happy, a sizerów tylko do podziału okna na 4 panele użyłem. I rozmiary myszą też się da zmieniać. Jak ktoś nie wierzy w taakie cuda, to mogę screena podesłać ;P

0

Właśnie ściąga mi kumpel Visual C++ studio. Tam też muszę dołączać wxFormBuilder czy coś tego typu?.

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