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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

12.01.2008, 23:35

Fehler: Fensterklasse wurde nicht gefunden

also.. das wird jetz ein bischen komplizierter:


ich hab da ne klasse frmServer. diese klasse erbt von der klasse Window, welche eine funktion namens Create() besitzt und eine funktion namens Load() welche virtual ist, und in Create() aufgerufen wird.


in der klasse frmServer wird die Load() funktion überladen. darin befinden sich ein paar anweisungen wie das erstellte fenster auszusehen hat (buttons, textboxen usw.).


sobald ich also folgendes mache:

frmServer.Create(param1, param2, ...);

wird in der Create() funktion mir CreateWindow() ein fenster erstellt.
das zurückgelieferte handle wird in der klasse intern in der variable
HWND m_hwndWindow gespeichert. nach der CreateWindow() kommt der aufruf der Load() funktion.

in der Load() funktion soll erstmal nur eine textbox (txtLog) erstellt werden. sie erhält das handle des servers über den constructor, und speichert dieses handle in der variable HWND m_hwndParent.
die textbox txtLog ruft ihre Create() funktion auf und soll mit CreateWindow() eine editbox erstellen.

und DAS ist der punkt. CreateWindow() liefert NULL, und die textbox wird nicht erstellt. als error bekomme ich folgenden text:

Zitat


CreateWindow failed with error 1407: Fensterklasse wurde nicht gefunden.


beim debuggen sind die variablen eigtl. OK, ich kann also nicht wirklich sagen wo jetzt das problem liegt..

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
// -------------------------------------------------------------------

// Name:    Create()

// Desc:    Creates a Win32 window

// -------------------------------------------------------------------

int Forms::Window::Create(...) // liste ist zu lang

{
    if(!RegisterClassEx(&wc))
        return 1;

    m_hwndWindow = CreateWindowEx(dwExStyle,
                                    wc.lpszClassName,
                                    m_lpWindowName,
                                    dwStyle,
                                    xPos, yPos,
                                    Width, Height,
                                    hwndParent,
                                    hMenu,
                                    wc.hInstance,
                                    lpParam);

    if(!m_hwndWindow)
        return 1;


    // [...]


    Load(); // <-- die funktion die überschrieben wird.


   
    ShowWindow(m_hwndWindow, SW_HIDE);
    UpdateWindow(m_hwndWindow);

    return 0;
} // Create()





// -------------------------------------------------------------------

// Name:    Constructor()

// Desc:    TextBox constructor.

// -------------------------------------------------------------------

Forms::TextBox::TextBox(const HWND hwndParent)
: m_hwndTextBox(NULL), m_hwndParent(NULL), m_bEnabled(true), m_bReadOnly(false), m_lpText(NULL)
{
    m_hwndParent = hwndParent;

    m_lpText = new wchar_t[2048];
} // Constructor()






// -------------------------------------------------------------------

// Name:    frmServer_Load()

// Desc:    Initializes the window.

// -------------------------------------------------------------------

void frmServer::Load() // überschreibt Server::Load()

{
    // txtLog

    txtLog = new TextBox(m_hwndWindow);
    txtLog->Create(L"txtLog", INTERSPACE, INTERSPACE, 400, 300);
} // frmServer_Load()
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

13.01.2008, 11:03

woher kommt wc.lpszClassName und wo rufst du RegisterClass auf!?

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

3

13.01.2008, 17:13

wc wird als parameter übergeben.

die RegisterClass wird gleich als erstes aufgerufen..

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
int Forms::Window::Create(const WNDCLASSEX& wc, const DWORD dwExStyle, LPCWSTR lpWindowName, const DWORD dwStyle, const int xPos, const int yPos, const int Width, const int Height, const HWND hwndParent, const HMENU hMenu, const LPVOID lpParam)
{
    if(!RegisterClassEx(&wc))
        return 1;

    m_hwndWindow = CreateWindowEx(dwExStyle,
                                    wc.lpszClassName,
                                    m_lpWindowName,
                                    dwStyle,
                                    xPos, yPos,
                                    Width, Height,
                                    hwndParent,
                                    hMenu,
                                    wc.hInstance,
                                    lpParam);

    if(!m_hwndWindow)
        return 1;


    m_lpWindowName  = lpWindowName;
    m_hInstance     = wc.hInstance;
    m_iWidth        = Width;
    m_iHeight       = Height;
    m_xPos          = xPos;
    m_yPos          = yPos;

    if(hMenu)
        m_hMenu = hMenu;

    Load();


    ShowWindow(m_hwndWindow, SW_HIDE);
    UpdateWindow(m_hwndWindow);

    return 0;
} // Create()
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

13.01.2008, 20:36

hat keiner eine idee?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

5

14.01.2008, 15:43

vielleicht als zusätzliche information:


wenn ich ein fenster über die basisklasse "Window" erstelle, dann funktioniert das ganze so wie es funktionieren soll..

wenn ich aber eine neue klasse schreibe die von "Window" erbt, dann funktioniert das mit der Textbox plötzlich nicht mehr..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

14.01.2008, 17:06

Könnte es daran liegen, dass du der structur "wc " ihre eigene Größe nicht
mitgibts ? ( So wars letztens bei mir )

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

7

14.01.2008, 17:23

zuerst hab ich WNDCLASSEX und CreateWindowEx verwendet, und da hab ich noch die größe übergeben. wegen der probleme die ich im moment hab, hab ich alles umgebschrieben und WNDCLASS und CreateWindow verwendet..

bei WNDCLASS muss man die größe nicht angeben.. also daran kann es glaub ich nicht liegen..

leute.. ich muss das projekt fertig bekommen.. hab sogar ein bischen ein zeitlimit. ist für die schule..

ich bräuchte unbedingt hilfe!

falls es was hilft, ihr könnt euch das projekt runterladen. beim debuggen seht ihr dass die variablen eigtl. ok sind und da hin zeigen wohin sie zeigen sollen


download server.rar [3.02 MB]
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

14.01.2008, 18:52

So denke hab den Fehler gefunden:

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
// -------------------------------------------------------------------

// Name:    Create()

// Desc:    Creates a new textbox.

// -------------------------------------------------------------------

int Forms::TextBox::Create(LPCWSTR TextBoxName, const int xPos, const int yPos, const int Width, const int Height)
{
    m_hwndTextBox = CreateWindow(   TextBoxName,
                                    TextBoxName,
                                    WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL|
                                    ES_LEFT | ES_MULTILINE,
                                    xPos, yPos,
                                    Width, Height,
                                    m_hwndParent,
                                    (HMENU)1,
                                    NULL,
                                    NULL);

    ErrorExit(L"CreateWindow");

    

    if(!m_hwndTextBox)
        return 1;

    m_bReadOnly = false;

    return 0;
} // Create()



So erstellst du das Textfeld !!! Im ersten Parameter muss aber L"edit" stehen:

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
// -------------------------------------------------------------------

// Name:    Create()

// Desc:    Creates a new textbox.

// -------------------------------------------------------------------

int Forms::TextBox::Create(LPCWSTR TextBoxName, const int xPos, const int yPos, const int Width, const int Height)
{
    m_hwndTextBox = CreateWindow(   L"edit",
                                    TextBoxName,
                                    WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL|
                                    ES_LEFT | ES_MULTILINE,
                                    xPos, yPos,
                                    Width, Height,
                                    m_hwndParent,
                                    (HMENU)1,
                                    NULL,
                                    NULL);

    //ErrorExit(L"CreateWindow");


    

    if(!m_hwndTextBox)
        return 1;

    m_bReadOnly = false;

    return 0;
} // Create()


Bei mir funktioniert es jedenfalls.

Ach ja und deine Error-funktion geht auch aus dem Programm wenn es gar keinen
Fehler gibt.


PS: Nette Prog-Stiel ( machste das für Docu )

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

9

14.01.2008, 19:53

:oops: wenns wenigstens was verstecktes gewäsen wäre.. aber sowas peinliches!


omg.. aber auf jeden fall danke fürs ansehn.. und danke für das kompliment wegen des programmier stils :) aber ich mach das nicht wegen doku, sondern einfach so ^^


edit:
die error funktion hab ich nur schnell aus der msdn-doku rauskopiert ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige