Programmering i C med Windows API: Sådan tegner du en kommandoknap

Indlæg af Hanne Mølgaard Plasc

Problem



Nå bygger jeg et college-projekt i C. GUI er ikke blevet undervist endnu, men jeg vil have mit program til at blive bedre, så jeg lærer Windows API.


Jeg følger denne vejledning her: http://www.winprog.org/tutorial/start.html og det er ganske godt.
Det forklarer mange ting, men jeg kan ikke finde en ting (selv søgte Google, men alt er orienteret mod C ++ eller C #): [19]


Hvordan tegner jeg en kommandoknap inde i det trækede vindue (som jeg har lært) og hvordan man accepterer hændelser til det?


Kan du venligst svare eller pege på en god side, der forklarer, hvordan jeg kan oprette en kommandoknap med KUN Windows API og C. Nej, C ++ tak.


Tak for din tid! :)

Bedste reference


Dette er en vejledning, jeg anbefaler stærkt på Win32 APIs brugergrænsefladefunktioner. Det er yderst godt. I din tilbagekaldsfunktion (LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) har du stort set flere muligheder, du kan fange: [20]


switch(msg)  
{
    case WM\_CREATE:
        break;

    case WM\_COMMAND:
        break;
    /* .. */
}


Hvad du skal gøre på WM\_CREATE er sådan noget:


HWND hWnd\_button = CreateWindow(TEXT("button"), TEXT("Quit"),    
                 WS\_VISIBLE | WS\_CHILD ,
                 20, 50, 80, 25,        
                 hwnd, (HMENU) 1, NULL, NULL);  


Grunden til, at jeg har gemt HWND af den knap, er at hvis du vil ændre knappen på et senere tidspunkt, skal du bruge Handle som et argument for SendMessage(). Nu næste gang, fanger et klik. Når knappen trykkes, sender den WM\_COMMAND til overordnet vinduet med HMENU casted argumentet (1 i dette tilfælde) i wParam. Dette virker for hver kontrol du opretter (menuer, afkrydsningsfelter osv. - hvis de sender mere komplicerede muligheder, kan de være til stede i lParam). Så:


case WM\_COMMAND:
    if (LOWORD(wParam) == 1) {
        DestroyWindow();
        /* or SendMessage(hwnd, WM\_CLOSE,0,0); see commments */
    }
    break;


Fanger den særlige mulighed. Inde i if håndteres den knaphændelse.

Andre referencer 1


Brug simpelthen CreateWindow med klassenavn "BUTTON", stil BS\_PUSHBUTTON og overordnet vindue som dit eksisterende tegnede vindue. X- og y-koordinaterne vælger positionen øverst til venstre i vinduet. Vinduets navn er teksten på knappen. Husk også at ringe ShowWindow på det tilbagevendte håndtag. [21]


rediger: For at acceptere begivenheder for det, skal du først definere en ID-værdi som:



  #define ID\_MYBUTTON 1



Derefter sendes det til menuparameteren i CreateWindow-opkaldet. I din hoved vindues besked proc proc du kan nu finde besked ved at teste for:



  if(message == WM\_COMMAND && HIWORD(wParam) == BN\_CLICKED && LOWORD(wParam) == ID\_MYBUTTON) { /* button was clicked */ }