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

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

61

19.07.2006, 19:30

Doch ich verstehe ihn vollkommen. Das einzige was ich nicht verstand, war das mit dm LOWORD. Deswegen hab ich etwas rumprobiert und hab ausversehen HIWORD stehen lassen. Ich bin den Code bereits step by step durchgegangen und verstehe ihn nun. Ich weiß dass es nichts bringt wenn ich alles nur kopiere aber den Kern nicht verstehe. Es war mein erster richtiger Versuch mit der WinApi usw. was zu machen. Das Ziel war selbstverständlich am Ende etwas zu lernen.

Zitat


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// Globale Variablen 

    WPARAM                        wParam; 
    ::HWND                        hWnd; 
    ::WNDCLASS                    wndcls; 
    ::MSG                        msg; 
    HMENU                        hMenu_            = CreateMenu(); 
    HMENU                        hMenuTemp        = CreateMenu(); 
    HMENU                        hMenuObject        = CreateMenu(); 
    HMENU                        hMenuTemp2        = CreateMenu(); 
    HMENU                        hMenuCharakter    = CreateMenu(); 
    HMENU                        hMenuLevel        = CreateMenu(); 
    const unsigned short        ID_NEWFILE        = fix::IDM_NEW;

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

62

19.07.2006, 19:50

Nimms mir nicht übel aber wenn ich das sehe frag ich mich ob dir nicht auch noch ein wenig (elementares) Wissen im C/C++ Bereich fehlt ... Diese Zuweiusung macht hinten und vorne keinen Sinn.

Angebot:
Du addest mich mal im MSNM und ich geb dir Zugriff auf den Leveleditor an dem ich grad arbeite, evtl bringt dir das ja ein wenig was =)

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

63

19.07.2006, 19:53

Fred ich geb dir mal den Code der genau das macht was du willst, ich glaub kaum das es dir was nützt anderen code, der im Normalfall noch schwerer ist nachzuvollziehen. Der Petzold wird dir helfen - da bin ich mir sicher, aber an der ein oder anderen Stelle hast du noch Lücken in deinem C Wissen

Da wärst du auch selber drauf gekommen!

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
#define UNICODE
#include <windows.h>

const unsigned short        ID_UNDEFINED      = 0;  // Diese ID haben wir noch nicht vergeben, deswegen ungültig

const unsigned short        ID_NEWFILE        = 1;  // es wurde auf Neue Datei geklickt ;)


LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int __stdcall WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{ 
 // -- Obermenü --

    // Das Dateinemü

    AppendMenuW(hMenuTemp, MF_STRING, ID_NEWFILE, L"&Neu\tStrg + N"); //<- wichtig!!!!

    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Öffnen ...\tStrg + 0"); // <- noch nicht definiert, kannst du machen vllt. Übung?

    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Speichern\tStrg + S");
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Speichern unter ...");
    AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL);
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Beenden\tStrg + Q");
    AppendMenu(hMenu_, MF_POPUP, (UINT_PTR)hMenuTemp, L"&Datei");
    hMenuTemp = CreateMenu();

    // Das Bearbeitenmenü

    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Rückgängig\tStr + Z");
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Wiederherstellen\tStr + Y");
    AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL);
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Ausschneiden\tStr + X");
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Kopieren\tStr + C");
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Einfügen\tStr + V");
    AppendMenuW(hMenuTemp, MF_SEPARATOR, 0, NULL);
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Alles auswählen\tStr + A");
    AppendMenuW(hMenuTemp, MF_STRING, ID_UNDEFINED, L"&Alles auswählen\tStr + Shift + A");
    AppendMenu(hMenu_, MF_POPUP, (UINT_PTR)hMenuTemp, L"&Bearbeiten");
    hMenuTemp = CreateMenu();
   
    // Informationen für das Fenster

    wndcls.cbClsExtra = 0;
    wndcls.cbWndExtra = 0;
    wndcls.hbrBackground = static_cast<HBRUSH>(::GetStockObject((int)WHITE_BRUSH));
    wndcls.hCursor = NULL;
    wndcls.hIcon = NULL;
    wndcls.hInstance = hInstance;
    wndcls.lpfnWndProc = WindowProc;
    wndcls.lpszClassName = L"app";
    wndcls.lpszMenuName = NULL;  // <= Menu rein

    wndcls.style = CS_HREDRAW | CS_VREDRAW;

    if(!::RegisterClassW(&wndcls))
        return 1;

    // Fenster erstellen

    hWnd = ::CreateWindowW( L"app", L"Test" , WS_OVERLAPPEDWINDOW, 0, 0, 1280, 782, ::GetDesktopWindow(), hMenu_, hInstance, NULL);
   
    if(!hWnd) // Fehler beim erstellen des Fensters

        return 1;

    ::ShowWindow(hWnd, nCmdShow);
    ::UpdateWindow(hWnd);

    while(::GetMessageW(&msg, NULL, NULL, NULL))
    {
        ::TranslateMessage(&msg);
        ::DispatchMessageW(&msg);
    }
    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //<-- das wParam brauchen wir und das wird uns durch windows übergeben!

{
    switch(uMsg)
    {
    case WM_CLOSE:
        PostQuitMessage(0);
        return 0;
    case WM_COMMAND:
        if(LOWORD(wParam) == ID_NEWFILE) // <-- Abfrage

        MessageBox(hWnd, L"Sie haben auf Neu gedrückt!", L"Neu", MB_OK);
        if(LOWORD(wParam) == ID_UNDEFINED)
        MessageBox(hWnd, L"Ungültige ID", L"Neu", MB_OK);
    };
    return ::DefWindowProcW(hwnd, uMsg, wParam, lParam);
}


Gurke hat genau diese ID's definiert und halt in nen Namensraum gepackt, ist also nichts wildes. :idea:

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

64

19.07.2006, 22:25

@Gurke: Im jetzigen Code ist die ID_NEWFILE auch nicht mehr drin.
Ich werde dich mla adden.

@ koschka: Der Code ist aber im Prinzip nichts anderes außer dass du den Namespace weggelassen hast

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

65

19.07.2006, 22:29

ich wollt ihn trotzdem nochmal hinschreiben für andere die suchen bzw. weil ich mich gefragt hab warum du globale wParam Messages hast.

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

66

28.09.2006, 20:13

Ich schreib es jetzt hier rein weil es das gleiche Projekt ist, konnte nur lange nicht mehr daran arbeiten also warum sagt mir der Computer, dass er das Bild nicht laden konnte?

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
case WM_CREATE:
        {
        hHnt = (HBITMAP)LoadImage(GetModuleHandle(NULL), L"Hnt.bmp", IMAGE_BITMAP, 0,0, LR_DEFAULTSIZE);
        if(hHnt == NULL)
            MessageBoxW(hWnd, L"Konnte das Hintergrundbild nicht laden.", L"Error", MB_OK | MB_ICONEXCLAMATION);
        break;
        }

    case WM_PAINT:
        {
        BITMAP bm;
        PAINTSTRUCT ps;

        HDC hdc = BeginPaint(hWnd, &ps);

        HDC hdcMem = CreateCompatibleDC(hdc);
        HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hHnt);

        GetObject(hHnt, sizeof(bm), &bm);

        BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, hbmOld);
        DeleteDC(hdcMem);

        EndPaint(hWnd, &ps);
        break;
        }


Führe ich das Programm aus kommt eben die Fehlermeldung konnte Hnt nicht laden

67

28.09.2006, 21:10

1. GetLastError + FormatMessage
2. LR_FROMFILE oder so hast du vergessen ... usw :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

68

28.09.2006, 22:11

so steht es hier:
http://www.winprog.org/tutorial/bitmaps.html

Was genau muss ich denn da noch einfügen

69

28.09.2006, 22:32

Naja ... hol dir halt mal mit GetLastError die Fehlermeldung und formatier dir die mit FormatMessage so das da auch was lesbares steht ;)

und bei dir sollte noch folgendes rein:

C-/C++-Quelltext

1
2
3
4
5
6
7
case WM_CREATE:
{
    hHnt = (HBITMAP)LoadImage(GetModuleHandle(NULL), TEXT("Hnt.bmp"), IMAGE_BITMAP, 0, 0, 
                                                LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
    if (hHnt == NULL)
        MessageBox(hWnd, TEXT("Konnte das Hintergrundbild nicht laden."), NULL, MB_OK | MB_ICONERROR);
} break;


Und das DoubleBuffering ist so auch nen bissel komisch gelöst ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Fred

Supermoderator

  • »Fred« ist der Autor dieses Themas

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

70

28.09.2006, 22:37

Jetzt hab ich es geschnallt

danke

Fred

Werbeanzeige