Win32API Window and Tango
Denis Koroskin
2korden at gmail.com
Wed Aug 27 07:37:18 PDT 2008
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.
More information about the Digitalmars-d-learn
mailing list