Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

1

21.06.2011, 13:04

Childfenster aus Dialog-Resourcen [WinAPI]

Hallo,

ich bin gerade dabei etwas mit der WinAPI und Fenstergestaltung ohne zusätzliche Grafikbibliotheken zu experimentieren. Soweit funktioniert auch alles, nur das Erstellen von Childfenstern aus Dialogresourcen, die mit dem Dialog Designer von Visual Studio erstellt wurden, bereitet mir Probleme. Wenn ich ein Childfenster erstelle und als Klassenname den Namen angebe, den ich dem Dialogfeld im Resourceneditor gegeben habe, wird auch ein Childfenster erstellt, jedoch werden keine Steuerelemente erstellt. Andere Eigenschaften, die ich im Resourceneditor angegben habe, werden auch ignoriert. Ich habe die Vermutung, dass ich die Dialogresource noch irgendwie laden muss, damit die WinAPI auch alle Steuerelemente der Resource erstellt.
Hier die relevanten Codeausschnitte:

C-/C++-Quelltext

1
2
3
4
5
    // Child-Hauptdialog anzeigen (hWnd ist Handle auf Parent-Window)
    hMainDlg = CreateWindow("MainWindowDlg", "MainWindowDlg", WS_CHILDWINDOW | WS_OVERLAPPEDWINDOW, IMAGE_WIDTH + 10, 0, CW_USEDEFAULT, 0, hWnd, NULL, hInstance, NULL);
    ShowWindow(hMainDlg, SW_SHOWNORMAL);
    UpdateWindow(hMainDlg);
    InvalidateRect(hMainDlg, NULL, true);

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Registriert die Fensterklasse
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;

    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WEBCAMTEST));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WEBCAMTEST);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    ATOM r = RegisterClassEx(&wcex); // Parent-Window Fensterklasse registrieren

    wcex.lpfnWndProc = MainDlgProc;
    wcex.hIcon = 0;
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "MainWindowDlg";
    RegisterClassEx(&wcex); // Child-Window Fensterklasse registrieren

    return r; 
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Verarbeitet Meldungen vom Child-Dialogfenster.
LRESULT CALLBACK MainDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    int wmId, wmEvent;

    switch (message) 
    {
    case WM_CREATE:
        break;
    case WM_COMMAND:
        wmId    = LOWORD(wParam);
        wmEvent = HIWORD(wParam);

        switch (wmId)
        {
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        break;
    case WM_PAINT:
        // TODO: Hier den Zeichnungscode hinzufügen.
        Draw(hWnd);
        break;
    case WM_MOVE:
    case WM_SIZE: 
        InvalidateRect(hWnd, NULL, true);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }

    return 0;
}

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// zeichnet den Inhalt des Fensters
void Draw(HWND hWnd)
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hWnd, &ps);
    RECT rect;
    rect.top = IMAGE_HEIGHT + 20;
    rect.left = 0;
    rect.right = IMAGE_WIDTH;
    rect.bottom = IMAGE_HEIGHT + 100;
    DrawText(hdc, acDriverInfo, strlen(acDriverInfo), &rect, DT_LEFT);
    EndPaint(hWnd, &ps);
}


Hat jemand eine Idee, warum das Childfenster nicht nach Vorgaben der Dialogresource erstellt wird?

Grüße
BurningWave

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

21.06.2011, 13:51

Hat jemand eine Idee, warum das Childfenster nicht nach Vorgaben der Dialogresource erstellt wird?

Weil das einfach nicht so funktioniert!? Eine Dialog Ressource ist eine Dialog Ressource und keine automatisch generierte Fensterklasse oder sowas, wo auch immer du das herhast... Schau dir mal CreateDialog() bzw. DialogBox() an.

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

3

21.06.2011, 14:58

Danke. Dann war das doch ein Denkfehler. Ich habe es jetzt hinbekommen. Ich werde mich jetzt wahrscheinlich mal mit Qt beschäftigen.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

21.06.2011, 15:05

Wenn du vorhast Anwendungen mit komplexeren GUIs zu schreiben kann ich dir nur zu C# raten.

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

5

21.06.2011, 15:19

Eine Anwendung mit ziemlich komplexer GUI habe ich schon mit C++ und den VCL-Bibliotheken geschrieben. Mit C# dürfte man aber viel mehr Möglichkeiten haben, mit Qt und C++ doch aber auch...
Mein eigentliches Ziel bei dem kleinen Testprojekt war es, einen Bereich aus Windows-Steuerelementen, einen Direct3D Bereich und einen Bereich, in dem der Videostream einer angeschlossenen Webcam angezeigt wird, zu kombinieren.
Eine Frage habe ich aber trotzdem noch. Das Dialogfeld wird jetzt schön als Childfenster angezeigt, jedoch haben die Steuerelemente diesen alten grauen Look von Windows < XP. Wie kann ich die Steuerelemente mit der blauen Umrandnung darstellen, wie man sie aus Windows Vista, 7 kennt?

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

6

21.06.2011, 16:11

Signaturen werden überbewertet

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

21.06.2011, 17:30

Danke, hat funktioniert.

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

8

23.06.2011, 23:25

Ich habe jetzt Qt heruntergeladen, kompiliert (was ~2h gedauert hat) und mit dem Visual Studio Plug-in ins Visual Studio 2010 integriert. Ich habe soweit verstanden, wie ich Qt Programme entwickeln kann und begonnen die Doku dazu zu lesen.

Jetzt habe ich aber nochmal eine Frage:
Ist es möglich ein Qt Formular als Child in einer normalen Win32-WinAPI Anwendung zu öffnen? Kennt jemand passende Tutorials oder eine Lösung für dieses Problem? Ich habe im Internet wirklich nichts passendes gefunden. Ist es außerdem möglich, ein Projekt so zu konfigurieren, dass hinzugefügte Qt Dialoge beim Kompilieren automatisch übersetzt werden?

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

9

23.06.2011, 23:51

Hi,
arbeite in letzter zeit auch mit Qt unter Visual Studio und muss sagen dass es mich possitiv überrascht hat, vorallem mit dem Plugin ist es doch kein Problem mehr irgentwelche GUI-Anwendungen zussamen zu klicken und zu erstellen.

Warum willst du ein Qt Formular in eine Win32 Api öffnen, irgentwie versteh ich grad nicht den Sinn dafür, solang du die Qt Bibliothek verwendest bist du sogar (theoretisch) Plattformunabhängig.

Mit dem Plugin kannst du doch GUI-Anwendungen erstellen, Formulare hinzufügen und Designen wie du es brauchst.

Mfg Rushh0ur

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

10

23.06.2011, 23:58

Der Sinn ist vorerst egal, ich möchte nur wissen, ob und wie das geht. Ich kann es eigentlich nicht brauchen, wenn mir eine Lib, wie Qt alle Arbeit abnimmt und ich nicht wirklich weiß, was diese im Hintergrund alles macht. Deswegen möchte ich - ob sinnvoll oder nicht - zumindest bei diesem Testprojekt die WinAPI und Qt kombinieren. Ich habe gar nicht vor, plattformunabhängig zu programmieren, dafür finde ich manche Funktionen der WinAPI viel zu komfortabel. Außerdem bin ich eh kein Linux-Fan.
Ich finde es einfach gut, wenn ich ein Anwendungsgrundgerüst habe, durch das ich auf niedrigerer Ebene die Anwendung steuern kann und nicht alles über Qt machen muss. Ein weiterer Punkt wäre Multithreading, so dass ich beispielsweise ein Childfenster mit Qt habe und ein anderes, indem DirectX irgendwas rendert (und diese beiden getrennt sind).

Werbeanzeige