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

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

11

24.06.2011, 00:01

Wenn du einfach nur für Windows GUIs machen willst tu dir doch einen Gefallen und verwend C# und die WPF...

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

12

24.06.2011, 00:06

Wie gesagt, das wäre sicher einfacher, aber mir geht es hauptsächlich gerade ums Verständnis (außerdem kenne ich mich mit C# nicht wirklich gut aus - müsste mich da auch erst mal intensiv einarbeiten, wozu ich gerade keine Zeit habe, weil ich mich auch noch mit neuronalen Netzen beschäftige).
Wäre also nett, wenn jemand eine Idee hätte.

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

13

24.06.2011, 00:11

Naja die "Low-Level Befehle" hast du dann immer noch parat, einfach die benötigte Headerdatei includieren (ggf. Bib noch linken) und die gewünschten Befehle benutzen. (Bei dir DirectX)

Mit Qt ist Multithreading absolut kein Problem es wird eine simple Klasse dafür bereitgestellt und die Kommunikation findet über Signale und Slots statt, da brauchst du dir absolut keine Gedanken mehr über Zugriffsrechte und die absicherung von Variblen zu machen, da passieren sonnst die meisten Fehler.

Naja zurück zu deinem Problem, ich bezweifel das du da was findest, da dies wie gesagt keinen Sinn machen würde, jedoch werden die Fensterformulare in Qt in einer XML-Struktur abgespeichert, dü konntest dir nun eine Parser selbert bauen und die einzelnen Elemente dann mit WinAPI rekursiv nachbauen.

mfg Rushh0ur

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

14

24.06.2011, 00:20

Ja, dass ich Funktionen der WinAPI, DirectX und MultiThreading mit Qt zusammen benutzen kann, ist mir schon klar, aber das, was ich möchte, wäre das:
Ich habe eine ganz normale WinMain-Funktion. Diese ist das Herz des Programms. Sie erzeugt ein Parentwindow und startet z.B. diverse Threads. Innerhalb des Parentwindows rendert der eine Thread mittels DirectX. Daneben im Parentwindow befindet sich ein weiteres Childwindow, das von Qt "verwaltet" wird. Es muss doch irgendwie möglich sein, Qt mittels eines HWND-Handels, ein Fenster zuzuweisen?

Ich habe das gefunden, was mir aber auch nicht weiterhilft, weil es keine QWinWidget.h gibt...
http://doc.qt.nokia.com/solutions/4/qtwi…32-example.html

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

15

24.06.2011, 16:36

Ach du willst dein schon vorhandenes Programm noch mit Qt erweitern.

Soweit ich weiss gibt es manche Klassen nur in der Commerzielen Version, da gehört wohl QWinWidget dazu.
Du kansnt dies jedoch anderst Lösen:

Du brauchst ein QApplication Objekt, welches den Eventhandler von Qt verwaltet.
Und halt noch dein QWidget Objekt, also dein Fenster, von welchem du das Window-Handle (HWND) mit der Klassenfunktion winId() erhällst.

Der Code könnte dann in etwa so lauten (pseudo):

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
int APIENTRY WinMain(...)
{
    QApplication *qtApp = new QApplication(...);

    // Deine Initializationen
    ...

    while (eventloop)
    {
        // dein event handler
        ...

        qtApp->processEvents();
    }
}

LRESULT CALLBACK WndProc(HWND hWnd, ...)
{
    ...
    case WM_CREATE:
            QWidget *widget = new QWidget();
            SetParent(widget->winId(), hWnd);
            widget->show();
        break;
    ...
    case WM_DESTROY:
            delete widget;
        break;
}


mfg Rushh0ur

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

16

24.06.2011, 20:22

Danke. Das ist genau das, was ich meine.
Ist es nun auch noch möglich, dem Widget ein .ui Formular (das schon in eine Header-Datei umgewandelt wurde) zu übergeben, so dass das Formular angezeigt wird und ich die ganzen Events (wie gedrückte Buttons etc.) via Signals/Slots abfangen kann?

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

17

25.06.2011, 13:07

Jup funktioiert, grad ausprobiert.
Hab jedoch den generierten Code etwas angepasst und daraus eine abgeleitete Klasse von QWidget gemacht und lasse die Unterelemente da drauf erstellen.


(Link)


Mfg Rushh0ur

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

18

25.06.2011, 14:34

OK, werde mir den Code mal genauer anschauen. Ich habe es gestern anders herum hinbekommen: Qt erzeugt einen neuen Thread, der praktisch eine WinMain-Funktion repräsentiert, die ein Win32-Fenster erzeugt.
Hierbei klappt aber der Nachrichtenaustausch zwischen dem Win32-Fenster und Qt noch nicht so wirklich. Ich kann ja sendEvent() nicht benutzen, da ich nicht aus einem anderen Thread heraus auf das Qt-Window zugreifen kann.

BurningWave

Alter Hase

  • »BurningWave« ist der Autor dieses Themas

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

19

26.06.2011, 21:51

Nächstes Problem (ich komme mir gerade echt dumm vor...):
Ich habe ein Fenster, in dem ein Videostream einer Webcam angezeigt wird. Jetzt möchte ich einzelne Bilder aus dem Stream herausfiltern, um sie anderweitig weiterzuverarbeiten. Das klappt mit GetPixel() perfekt, jedoch ist diese Methode natürlich unvereinbar langsam. Ich habe mir gedacht, ich könnte einfach das ganze Fenster als Bitmap in ein anderes Ziel kopieren, jedoch funktioniert das, aus mir unklaren Gründen, nicht:

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
34
35
36
37
38
39
40
41
        BITMAPINFO BitmapInfo;
        BitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        BitmapInfo.bmiHeader.biWidth = IMAGE_WIDTH;
        BitmapInfo.bmiHeader.biHeight = IMAGE_HEIGHT;
        BitmapInfo.bmiHeader.biPlanes = 1;
        BitmapInfo.bmiHeader.biBitCount = 32;
        BitmapInfo.bmiHeader.biCompression = BI_RGB;
        BitmapInfo.bmiHeader.biSizeImage = 0;
        BitmapInfo.bmiHeader.biXPelsPerMeter = 1;
        BitmapInfo.bmiHeader.biYPelsPerMeter = 1;
        BitmapInfo.bmiHeader.biClrUsed = 0;
        BitmapInfo.bmiHeader.biClrImportant = 0;
        BitmapInfo.bmiColors[0].rgbBlue = 0;
        BitmapInfo.bmiColors[0].rgbGreen = 0;
        BitmapInfo.bmiColors[0].rgbRed = 0;
        BitmapInfo.bmiColors[0].rgbReserved = 0;

        BITMAP Bitmap;
        PAINTSTRUCT ps;
        HDC hdcMain = BeginPaint(GVImage->winId(), &ps); // GVImage->winId() liefrt HWND des Ziels (Frame in anderem Fenster)

        BYTE *pPixelsVideo;
        HBITMAP hBitmap = CreateDIBSection(GetDC(hVideo), &BitmapInfo, DIB_RGB_COLORS, (void **)&pPixelsVideo, NULL, 0); // hVideo ist HWND des Fensters, in dem der Videostream angezeigt wird
        if(!hBitmap)
        {
            MessageBox(winId(), "Error", "CreateDIBSection() failed", MB_ICONSTOP);
            return;
        }

        HDC hdcMem = CreateCompatibleDC(hdcMain);
        GetObject(hBitmap, sizeof(HBITMAP), &Bitmap);
        SelectObject(hdcMem, hBitmap); 

        RECT rect;
        GetWindowRect(hVideo, &rect);
        if(!BitBlt(hdcMain, 0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, hdcMem, 0, 0, SRCCOPY))        {
            MessageBox(winId(), "Error", "BitBlt() failed", MB_ICONSTOP);
            return;
        }

        EndPaint(GVImage->winId(), &ps);


Das Ziel (hdcMain) zeigt nur ein schwarzes Rechteck. Hat jemand eine Idee? Wie bekomme ich die Pixel des Bitmaps als Zeiger (pPixelsVideo enthält irgenwie nichts Brauchbares)?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

26.06.2011, 22:27

Wenn es dir darum geht unter Windows das Bild von einer Webcam zu bekommen verwend doch DirectShow oder die MF. Das Bild irgendwo aus einem Fenster rauszukopieren würd ich jetzt mal als ziemlich hässlichen und problematischen (was wenn Teile des Fensters verdeckt sind?) Hack bezeichnen...

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (26.06.2011, 22:42)


Werbeanzeige