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

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

16.08.2010, 17:13

Aus Konsole heraus ein WinAPI-Fenster erzeugen.

Hallo Leute.
Ich wollt mal zum Spass ein Kontrollfenster einbauen, um Debuginfos auszugeben.
Ich hatte keine Lust, mir selbst eins zu basteln, also hab ichs mal mit einem WinAPI
Projekt und aufgerufener Konsole (Ihr wisst schon ? Die DOSKonsole die man bei jedem WinAPI Programm (nur 1x) öffnen kann... ?) versucht.

hmm. Aber das Buch, aus dem das stammt, scheint zu alt zu sein - Meine Konsole wird nicht angezeigt.
Auch google liefert nur tonnenweise irreführende MSDN Links.. :(

Naiv wie ich war wollte ich einfach alles "umdrehen": Nun wird das Fenster aus der Konsole (Win32 Console) gestartet.
Sollte doch machbar sein!

Aber leider verhält sich mein Programm -äußerst- merkwürdig O.o

Ich mach den Debugmodus an, es läuft Schritt für Schritt durch und .. Es durchquert einmal die:

C-/C++-Quelltext

1
2
3
4
5
while(GetMessage(&msg,0,0))
{
    TranslanteMessage(&msg);
    DispatchMessage(&msg);
 }



Und "steht still"...
Ich kann weder die Konsole noch mein Fenster sehen :(
Wenn ich auf "Alle anhalten" drücke, um zu sehen wo das Teil grade im Quelltext ist, kommt eine VS2010EXPRESS Meldung in einem neuen Tab "Quelltext nicht verfügbar" ???

Meine Vermutung: Man muss bei der WinAPI ja "alle 2 Befehle" die HINSTANCE mitgeben. Dazu verwende ich GetModuleHandle(NULL);
(Beim Programmstart von main() liefert mir das Ding ja keinen HINSTANCE Parameter).
Könnts sein, dass der HINSTANCE Parameter irgendwie falsch / inkompatibel ist ??

Hier mal der Quelltext:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Sauber formatiert :D

#include <iostream>
#include <fstream>
#include <Windows.h>

using namespace std;

LRESULT CALLBACK WINDOW(HWND,UINT,WPARAM,LPARAM);

int main(int argc, char* argv[])
{
    SetConsoleTitle(L"Profexxor Software AES Verschl\x84sselungsprogramm: Konsole");

    printf("Hallo Jemand da ?");
    WNDCLASSEX wcx;
    wcx.cbClsExtra=0;
    wcx.cbSize=sizeof(WNDCLASSEX);
    wcx.cbWndExtra=0;
    wcx.hbrBackground=(HBRUSH)COLOR_WINDOW+1;
    wcx.hCursor=LoadCursor(GetModuleHandle(NULL),IDC_ARROW);
    wcx.hIcon=LoadIcon(GetModuleHandle(NULL),NULL);
    wcx.hIconSm=wcx.hIcon;
    wcx.hInstance=GetModuleHandle(NULL);
    wcx.lpfnWndProc=WINDOW;
    wcx.lpszClassName=L"psaes";
    wcx.lpszMenuName=NULL;
    wcx.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClassEx(&wcx))
    {
        printf("Registrierung der Fensterklasse fehlgeschlagen!\n");
        cin.get();
        exit(-1);
    }

    HWND hWnd=CreateWindowEx(0,L"psaes",L"Profexxor Software: AES 256 Bit Verschlüsseungsprogramm",WS_OVERLAPPEDWINDOW,100,100,100,100,0,0,GetModuleHandle(NULL),0);

    if(!hWnd)
    {
        printf("Fenster konnte nicht erzeugt werden!\n");
        cin.get();
        exit(-2);
    }

    MSG msg;
    while(GetMessage(&msg,hWnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    printf("Programmfenster geschlossen.");
    cin.get();
    exit(-1);

    return 0;   
}

LRESULT CALLBACK WINDOW(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
        {
            exit(1);
            break;
        }
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}


(fstream soll euch mal nicht kümmern. Die Funktion kommmt später noch dazu (soll :( )

PS: Vielen Dank für alle Antworten; Ich hoffe ich hab mich nicht wieder blamiert ^^
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

2

16.08.2010, 19:36

Lass uns ein Spiel spielen: Finde die Unterschiede in meinem Code :)

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Sauber formatiert :D

#include <iostream>
#include <fstream>
#include <Windows.h>

using namespace std;

LRESULT CALLBACK WINDOW(HWND,UINT,WPARAM,LPARAM);

int main(int argc, char* argv[])
{
    SetConsoleTitle(L"Profexxor Software AES Verschl\x84sselungsprogramm: Konsole");

    printf("Hallo Jemand da ?");
    WNDCLASSEX wcx;
    wcx.cbClsExtra=0;
    wcx.cbSize=sizeof(WNDCLASSEX);
    wcx.cbWndExtra=0;
    wcx.hbrBackground=(HBRUSH)COLOR_WINDOW+1;
    wcx.hCursor=LoadCursor(GetModuleHandle(NULL),IDC_ARROW);
    wcx.hIcon=LoadIcon(GetModuleHandle(NULL),NULL);
    wcx.hIconSm=wcx.hIcon;
    wcx.hInstance=GetModuleHandle(NULL);
    wcx.lpfnWndProc=WINDOW;
    wcx.lpszClassName=L"psaes";
    wcx.lpszMenuName=NULL;
    wcx.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClassEx(&wcx))
    {
        printf("Registrierung der Fensterklasse fehlgeschlagen!\n");
        cin.get();
        exit(-1);
    }

    HWND hWnd=CreateWindowEx(0,L"psaes",L"Profexxor Software: AES 256 Bit Verschlüsseungsprogramm",WS_OVERLAPPEDWINDOW,100,100,500,500,0,0,GetModuleHandle(NULL),0);

    if(!hWnd)
    {
        printf("Fenster konnte nicht erzeugt werden!\n");
        cin.get();
        exit(-2);
    }

    ShowWindow(hWnd, SW_NORMAL);
    UpdateWindow(hWnd);

    printf("Hallo Welt ich hab ein Fenster :)");
    MSG msg;
    while(GetMessage(&msg,0,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    printf("Programmfenster geschlossen.");
    cin.get();
    //exit(-1); sinnlos...

    return 0;   
}

LRESULT CALLBACK WINDOW(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
    switch(msg)
    {
    case WM_DESTROY:
        {
            PostQuitMessage(0);
        }break;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC dev = BeginPaint(hWnd, &ps);
            std::wstring text(TEXT("Hallo Welt ich hab ne Konsole :)"));
            TextOut(dev, 50, 50, text.c_str(), text.size());
            EndPaint(hWnd, &ps);
        }return 0;
    }
    return DefWindowProc(hWnd,msg,wParam,lParam);
}


Beweis das es klappt: siehe Anhang :)
»GR-PA« hat folgendes Bild angehängt:
  • abc.jpg
Signaturen werden überbewertet

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

3

16.08.2010, 19:52

Ich hab ShowWindow weggelassen, da ich bei meinen Win32 API Projekten immer nShowCmd als Parameter verwendet habe.
Der stand hier nicht zur Verfügung. Ich dachte ich hätte gelesen, der Parameter wäre unnötig :S da Windows ShowWindow schon
bei CreateWindowEx ausführt.

Komisch: Eins meiner anderen (reinen Win32API Projekte funktioniert vollkommen ohne ShowWindow und UpdateWindow) ?( :

Hier maln ausschnitt:

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
    g_hInst=hInst;

    wcx.cbClsExtra=0;
    wcx.cbSize=sizeof(wcx);
    wcx.cbWndExtra=0;
    wcx.hbrBackground=(HBRUSH)COLOR_WINDOW+0;
    wcx.hCursor=LoadCursor(hInst,IDC_ARROW);
    wcx.hIcon=LoadIcon(hInst,0);
    wcx.hIconSm=wcx.hIcon;
    wcx.hInstance=hInst;
    wcx.lpfnWndProc=window;
    wcx.lpszClassName=L"profexxor";
    wcx.lpszMenuName=0;
    wcx.style=CS_HREDRAW|CS_VREDRAW;

    assert(RegisterClassEx(&wcx));

    hWnd=CreateWindowEx(0,L"profexxor",L"Eingabegerätekontrollzentrum",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,600,400,0,0,hInst,0);

    while(GetMessage(&msg,hWnd,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }


Liegt das daran, dass der Compiler/Linker das Projekt auf Windows Konfiguration laufen hat oder... ?
Weil mein Fenster (das dieses Programms) wird angezeigt, wird aktualisiert ect.

Achja:
Danke
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

16.08.2010, 19:58

Man beachte das WS_VISIBLE in deinem Code da oben ;)

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

5

17.08.2010, 15:39

Herrjee :pinch:

Danke jedenfalls!
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

Werbeanzeige