c ++ - WNDCLASS og Window Handle i Seperate eller Same Class?

Indlæg af Hanne Mølgaard Plasc

Problem



Okay, alvorligt dilemma. Jeg forsøger at pakke Windows API. og det største designproblem, jeg har ramt i (for nu), er hvilken klasse der passer til indpakning af hvad? Da jeg har lavet en Windows API-omslag ca. tre gange før, altid i et designproblem midt i tingene, tid, jeg har til hensigt at træde forsigtigt og stille de forvirrende dele herover, før de implementeres.


Skal WNDCLASS og hovedvinduerne oprettet af CreateWindow pakkes ind i en enkelt klasse eller separate klasser? Skal jeg oprette en singleton for at holde WNDCLASS?


Også, hvis nogen kan give mig et rutediagram eller en generel ide om, hvordan man kan abstrahere Windows API i klasser, nogle gode designtips?

Bedste reference


For en god inspirationskilde, se på .Net-rammerne - der er ikke noget koncept for WNDCLASS! Du kan få dit bibliotek til at oprette et WNDCLASS, der deles af alle dine vinduer. Du behøver ikke singletoner (uurrgghhh), da klassen kan bruges af en streng. Hvis du vil ændre nogle af de egenskaber, som WNDCLASS definerer for et bestemt vindue, tror jeg, du kan bruge SetWindowLongPtr funktionen.


Ting at overveje:



  1. Ville der være behov for flere WNDCLASS-tilfælde?

  2. Vil du have klienter adgang til WNDCLASS data?

  3. Er der et et-til-et-forhold mellem Windows og WNDCLASS eller er det en til mange?


Andre referencer 1


Enhver grund du ikke bruger ATL?


Se ATL CWindow som en letvægtsindpakning rundt om vinduer: [5]


class CMyWindow : public CWindowImpl<CMyWindow>, ...
{
public:
   // Optionally specify name of the new Windows class
   DECLARE\_WND\_CLASS("MyName") 
              // If this macro is not specified in your
              // class, ATL will generate a class name
   ...

   BEGIN\_MSG\_MAP(CMyWindow)
      MESSAGE\_HANDLER(WM\_PAINT, OnPaint)
   END\_MSG\_MAP()

   LRESULT OnPaint(UINT nMsg, WPARAM wParam, 
                   LPARAM lParam, BOOL& bHandled)
   {
      // Do some painting code
      return 0;
   }
};


Gå så tung eller så let som du vil med ATL.

Andre referencer 2


De bør være adskilte klasser af den simple grund, at flere vinduer kan arve fra samme klasse.


Hvordan jeg har gjort dette før, er din CWindow-klasse, spørger en statisk metode til CWindowClass-klassen for at oprette en vinduesklasse med bestemte parametre. CWindowClass registrerer enten en ny vinduesklasse, indpakket i en CWindowClass for at vende tilbage til den, der ringer op, eller det genbruger en eksisterende til at vende tilbage til opkalderen ved at cache tidligere succesfulde klasser.


Din CWindow-klasse kan derefter angive, hvordan du opretter et vindueshåndtag ved hjælp af det underliggende navn på den registrerede klasse, og når CWindow er afsat, kan det reducere referencetællingen på CWindowClass - den sidste del heraf vil frigøre klassen korrekt.