Win32API Window and Tango
Zarathustra
adam.chrapkowski at gmail.com
Wed Aug 27 08:38:52 PDT 2008
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.
More information about the Digitalmars-d-learn
mailing list