[C++] CreateWindow() returns geen hwnd

Pagina: 1
Acties:

  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
[C++][Win32]
Sinds een tijdje ben ik mij weer wat meer aan het verdiepen in C++ en wil daar nu graag ook applicaties mee maken die een form gebruiken (win32), dus niet .NET library's. nu ben ik al een poosje aan het stoeien om een simpel form te krijgen, maar tevergeefs...

De volgende code zou volgens mij wat moeten doen, maar CreateWindow() geeft geen hwnd terug, schijnbaar is er toch iets niet helemaal goed.

de code komt goed (zonder warnings) door de compiler en linker, maar als je de applicatie uitvoerd gebeurd er helemaal niets. wie helpt mij verder...

C++:
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
#include <windows.h>

#pragma comment(lib,"user32.lib")

HINSTANCE hinst; 

BOOL WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    HWND handle;

    hinst = hinstance;
    LPVOID pointvoid32 = NULL;

    handle = CreateWindow(
        L"Test",
        L"Test",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        (HWND) NULL,
        (HMENU) NULL,
        hinst,
        pointvoid32
    );

    if (!handle) return FALSE; 
 
    ShowWindow(handle, nCmdShow); 
    UpdateWindow(handle); 
    return TRUE; 

}

[ Voor 4% gewijzigd door TygeR op 29-06-2006 23:21 ]


Verwijderd

Je bent op de goede weg, maar moet de documentatie nog iets beter lezen...

Syntax

HWND CreateWindow( LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam
);

Parameters
lpClassName
[in] Pointer to a null-terminated string or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpClassName; the high-order word must be zero. If lpClassName is a string, it specifies the window class name. The class name can be any name registered with RegisterClass or RegisterClassEx, provided that the module that registers the class is also the module that creates the window. The class name can also be any of the predefined system class names. For a list of system class names, see the Remarks section.

  • TygeR
  • Registratie: Oktober 2000
  • Laatst online: 06-02-2025
Bedankt, Zinnetje inderdaad over het hoofd gezien...

Nu maar eens even uitzoeken hoe deze naam te registreren, moet wel gaan lukken denk ik, toch fijn om te weten dat ik op de goede weg zit.

Zijn er mensen geïntereseerd in de source als het gelukt is?
ik heb zelf ook al wel een tijdje naar example's gezocht maar die heb ik nergens kunnen vinden (die dan ook nog compilen).

  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Ik denk dat je er gauw achter zal komen dat een (uitgebreide) GUI applicatie in puur win32 API programmeren zeer omslachtig is. Als je windows applicaties wilt gaan maken maar niet gebaseerd op .NET kan je beter kijken naar MFC of WTL (mijn persoonlijke voorkeur gaat uit naar WTL maar over MFC is veel meer te vinden).

Niet dat er iets mis is met win32 programmeren ofzo. Het is altijd gezond om evaring op te doen met hoe windows nou precies werkt. MFC en WTL zijn ook gewoon op het win32 API gebaseerd natuurlijk dus het is altijd nuttig om wat meer te weten van hoe alles nou onderwater precies werkt. Maar een applicatie erin schrijven (tenzij het gewoon een simpel tooltje is) is toch niet erg fijn. Je bent gewoon enorm veel tijd met allerlei dingen handmatig afvangen die door de meeste frameworks al gewoon voor je worden gedaan.

[Edit: bovendien, als je doel inderdaad is om je in C++ te verdiepen dan zijn MFC en WTL ook betere keuzes want beide zijn een object georienteerde schil om het win32 API. Het win32 API zelf is gewoon C.]

[ Voor 12% gewijzigd door ReverendBizarre op 30-06-2006 09:47 ]


  • MisterData
  • Registratie: September 2001
  • Laatst online: 11-02 08:33
Wat je dus moet doen is een WNDCLASS (of een WNDCLASSEX) structure vullen en daarna registreren met RegisterClass (RegisterClassEx). Dan lukt het wel :)

En ik snap trouwens ook niet waarom je HINSTANCE hinst = hinstance; doet, je kunt ook gewoon hinstance zelf gebruiken natuurlijk. Hetzelfde voor die 'pointvoid32'? Gewoon NULL als laatste parameter van CreateWindow werkt prima.

[ Voor 44% gewijzigd door MisterData op 30-06-2006 11:04 ]


  • JeroenB
  • Registratie: November 1999
  • Laatst online: 28-01 22:54
Als je Visual Studio 2002 (of nieuwer) gebruikt, dan kun je bij het maken van een Win32-project aangeven dat je de basis wilt laten genereren. Je krijgt dan een vrijwel kale applicatie waar wel dit soort zaken correct zijn opgezet. Je kunt er evenveel van leren aangezien je de applicatie die je gaat maken er toch tussen moet zien te klussen :) Het scheelt alleen wat geprobeer aan het begin.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Het enige verschil is inderdaad dat je wizard het voor je aanmaakt, terwijl je het vroeger met de hand moest overtypen :)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • roelboel
  • Registratie: Oktober 2005
  • Laatst online: 12-12-2025
MisterData schreef op vrijdag 30 juni 2006 @ 11:02:
En ik snap trouwens ook niet waarom je HINSTANCE hinst = hinstance; doet, je kunt ook gewoon hinstance zelf gebruiken natuurlijk.
Waarschijnlijk wil hij hem later nog eens gebruiken, hij wijst hem toe aan een global. Anderzijds kun je natuurlijk ook GetModuleHandle(0) doen.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

IrishMaiden schreef op vrijdag 30 juni 2006 @ 09:45:
Als je windows applicaties wilt gaan maken maar niet gebaseerd op .NET kan je beter kijken naar MFC of WTL (mijn persoonlijke voorkeur gaat uit naar WTL maar over MFC is veel meer te vinden).
Kunnen we de term MFC nu ajb eens laten vallen nu de 20e eeuw echt al 6 jaar voorbij is? MFC is een lachertje en een anachronisme, en een extreem opgezet slecht framework wat een beetje junior developer in een middagje beter doet.

Professionele website nodig?


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Ik zou zeggen ga aan de slag. Ik hoor vanmiddag wel wat je gemaakt heb dan.

Als je nou even had gezegd wat volgens jou dan het alternatief is dan had je post misschien niet compleet nutteloos geweest. Ik zei al dat ik ook geen fan ben van MFC maar feit is wel dat het gewoon veel gebruikt wordt en dat het zeker een handiger alternatief is dan een hele applicatie zelf in elkaar prutsen met puur win32 API. WTL is wat mij betreft een stuk beter dan MFC maar het wordt niet officeel door MS ondersteund en er is daarom dus gewoon bar weinig over te vinden (maar het is dan wel opensource dus in theorie kan je zelf uitzoeken hoe alles werkt als je daar tijd voor hebt).

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 17-12-2025

curry684

left part of the evil twins

IrishMaiden schreef op maandag 03 juli 2006 @ 09:57:
Als je nou even had gezegd wat volgens jou dan het alternatief is dan had je post misschien niet compleet nutteloos geweest.
Het alternatief? Met je fikken van Win32/C++ afblijven als je niet fundamenteel weet hoe een message queue werkt. Of een echte GUI-library als Qt inzetten. Of gewoon .NET/C# pakken en 20 keer sneller klaar zijn. Iets met "right tool for the right job".

Maar als ik het zo zie is TS juist bezig met zich thuis maken in de wereld van windowclasses en message queues, wat lovenswaardig is, en dan vind ik jouw advies om naar een ridicuul slecht framework te kijken als alternatief voor een gezond stukje zelfeducatie stukken nuttelozer dan mijn post die mensen waarschuwt tegen het gebruik van dat ridicuul slechte framework :)

Professionele website nodig?


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Misschien moet je mijn post dan maar gewoon nog eens een keer lezen he? Ik zeg namelijk precies hetzelfde. Leren hoe windows applicaties op win32 API niveau werken is goed. Vervolgens hele applicaties erin proberen te bouwen is minder handig. Wat je daarna kiest als framework bovenop win32 API kan mij verder niks schelen. Feit is gewoon dat je *iets* moet kiezen, of je bent 85% van je programmeer tijd kwijt aan het uitvinden van wiel na wiel.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
Als je geen mening hebt moet je niet schrijven
[je kunt] beter kijken naar MFC of WTL
MFC /is/ niet beter dan Win32/C++. MFC was vroeger nodig met Win16/VC++, maar aangezien zowel Win32 als VC++ een enorme verbetering in vergelijking met vroeger zijn is MFC nu achterhaald.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • ReverendBizarre
  • Registratie: December 2001
  • Laatst online: 24-03-2021
Zucht. Als jullie allemaal willen gaan miereneuken...

Wat ik bedoelde is dat, als je van plan bent daadwerkelijk een applicatie te gaan bouwen (en niet gewoon voor leerervaring dus), dat je ipv puur win32 API programmeren *beter* kan kijken naar een framework *zoals* MFC of WTL (of iets anders dus).

Bovendien, ik weet niet wat jij denkt dat VC++ betekent maar het is gewoon een paraplu term voor alle GUI frameworks van MS en daar zijn MFC en ATL (waarop WTL is gebaseerd) toch echt de meeste prominente van. Daar is nu support voor .NET aan toegevoegd maar dat wil de TS juist niet.

http://msdn.microsoft.com/visualc/learning/default.aspx
Pagina: 1