www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Win32 with D: Using RegisterClassExA instead of RegisterClass

reply "BeschBesch" <d475502 drdrb.com> writes:
So, I wanted to try out D as a better alternative to C/C++ and
now I bump into some minor problems. Basically, it seems the
WinAPI is limited to D.
My problem: Using WNDCLASS and RegisterClass works out fine but
when I try the Ex-versions (RegisterClassExA/WNDCLASSEX) windows
returns a INVALID_PARAMETER error, though I did not change
anything besides adding "Ex".

Where is the mistake or is my approach totally wrong?

module winmain;

import core.runtime;
import std.conv;
import std.utf;
import core.sys.windows.windows;

public import myWindows.d; // for extended WinAPI stuff...still
empty

pragma(lib, "gdi32.lib");
pragma (lib,"user32.lib");

extern (Windows)
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{
       int result;

       try
       {
           Runtime.initialize();

           result = myWinMain(hInstance, hPrevInstance, lpCmdLine,
nCmdShow);

           Runtime.terminate();
       }
       catch (Throwable o)		// catch any uncaught exceptions
       {
          MsgBox(o.toString(),"Runtime error");
	   result = 0;		// failed
       }

       return result;
}

int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR
lpCmdLine, int nCmdShow)
{

	HWND wnd;
	MSG msg;
	WNDCLASSEXA wce;

	wce.cbClsExtra = 0;
	wce.cbWndExtra = 0;
	wce.hbrBackground = cast(HBRUSH)GetStockObject(WHITE_BRUSH);
	wce.hCursor = LoadCursorA(null,IDC_ARROW);
	wce.hIcon = LoadIconA(null, IDI_APPLICATION);
	wce.hIconSm = LoadIconA(null, IDI_APPLICATION);
	wce.hInstance = hInstance;
	wce.lpszClassName = cast(char*)("VolumeControl_Main");
	wce.style = 0;
	wce.lpszMenuName = null;
	wce.lpfnWndProc = &WinProc;

	if (!RegisterClassExA(&wce))
	{
		MessageBoxA(null,cast(char*)"RegisterClass failed!",
cast(char*) "Init-Error",0);
		return 0;
	}

	wnd =
CreateWindowExA(0,wce.lpszClassName,"TestBox",WS_OVERLAPPEDWINDOW,
250,250,250,250,null,null,hInstance,null);

	ShowWindow(wnd, SW_SHOWNORMAL);
	UpdateWindow(wnd);

	while (GetMessageA(&msg,null,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessageA(&msg);
	}

	return 0;
}

extern(Windows)
LRESULT WinProc(HWND wnd, UINT msg, WPARAM W, LPARAM L) nothrow
{
	switch (msg)
	{
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		default:
	}

	return DefWindowProcA(wnd, msg, W, L);
}
Jan 28 2014
parent reply "John Chapman" <johnch_atms hotmail.com> writes:
On Tuesday, 28 January 2014 at 21:17:18 UTC, BeschBesch wrote:
 My problem: Using WNDCLASS and RegisterClass works out fine but
 when I try the Ex-versions (RegisterClassExA/WNDCLASSEX) windows
 returns a INVALID_PARAMETER error, though I did not change
 anything besides adding "Ex".

 Where is the mistake or is my approach totally wrong?
 	WNDCLASSEXA wce;
You need to fill in the cbSize field like so: wce.cbSize = WNDCLASSEXA.sizeof;
 	wce.cbClsExtra = 0;
 	wce.cbWndExtra = 0;
 	wce.hbrBackground = cast(HBRUSH)GetStockObject(WHITE_BRUSH);
 	wce.hCursor = LoadCursorA(null,IDC_ARROW);
 	wce.hIcon = LoadIconA(null, IDI_APPLICATION);
 	wce.hIconSm = LoadIconA(null, IDI_APPLICATION);
 	wce.hInstance = hInstance;
 	wce.lpszClassName = cast(char*)("VolumeControl_Main");
 	wce.style = 0;
 	wce.lpszMenuName = null;
 	wce.lpfnWndProc = &WinProc;
Jan 28 2014
parent "BeschBesch" <d475502 drdrb.com> writes:
 You need to fill in the cbSize field like so:

          wce.cbSize = WNDCLASSEXA.sizeof;
Ungh. How embarassing. Now it works, thank you.
Jan 29 2014