2011-11-18 20 views
5

Bez zasobów mogę utworzyć mój interfejs użytkownika za pomocą złożonej tablicy CreateWindow() i CreateWindowEx() i WndProc(), aby przetworzyć moje zdarzenia.Jak korzystać z zasobów Dialog w Win32?

Zauważyłem, że jeśli kliknę prawym przyciskiem myszy w widoku zasobów i kliknę "dodaj zasób", mogę narysować okno dialogowe ze wszystkimi kontrolkami. Oszczędziłoby to mi ogromną ilość czasu, gdybym mógł narysować interfejs tak, jak zwykle robię to przy pomocy C#.

Po narysowaniu interfejsu za pomocą edytora zasobów, w jaki sposób mogę następnie utworzyć okno z kodu? Czy ktoś może podać bardzo prosty przykład za pomocą przycisku i pokazać, jak obsługiwać zdarzenie WM_COMMAND na tym przycisku?

Czy to ogólnie ludzie tworzą GUI? Czy istnieje jakakolwiek elastyczność w tym zakresie? Nawet w języku C# często muszę uzupełniać interfejs generowany przez projektantów za pomocą mojego własnego interfejsu generowanego przez kod, ale przez większość czasu jestem całkiem zadowolony z używania projektanta.

Odpowiedz

5

Po utworzeniu okna w edytorze zasobów, zadzwoń CreateDialog (okno niemodalny; trzeba ręcznie wysłanie wiadomości podobnie jak podczas korzystania CreateWindow) lub DialogBox (okno modalne; funkcja nie zwraca aż do zamknięcia okna dialogowego. robi wysyłkę dla ciebie), aby okno się pojawiło. Tak jak przekazujesz w procedurze window do RegisterClass, przekazujesz proces okna dialogowego do tych funkcji dla wywołania okna dialogowego. Przykład wyglądu DialogProc wygląda tak:

BOOL DialogProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam){ 
    switch(iMessage){ 
    case WM_COMMAND: 
     switch(LOWORD(wParam)){ 
     case BTOK: 
      MessageBox(hDlg, "Hello, World!", NULL, NULL); 
      return TRUE; 
      break; 
     } 
     break; 
    } 
    return FALSE; 
} 

Jest to podstawowy sposób tworzenia okna dialogowego. Bardziej wyrafinowana metoda zwykle zawierałaby OOP, zwykle zawijając każdy zasób (przycisk, okno, itp.) Jako obiekt C++ lub używając MFC.

1

Jeśli umieściłeś przycisk lub dowolną kontrolkę w oknie dialogowym, to formant jest już w stanie utworzonym. Aby obsługiwać komunikaty tych elementów podrzędnych w tym oknie dialogowym, należy zastąpić metodę OnCommand w klasie implementującej okno dialogowe.

Na przykład:

//CDialog_ControlDlg is my Dialog class derived from CDialog 

//IDC_BUTTON_SAMPLE is the ID of the button which was palced on the dialog in the resource Editor.. 

BOOL CDialog_ControlDlg::OnCommand(WPARAM wParam,LPARAM lparam){ 
     int iNotiFicationMsg=HIWORD(wParam);//This is thenotification Msg from the child control 
     int iCommandId=LOWORD(wParam);//And Control ID of the Child control which caused that Msg 
     BOOL result=FALSE; 
     switch(iCommandId){ 
    case IDC_BUTTON_SAMPLE: 
     if(iNotiFicationMsg==BN_CLICKED) 
     { 
     //Your Code for handling this type of Msg for this control.. 

     } 
     break; 
    default: 
    { 
     //Specific Code; 

    } 

    return result; 
} 

}