Einfache Dialog-Anwendung



  • Hallo zusammen,

    ich programmiere mit VS2008.

    Ich würde gerne ein Programm in C++ schreiben, welches auf einem Dialog statt auf einem normalen Window basiert.

    Mein jetziger Code:

    // tool.cpp : Definiert den Einstiegspunkt für die Anwendung.
    
    #include "stdafx.h"
    #include "tool.h"
    
    // Vorwärtsdeklarationen der in diesem Codemodul enthaltenen Funktionen:
    INT_PTR CALLBACK    DialogProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    
    int APIENTRY _tWinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPTSTR    lpCmdLine,
                         int       nCmdShow)
    {
        return DialogBox (hInstance, MAKEINTRESOURCE(IDD_MAINDLG), 0, DialogProc);
    }
    
    // Meldungshandler für HauptDialog.
    INT_PTR CALLBACK DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {    
         switch (message)
         {
         case WM_INITDIALOG:
             return TRUE;
    
         case WM_CLOSE:
             EndDialog (hwnd,0);
             return TRUE;  
         }
         return FALSE;
    }
    
    // Meldungshandler für Infofeld.
    INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            return (INT_PTR)TRUE;
    
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    

    Ich weiß nicht, ob der Code vollkommen richtig ist, aber er funktioniert^^.
    Vielleicht habt ihr einen besseren Vorchlag..Wäre cool.

    Also das eigentliche Problem ist, dass der IDD_MAINDLG im Editor ganz normal aussieht (er beinhaltet ein Tab Control), aber als kompilierte Anwendung das Tab Control nicht funktioniert und anders aussieht:

    http://img151.imageshack.us/my.php?image=toolir2.jpg

    Ich hoffe, ihr könnt mir helfen,

    MfG,
    echo<delta>



  • Für Dialoge ist immer die einfachste Lösung, diese in einer Ressource (rc-Datei) festzulegen und über Menüpunkte aufzurufen. Windows verwaltet dann selbst die Fenster.



  • Sry, habe vergessen zu erwähnen, dass ich den Dialog in einer rc-Datei erstellt habe.

    Sollte aber aus dem Codebeispiel hervorgehen 🙂

    Mfg, echo<delta>



  • Das ist wirklich wichtig für mich zu wissen, weil alle meine zukünftigen programme darauf aufgebaut sein werden..

    Mfg, echo<delta>



  • Bei Dialogen sollte man...

    - BOOL CALLBACK DialogProc() verwenden, da man sowiso nur TRUE und FALSE zurückgibt.
    - Vorher InitCommonControls(Ex)() aufrufen, siehe msdn.
    - eine Klasse verwenden, die den Dialog repräsentiert, dh, die Klasse enthält aufrufprozedur, DlgProc, sowie statische DlgProc die DlgProc in Klasse aufruft, um auf Klassenmember zurückzugreifen. Dadurch behält man den Überblick über das Geschehen^^.
    - Siehe dir die FAQs an, wie man den XP-Style per manifest einkompiliert.

    -> Dialoge in der MSDN
    http://msdn.microsoft.com/en-us/library/ms632588(VS.85).aspx

    -> Windows Controls in der MSDN
    http://msdn.microsoft.com/en-us/library/bb773173(VS.85).aspx

    -Serious_C



  • als alternative zur winapi allgemein sei hier noch wxwidgets und qt genannt. 🙂



  • Danke, aber ich kann damit nicht recht viel anfangen?

    Wo liegt denn der eigentliche Fehler, den man auf dem Bild sehen kann?

    Ich habe auch nichts gegen ein konkretes codebeispiel.

    MfG,
    echo<delta>



  • @Fencer: Fuck wxWidgets... We are WinAPI!!!
    Warum nicht direkt WinAPI? es ist doch nicht schwer...??!!



  • Kann mir hier niemand helfen? 😞

    Das ist echt wichtig..

    Wie macht ihr das eigentlich, also bevorzugt ihr eher Dialog-Anwendungen, wie sie viele kleine Anwendungen verwenden, oder benutzt ihr die 'normalen' Fenster?

    MfG, echo<delta>



  • echo<delta> schrieb:

    Wo liegt denn der eigentliche Fehler, den man auf dem Bild sehen kann?

    Du musst dem Tab-Control noch Tabs hinzufügen 😉 Im Editor wird das Tab-Control mit Tabs angezeigt, damit man was sieht. Im Programm musst du sie dann aber selber hinzufügen.

    edit: Also einfach bei WM_INITDIALOG:

    TCITEM item = { TCIF_TEXT, 0, 0, "Hallo" };
    TabCtrl_InsertItem( GetDlgItem(hwnd,TAB_CTRL_ID), 0, &item );
    

Anmelden zum Antworten