Win32API Window and Tango

Denis Koroskin 2korden at gmail.com
Wed Aug 27 08:14:37 PDT 2008


On Wed, 27 Aug 2008 19:07:27 +0400, Zarathustra  
<adam.chrapkowski at gmail.com> wrote:

> Denis Koroskin Wrote:
>
>> On Wed, 27 Aug 2008 18:24:52 +0400, Zarathustra
>> <adam.chrapkowski at gmail.com> wrote:
>>
>> > How to create WIN32Window with Tango?
>> > Why window handle is null?
>> >
>> > module test;
>> > import tango.sys.win32.UserGdi;
>> > extern (C) void rt_init( void delegate(Exception) dg = null );
>> > extern (C) void rt_term( void delegate(Exception) dg = null );
>> >
>> > extern(Windows)HWND    CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD,
>> > int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID);
>> > extern(Windows)HGDIOBJ GetStockObject(int);
>> >
>> >  
>> //_____________________________________________________________________________________________________________________
>> > //	C functions
>> > //
>> >
>> > // function WinMain
>> >  
>> //_____________________________________________________________________________________________________________________
>> > extern (Windows) int
>> > WinMain(HINSTANCE o_hInstance, HINSTANCE o_hPrevInstance, LPSTR
>> > o_lpCmdLine, int o_nCmdShow){
>> >
>> >   rt_init();
>> >
>> > 	int l_result;
>> > 	try{
>> > 		l_result = Main(o_hInstance, o_hPrevInstance, o_lpCmdLine,  
>> o_nCmdShow);
>> > 	}
>> > 	catch(Object o){
>> > 		MessageBoxA(null, cast(char*)o.toString(), "Fatal Error", MB_OK |
>> > MB_ICONERROR);
>> > 		l_result = 0;
>> > 	}
>> > 	rt_term();
>> > 	return l_result;
>> > }
>> >
>> > // function WindowProc
>> >  
>> //_____________________________________________________________________________________________________________________
>> > extern (Windows) int
>> > WindowProc(HWND o_hWindow, uint o_message, WPARAM o_wParam, LPARAM
>> > o_lParam){
>> > 	switch(o_message){
>> > 	
>> > 		case WM_CREATE:
>> > 			return 0;
>> > 					
>> > 		case WM_CLOSE:
>> > 			PostQuitMessage(0);
>> > 			return 0;
>> > 	
>> > 		case WM_DESTROY:
>> > 			return 0;
>> > 	
>> > 		case WM_KEYDOWN:
>> > 			switch(o_wParam){
>> > 				default:
>> > 					return 0;
>> > 			}
>> > 			return 0;
>> > 	
>> > 		default:
>> > 			return DefWindowProcA(o_hWindow, o_message, o_wParam, o_lParam);
>> >   }
>> > }
>> >
>> >  
>> //_____________________________________________________________________________________________________________________
>> > //	D functions
>> > //
>> >
>> > // function Main
>> >  
>> //_____________________________________________________________________________________________________________________
>> > int
>> > Main(HINSTANCE o_hInstance, HINSTANCE o_hPrevInstance,	LPSTR
>> > o_lpCmdLine, int o_nCmdShow){
>> >
>> > 	// register window class
>> >  
>> 	//____________________________________________________________________
>> > 	WNDCLASS l_cWindow;
>> > 	with(l_cWindow){
>> > 		style         = CS_OWNDC;
>> > 		lpfnWndProc   = &WindowProc;
>> > 		cbClsExtra    = 0;
>> > 		cbWndExtra    = 0;
>> > 		hInstance     = hInstance;
>> > 		hIcon         = LoadIconA(cast(HINSTANCE)null, IDI_APPLICATION);
>> > 		hCursor       = LoadCursorA(cast(HINSTANCE)null, IDC_ARROW);
>> > 		hbrBackground = cast(HBRUSH)GetStockObject(BLACK_BRUSH);
>> > 		lpszMenuName  = null;
>> > 		lpszClassName = "WINDOWCLASS";
>> > 	}
>> > 	assert(RegisterClassA(&l_cWindow));	
>> >
>> > 	// create main window
>> >  
>> 	//____________________________________________________________________
>> > 	HWND l_hWindow = CreateWindowExA(
>> > 		0,
>> > 		"WINDOWCLASS",
>> > 		"WINDOWCLASS",
>> > 		WS_CAPTION | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
>> > 		100,
>> > 		100,
>> > 		640,
>> > 		640,
>> > 		HWND_DESKTOP,
>> > 		cast(HMENU)null,
>> > 		o_hInstance,
>> > 		null
>> > 	);
>> > 	assert(l_hWindow);	// <- error l_hWindow is null
>> > 	
>> > 	// show window
>> >  
>> 	//____________________________________________________________________
>> > 	ShowWindow(l_hWindow, SW_SHOW);
>> > 	UpdateWindow(l_hWindow);
>> >
>> > 	// program main loop
>> >  
>> 	//____________________________________________________________________
>> > 	MSG l_message;
>> > 	msgsPomp:
>> > 	while(true){
>> > 		
>> >     // check for messages
>> >     if(PeekMessageA(&l_message, cast(HWND)null, 0, 0, PM_REMOVE)){
>> > 		
>> >       // handle or dispatch messages
>> >       if(l_message.message == WM_QUIT){
>> >         break msgsPomp;
>> >       }
>> >       else{
>> >         TranslateMessage(&l_message);
>> >         DispatchMessageA(&l_message);
>> >       }
>> >     }
>> >     else{
>> > 			Sleep(20);
>> > 		}
>> >   }
>> > 	return l_message.wParam;
>> > }
>>
>> Hmm.. I have no problems with your code, it shown an empty black window
>> with a "WINDOWCLASS" caption.
>
> I don't have any idea what's wrong?
> Tango 0.97
> I'm dsss user:
>
> command line:
> dsss build test.d
>
> dsss.conf;
> [test.d]
> buildflags+=-L/exet:nt
> buildflags+=-L/su:windows:5
> buildflags+=-full

I use "dmd app.d gdi32.lib".
Don't know what Tango version it is, but it is bundled with DMD1.029


More information about the Digitalmars-d-learn mailing list