Dialog schließen



  • Hallo,
    entweder bin ich zu blöd oder...ja nix oder, ich bin blöd 😉
    Habe mir das Buch Windows Programmierung von Charles Petzold geholt, und bin dabei einen Dialog zu erstellen, hier mein Code (teilweise entnommen aus dem Buch):

    test.cpp

    #include <windows.h>
    #include "config.h"
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                              PSTR szCmdLine, int iCmdShow)
    {
          static TCHAR szAppName[] = TEXT ("LCDCon") ;
          HWND         hwnd ;
          MSG          msg ;
          WNDCLASS     wndclass ;
    
         wndclass.style         = CS_HREDRAW | CS_VREDRAW;
          wndclass.lpfnWndProc   = WndProc ;
          wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = DLGWINDOWEXTRA ;    // Achtung!
          wndclass.hInstance     = hInstance ;
          wndclass.hIcon         = LoadIcon (hInstance, IDI_APPLICATION) ;
          wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
          wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1) ;
          wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;
    
          if (!RegisterClass (&wndclass))
         {    // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit 
                 MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"),
                                 szAppName, MB_ICONSTOP) ;
              return 0 ;
          }
    
          hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;
    
          ShowWindow (hwnd, iCmdShow) ;
    
          while (GetMessage (&msg, NULL, 0, 0))
          {
                 TranslateMessage (&msg) ;
                 DispatchMessage (&msg) ;
          }
          return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
          switch (message)
          {
                     case WM_COMMAND :
                      switch(LOWORD(wParam))
                      {
                        case IDC_EXIT :
                        PostQuitMessage(0);
                        return 0;
                      }
                      return 0;
    
             case WM_DESTROY :
              PostQuitMessage(0);
              return 0;
          }
          return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    

    test.rc

    LCDCon DIALOG 84, 73, 161, 127
    STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX
    CAPTION "LCD Show Config"
    FONT 8, "MS Sans Serif"
    {
     LTEXT "LCD Show Config Tool Ver. 0.01", -1, 12, 6, 135, 10
     PUSHBUTTON "Beenden", IDC_EXIT, 29, 102, 109, 17
    }
    

    config.h

    #define DIALOG_1    1
    #define LCDCon  LCDCon
    #define IDC_EXIT    101
    #define CONFIG  Config
    

    Nur wenn ich auf den Button klicke, passiert nix...selbst wenn ich das kreuz oben rechts anklicke passiert nix...
    Ich bin NewBie, daher bitte nicht lachen 😉
    Kann mir auch nebenbei bitte einer sagen, wie ich den Hintergrund von dem Dialog ändern kann?

    Danke



  • Kannst du mir mal sagen warum du dir ne Klasse registrierst und dann doch CreateDialog nutzt?



  • Hi,

    Diese Zeile müsstest du noch ändern hwnd = CreateDialog (hInstance, szAppName, 0, NULL) ;

    Denn statt NULL musst du die Prozedur dieser Dialogbox übergeben, wie z.B.

    ... hwnd = CreateDialog (hInstance, szAppName, 0, DlgProc );...
    
    BOOL CALLBACK DlgProc (HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) // Dialogprozedur 
    {
    ......
    }
    

    Schau mal genauer beim Petzold nach, da wird beschrieben wie es geht 😉

    MfG Unwissender 🙂



  • case IDCANCEL: // Achtung
        PostQuitMessage(0);
        return 0;
    


  • Das war gerade für das Kreuz oben rechts 🙄



  • komisch...Petzold hat die Klasse aber auch Registriert...naja, da muss ich wohl noch lesen...

    jetzt bekomme ich diese Fehlermeldung :

    Error LCDCON.CPP 16: Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' in function __stdcall WinMain(void *,void *,char *,int)

    betreffende Zeile :

    hwnd = CreateDialog (hInstance, szAppName, NULL, DlgProc);
    

    und DlgProc :

    BOOL CALLBACK DlgProc (HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
          switch (message)
          {
                 case IDCANCEL:
                 PostQuitMessage (0) ;
                 return 0 ;
          }
          return DefWindowProc (hdlg, message, wParam, lParam) ;
    }
    

    sorry, ich kapier das nicht...in der Hilfe steht, die API
    thx



  • erwartet als letzten Parameter die Adresse der DialogProc, die gebe ich ihm doch oder?

    ausversehen auf Enter gedrückt...



  • Wenn der Petzold da schon DLGWINDOWEXTRA angibt dann soll bestimmt auch DefDlgProc aufgerufen werden und nicht DefWindowProc.



  • Original erstellt von <fadfreak>:
    erwartet als letzten Parameter die Adresse der DialogProc, die gebe ich ihm doch oder?

    Nö. Du gibst ihm einen Pointer auf eine Window-Proc.



  • funktioniert immernoch nicht :

    #include <windows.h>
    #include "config.h"
    
    BOOL CALLBACK DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                              PSTR szCmdLine, int iCmdShow)
    {
          static TCHAR szAppName[] = TEXT ("LCDCon") ;
          HWND         hwnd ;
          MSG          msg ;
    
          hwnd = CreateDialog (hInstance, szAppName, 0, DlgProc);
    
          ShowWindow (hwnd, iCmdShow) ;
    
          while (GetMessage (&msg, NULL, 0, 0))
          {
                 TranslateMessage (&msg) ;
                 DispatchMessage (&msg) ;
          }
          return msg.wParam ;
    }
    
    BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
          switch (message)
          {
                case WM_DESTROY:
                 PostQuitMessage (0) ;
                 return 0 ;
          }
          return DefDlgProc (hwnd, message, wParam, lParam) ;
    }
    


  • nimm doch den quellcode von der cd. der wird wohl richtig sein und funktionieren? 😕 😕



  • ja...ich glaube das werde ich wohl machen müssen...schade...
    Mein Ziel : Eine Dialog-Box öffnen, ohne vor ein Fenster geöffnet zu haben...also kein CreateWindow, ist das überhaupt möglich?

    Danke



  • Natürlich ist sowas möglich 😉



  • Original erstellt von <fadfreak>:
    **ja...ich glaube das werde ich wohl machen müssen...schade...
    Mein Ziel : Eine Dialog-Box öffnen, ohne vor ein Fenster geöffnet zu haben...also kein CreateWindow, ist das überhaupt möglich?

    Danke**

    Geh auf http://www.winapi.net unter "Codeschnipsel" findest Du "Eine rein dialog-basierte Anwendung erzeugen"

    Das ist genau DAS, was Du suchst!



  • Ja, habe ich gemacht, immernoch der gleiche Fehler :

    Compiling LCDCON.CPP:
    Error LCDCON.CPP 15: Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' in function __stdcall WinMain(void *,void *,char *,int)

    Ist das mein Compiler?

    aber das wars eigentlich, was ich suchte...



  • Lösch deinen kompletten Quelltext und füge das Beispiel von Winapi.net ein!
    Du bist der erste, der mit dem dort abgedruckten (kompletten) Quelltext Fehler hat!



  • HALT DIE KLAPPE



  • Nein, nein. Hör nicht auf die anderen! Du musst den letzten Parameter in CreateDialog() nach DLGPROC casten. Also so:

    CreateDialog(..., (DLGPROC)DialogProc);
    


  • Wenn man das richtig macht braucht man den Cast NICHT!



  • @<Ars>: Halt dein Maul, du kleiner IDIOT !!!!!!!! Du hast ja keine Ahnung! Im BCB z.B. MUSS man das casten!



  • DANN IST DER BCB EIN ASOZIALER COMPILER!! ICH WERDE DAS GLEICH TESTEN, OB DU WIRKLICH RECHT HATTEST, NOTFALLS ENTSCHULDIGE ICH MICH EIN BISSCHEN 😡


Anmelden zum Antworten