Win32API Window and Tango

Denis Koroskin 2korden at gmail.com
Wed Aug 27 08:57:42 PDT 2008


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

> Denis Koroskin Wrote:
>
>> 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
>
> Yes, gdi32.lib is needed, because dmd\lib\gdi32.lib don't contain  
> GetStockObject function.
> My Tango is bundled with latest DMD1.033
> Later I will try swap gdi32.dll (maybe is corrupted) and compile with  
> older Tango and DMD versions.

Indeed, compiling with the most recent Tango version gives an assertion  
failure. And it's most probably not a compiler's fault, because old Tango  
+ new dmd shows the window for me. And gdi32.libs are the same for both  
releases.


More information about the Digitalmars-d-learn mailing list