c ++ - GetWindowlong for at kontrollere knappen stil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne bruge rå winapi32 til at kontrollere knapstil, om det er en afkrydsningsfelt-knap eller en tryknap.


bool isPushBtn(HWND hBtn, DWORD dwStyle)
{
   return (0!=dwStyle | GetWindowLong(hBtn,GWL\_STYLE));
}


Men det returnerer altid falsk. Kender du en måde at kontrollere dette på? Tak skal du have.

Bedste reference


For at forstå, hvordan knapper fungerer, skal vi se på de værdier, som stilkonstanterne bruger:


#define BS\_PUSHBUTTON       0x00000000L
#define BS\_DEFPUSHBUTTON    0x00000001L
#define BS\_CHECKBOX         0x00000002L
#define BS\_AUTOCHECKBOX     0x00000003L
#define BS\_RADIOBUTTON      0x00000004L
#define BS\_3STATE           0x00000005L
#define BS\_AUTO3STATE       0x00000006L
#define BS\_GROUPBOX         0x00000007L
#define BS\_USERBUTTON       0x00000008L
#define BS\_AUTORADIOBUTTON  0x00000009L
#define BS\_PUSHBOX          0x0000000AL
#define BS\_OWNERDRAW        0x0000000BL
#define BS\_TYPEMASK         0x0000000FL
#define BS\_LEFTTEXT         0x00000020L

#define BS\_TEXT             0x00000000L
#define BS\_ICON             0x00000040L
#define BS\_BITMAP           0x00000080L
#define BS\_LEFT             0x00000100L
#define BS\_RIGHT            0x00000200L
#define BS\_CENTER           0x00000300L
#define BS\_TOP              0x00000400L
#define BS\_BOTTOM           0x00000800L
#define BS\_VCENTER          0x00000C00L
#define BS\_PUSHLIKE         0x00001000L
#define BS\_MULTILINE        0x00002000L
#define BS\_NOTIFY           0x00004000L
#define BS\_FLAT             0x00008000L
#define BS\_RIGHTBUTTON      BS\_LEFTTEXT


Den anden vigtige reference er emnet Button Styles på MSDN. Det, som dette dokument ikke forklarer, er imidlertid, at flagene BS\_PUSHBUTTON til BS\_OWNERDRAW, flagene type udelukker hinanden. De andre flag kan bruges i kombination med en af ​​de slags flag. Dette kan udledes af værdiernes bitmønstre. [10]


Dokumentationen for BS\_TYPEMASK hedder:



  Windows 2000: En sammensat stilbit, der resulterer i at bruge OR-operatøren på BS\_ * -stikbit. Det kan bruges til at maskere ud gyldige BS\_ * bits fra en given bitmask. Bemærk, at dette er forældet og ikke indeholder alle gyldige stilarter korrekt. Således bør du ikke bruge denne stil.



Men jeg synes det er vildledende og tilslutter mig, hvad ybungalobill sagde i sit svar. Ingen skade kan komme af at følge det råd.


Med andre ord skal du maskere stilen med BS\_TYPEMASK og derefter teste for en bestemt knaptype.


bool isButtonType(HWND hBtn, DWORD dwType)
{
     assert(dwType<=BS\_TYPEMASK);
     return (GetWindowLong(hBtn, GWL\_STYLE) & BS\_TYPEMASK) == dwType;
}

Andre referencer 1


Det bør være:


return (GetWindowLong(hBtn,GWL\_STYLE) & BS\_TYPEMASK) == dwStyle;

Andre referencer 2


Det bør være


return (dwStyle == (GetWindowLongPtr(hBtn, GWL\_STYLE) & dwStyle));