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