cmake-d/samples/minwin_gtk/minwin/mswindows.d

609 lines
21 KiB
D

/*
* Windows API not covered by std.c.windows.windows
*/
module minwin.mswindows;
public import std.c.windows.windows;
package import std.windows.charset;
package import std.utf;
extern (Windows):
export BOOL PostMessageA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
export BOOL SendMessageA(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
export BOOL SendMessageW(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
export UINT SetTimer(HWND hWnd, uint id,uint time, TIMERPROC proc);
export BOOL KillTimer(HWND hWnd, uint id);
export BOOL IsWindowVisible (HWND hWnd);
export BOOL IsWindowEnabled (HWND hWnd);
export BOOL IsWindow (HWND hWnd);
export BOOL EnableWindow (HWND hWnd, BOOL enable);
export BOOL BringWindowToTop (HWND hWnd);
export BOOL DestroyWindow (HWND hWnd);
export BOOL MoveWindow (HWND hWnd, int x, int y, int w, int h, byte bRepaint);
export int SetWindowLongA (HWND hWnd, int nIndex, int dwNewLong);
export int GetWindowLongA (HWND hWnd, int nIndex);
export int GetWindowTextA (HWND hWnd, LPTSTR str, int count);
export int GetWindowTextW (HWND hWnd, LPWSTR str, int count);
export BOOL SetWindowTextA (HWND hWnd, LPTSTR str);
export BOOL SetWindowTextW (HWND hWnd, LPWSTR str);
export ushort GetKeyState(int key);
export ATOM RegisterClassExA(WNDCLASSEXA *lpWndClass);
export BOOL GetTextExtentPoint32A(HDC dc, LPCSTR str, int len, SIZE* s);
export BOOL GetTextExtentPoint32W(HDC dc, LPWSTR str, int len, SIZE* s);
export BOOL IsDialogMessageA(HWND hWnd, PMSG msg);
export int LoadStringA(HINSTANCE inst, LPSTR id, LPTSTR buf, int siz);
export int LoadStringW(HINSTANCE inst, LPWSTR id, LPWSTR buf, int siz);
export int MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);
export int GetSystemMetrics(int nIndex);
/*
struct INITCOMMONCONTROLSEX {
DWORD dwSize;
DWORD dwICC;
}
export void InitCommonControls();
export BOOL InitCommonControlsEx(INITCOMMONCONTROLSEX*);
*/
export DWORD GetSysColor(int);
const uint WM_PAINTICON = 0x0026;
const uint WM_ICONERASEBKGND = 0x0027;
const uint WM_NEXTDLGCTL = 0x0028;
const uint WM_SPOOLERSTATUS = 0x002A;
const uint WM_DRAWITEM = 0x002B;
const uint WM_MEASUREITEM = 0x002C;
const uint WM_DELETEITEM = 0x002D;
const uint WM_VKEYTOITEM = 0x002E;
const uint WM_CHARTOITEM = 0x002F;
const uint WM_SETFONT = 0x0030;
const uint WM_GETFONT = 0x0031;
const uint WM_SETHOTKEY = 0x0032;
const uint WM_GETHOTKEY = 0x0033;
const uint WM_QUERYDRAGICON = 0x0037;
const uint WM_COMPAREITEM = 0x0039;
const uint WM_SIZING= 0x0214;
const uint WM_CAPTURECHANGED= 0x0215;
const uint WM_MOVING= 0x0216;
const uint WM_POWERBROADCAST= 0x0218;
const uint WM_DEVICECHANGE= 0x0219;
const uint DS_MODALFRAME = 0x80;
const uint ICON_SMALL = 0;
const uint ICON_BIG = 1;
export BOOL GdiFlush();
struct SIZE {
int cx;
int cy;
}
alias SIZE* PSIZE;
const uint SBM_SETPOS =0x00E0;
const uint SBM_GETPOS =0x00E1;
const uint SBM_SETRANGE =0x00E2;
const uint SBM_SETRANGEREDRAW =0x00E6;
const uint SBM_GETRANGE =0x00E3;
const uint SBM_ENABLE_ARROWS =0x00E4;
const uint SBM_SETSCROLLINFO =0x00E9;
const uint SBM_GETSCROLLINFO =0x00EA;
const uint SIF_RANGE =0x0001;
const uint SIF_PAGE =0x0002;
const uint SIF_POS =0x0004;
const uint SIF_DISABLENOSCROLL =0x0008;
const uint SIF_TRACKPOS =0x0010;
const uint SIF_ALL =(SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS);
const uint SW_SCROLLCHILDREN =0x0001;
const uint SW_INVALIDATE =0x0002;
const uint SW_ERASE =0x0004;
struct SCROLLINFO {
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
}
export int SetScrollInfo(HWND, int, SCROLLINFO*, BOOL);
export BOOL GetScrollInfo(HWND, int, SCROLLINFO*);
struct ICONINFO {
BOOL fIcon;
DWORD xHotspot;
DWORD yHotspot;
HBITMAP hbmMask;
HBITMAP hbmColor;
}
alias ICONINFO* PICONINFO;
export HICON CreateIconIndirect(PICONINFO piconinfo);
export HBITMAP CreateCompatibleBitmap(HDC hdc,int width,int height);
export COLORREF GetPixel(HDC hdc,int x,int y);
export HBRUSH CreateSolidBrush(COLORREF c);
export BOOL BitBlt(HDC dest,int x,int y,int width,int height,
HDC src,int xsrc,int ysrc, DWORD op);
//alias HANDLE HBRUSH;
export HANDLE LoadImageA(HINSTANCE hInstance, LPCSTR lpName,UINT utype,
int cx, int cy, UINT load);
export HANDLE LoadImageW(HINSTANCE hInstance, LPCWSTR lpName,UINT utype,
int cx, int cy, UINT load);
enum { IMAGE_BITMAP, IMAGE_CURSOR, IMAGE_ICON };
const uint GW_HWNDFIRST = 0;
const uint GW_HWNDLAST = 1;
const uint GW_HWNDNEXT = 2;
const uint GW_HWNDPREV = 3;
const uint GW_OWNER = 4;
const uint GW_CHILD = 5;
const uint GW_MAX = 5;
const int GWL_USERDATA = -21;
export HWND GetWindow (HWND hWnd, int dir);
const uint MF_INSERT =0x00000000L;
const uint MF_CHANGE =0x00000080L;
const uint MF_APPEND =0x00000100L;
const uint MF_DELETE =0x00000200L;
const uint MF_REMOVE =0x00001000L;
const uint MF_BYCOMMAND =0x00000000L;
const uint MF_BYPOSITION =0x00000400L;
const uint MF_SEPARATOR =0x00000800L;
const uint MF_ENABLED =0x00000000L;
const uint MF_GRAYED =0x00000001L;
const uint MF_DISABLED =0x00000002L;
const uint MF_UNCHECKED =0x00000000L;
const uint MF_CHECKED =0x00000008L;
const uint MF_USECHECKBITMAPS =0x00000200L;
const uint MF_STRING =0x00000000L;
const uint MF_BITMAP =0x00000004L;
const uint MF_OWNERDRAW =0x00000100L;
const uint MF_POPUP =0x00000010L;
const uint MF_MENUBARBREAK =0x00000020L;
const uint MF_MENUBREAK =0x00000040L;
const uint MF_UNHILITE =0x00000000L;
const uint MF_HILITE =0x00000080L;
const uint MF_SYSMENU =0x00002000L;
const uint MF_HELP =0x00004000L;
const uint MF_MOUSESELECT =0x00008000L;
export HMENU CreateMenu();
export BOOL DrawMenuBar(HWND win);
export BOOL SetMenu(HWND win, HMENU menu);
export BOOL AppendMenuA(HMENU menu, uint flags, void*item, char* str);
export BOOL AppendMenuW(HMENU menu, uint flags, void*item, wchar* str);
// 32 bit version
void* SetWindowLongPtr (HWND hWnd, int nIndex, void* dwNewLong) {
return cast(void*)SetWindowLongA(hWnd,nIndex,cast(int)dwNewLong);
}
void* GetWindowLongPtr (HWND hWnd, int nIndex) {
return cast(void*)GetWindowLongA(hWnd,nIndex);
}
/* CombineRgn() Styles */
enum {
RGN_AND = 1,
RGN_OR = 2,
RGN_XOR = 3,
RGN_DIFF = 4,
RGN_COPY = 5
}
export BOOL EqualRgn(HRGN a, HRGN b);
export BOOL RectInRegion(HRGN r, RECT *);
export BOOL PtInRegion(HRGN r, int x, int y);
export int OffsetRgn(HRGN r, int x, int y);
export HRGN CreatePolygonRgn(POINT *p, int n, int rule);
export HRGN CreateRectRgnIndirect(RECT *r);
export HRGN CreateEllipticRgnIndirect(RECT *r);
export HRGN CreateRoundRectRgn(int a, int b, int c, int d, int e, int f);
export int CombineRgn(HRGN r, HRGN a, HRGN b, int n);
export int GetRgnBox(HRGN r, LPRECT p);
export BOOL PaintRgn(HDC dc, HRGN r);
struct RGNDATAHEADER {
DWORD dwSize;
DWORD iType;
DWORD nCount;
DWORD nRgnSize;
RECT rcBound;
}
struct RGNDATA {
RGNDATAHEADER rdh;
char Buffer[1];
}
struct XFORM {
FLOAT eM11;
FLOAT eM12;
FLOAT eM21;
FLOAT eM22;
FLOAT eDx;
FLOAT eDy;
}
export DWORD GetRegionData(HRGN h, DWORD s, RGNDATA* data);
export HRGN ExtCreateRegion(XFORM *t, DWORD s, RGNDATA *data);
export int FillRect(HDC hDC,RECT *lprc,HBRUSH hbr);
export int FrameRect(HDC hDC,RECT *lprc,HBRUSH hbr);
export BOOL InvertRect(HDC hDC,RECT *lprc);
export BOOL IntersectRect(LPRECT lprcDst,RECT *lprcSrc1,RECT *lprcSrc2);
export BOOL UnionRect(LPRECT lprcDst,RECT *lprcSrc1,RECT *lprcSrc2);
export BOOL SubtractRect(LPRECT lprcDst,RECT *lprcSrc1,RECT *lprcSrc2);
export BOOL OffsetRect(LPRECT lprc,int dx,int dy);
export BOOL IsRectEmpty(RECT *lprc);
export BOOL EqualRect(RECT *lprc1,RECT *lprc2);
export BOOL PtInRect(RECT *lprc,POINT pt);
/* PolyFill() Modes */
enum {
ALTERNATE = 1,
WINDING = 2
}
export int SetPolyFillMode(HDC hdc, int m);
export int GetPolyFillMode(HDC hdc);
/*
* Combo Box messages
*/
const uint CB_GETEDITSEL =0x0140;
const uint CB_LIMITTEXT =0x0141;
const uint CB_SETEDITSEL =0x0142;
const uint CB_ADDSTRING =0x0143;
const uint CB_DELETESTRING =0x0144;
const uint CB_DIR =0x0145;
const uint CB_GETCOUNT =0x0146;
const uint CB_GETCURSEL =0x0147;
const uint CB_GETLBTEXT =0x0148;
const uint CB_GETLBTEXTLEN =0x0149;
const uint CB_INSERTSTRING =0x014A;
const uint CB_RESETCONTENT =0x014B;
const uint CB_FINDSTRING =0x014C;
const uint CB_SELECTSTRING =0x014D;
const uint CB_SETCURSEL =0x014E;
const uint CB_SHOWDROPDOWN =0x014F;
const uint CB_GETITEMDATA =0x0150;
const uint CB_SETITEMDATA =0x0151;
const uint CB_GETDROPPEDCONTROLRECT =0x0152;
const uint CB_SETITEMHEIGHT =0x0153;
const uint CB_GETITEMHEIGHT =0x0154;
const uint CB_SETEXTENDEDUI =0x0155;
const uint CB_GETEXTENDEDUI =0x0156;
const uint CB_GETDROPPEDSTATE =0x0157;
const uint CB_FINDSTRINGEXACT =0x0158;
const uint CB_SETLOCALE =0x0159;
const uint CB_GETLOCALE =0x015A;
const uint CB_GETTOPINDEX =0x015b;
const uint CB_SETTOPINDEX =0x015c;
const uint CB_GETHORIZONTALEXTENT =0x015d;
const uint CB_SETHORIZONTALEXTENT =0x015e;
const uint CB_GETDROPPEDWIDTH =0x015f;
const uint CB_SETDROPPEDWIDTH =0x0160;
const uint CB_INITSTORAGE =0x0161;
const uint CBN_SELCHANGE =1;
const uint CBN_DBLCLK =2;
const uint CBN_SETFOCUS =3;
const uint CBN_KILLFOCUS =4;
const uint CBN_EDITCHANGE =5;
const uint CBN_EDITUPDATE =6;
const uint CBN_DROPDOWN =7;
const uint CBN_CLOSEUP =8;
const uint CBN_SELENDOK =9;
const uint CBN_SELENDCANCEL =10;
/*
* Combo Box styles
*/
const uint CBS_SIMPLE =0x0001L;
const uint CBS_DROPDOWN =0x0002L;
const uint CBS_DROPDOWNLIST =0x0003L;
const uint CBS_OWNERDRAWFIXED =0x0010L;
const uint CBS_OWNERDRAWVARIABLE =0x0020L;
const uint CBS_AUTOHSCROLL =0x0040L;
const uint CBS_OEMCONVERT =0x0080L;
const uint CBS_SORT =0x0100L;
const uint CBS_HASSTRINGS =0x0200L;
const uint CBS_NOINTEGRALHEIGHT =0x0400L;
const uint CBS_DISABLENOSCROLL =0x0800L;
const uint CBS_UPPERCASE =0x2000L;
const uint CBS_LOWERCASE =0x4000L;
/*
* Listbox messages
*/
const uint LB_ADDSTRING =0x0180;
const uint LB_INSERTSTRING =0x0181;
const uint LB_DELETESTRING =0x0182;
const uint LB_SELITEMRANGEEX =0x0183;
const uint LB_RESETCONTENT =0x0184;
const uint LB_SETSEL =0x0185;
const uint LB_SETCURSEL =0x0186;
const uint LB_GETSEL =0x0187;
const uint LB_GETCURSEL =0x0188;
const uint LB_GETTEXT =0x0189;
const uint LB_GETTEXTLEN =0x018A;
const uint LB_GETCOUNT =0x018B;
const uint LB_SELECTSTRING =0x018C;
const uint LB_DIR =0x018D;
const uint LB_GETTOPINDEX =0x018E;
const uint LB_FINDSTRING =0x018F;
const uint LB_GETSELCOUNT =0x0190;
const uint LB_GETSELITEMS =0x0191;
const uint LB_SETTABSTOPS =0x0192;
const uint LB_GETHORIZONTALEXTENT =0x0193;
const uint LB_SETHORIZONTALEXTENT =0x0194;
const uint LB_SETCOLUMNWIDTH =0x0195;
const uint LB_ADDFILE =0x0196;
const uint LB_SETTOPINDEX =0x0197;
const uint LB_GETITEMRECT =0x0198;
const uint LB_GETITEMDATA =0x0199;
const uint LB_SETITEMDATA =0x019A;
const uint LB_SELITEMRANGE =0x019B;
const uint LB_SETANCHORINDEX =0x019C;
const uint LB_GETANCHORINDEX =0x019D;
const uint LB_SETCARETINDEX =0x019E;
const uint LB_GETCARETINDEX =0x019F;
const uint LB_SETITEMHEIGHT =0x01A0;
const uint LB_GETITEMHEIGHT =0x01A1;
const uint LB_FINDSTRINGEXACT =0x01A2;
const uint LB_SETLOCALE =0x01A5;
const uint LB_GETLOCALE =0x01A6;
const uint LB_SETCOUNT =0x01A7;
const uint LB_INITSTORAGE =0x01A8;
const uint LB_ITEMFROMPOINT =0x01A9;
/*
* Listbox Styles
*/
const uint LBS_NOTIFY =0x0001L;
const uint LBS_SORT =0x0002L;
const uint LBS_NOREDRAW =0x0004L;
const uint LBS_MULTIPLESEL =0x0008L;
const uint LBS_OWNERDRAWFIXED =0x0010L;
const uint LBS_OWNERDRAWVARIABLE =0x0020L;
const uint LBS_HASSTRINGS =0x0040L;
const uint LBS_USETABSTOPS =0x0080L;
const uint LBS_NOINTEGRALHEIGHT =0x0100L;
const uint LBS_MULTICOLUMN =0x0200L;
const uint LBS_WANTKEYBOARDINPUT =0x0400L;
const uint LBS_EXTENDEDSEL =0x0800L;
const uint LBS_DISABLENOSCROLL =0x1000L;
const uint LBS_NODATA =0x2000L;
const uint LBS_NOSEL =0x4000L;
const uint LBS_STANDARD =(LBS_NOTIFY | LBS_SORT | WS_VSCROLL | WS_BORDER);
const uint OFN_READONLY =0x00000001;
const uint OFN_OVERWRITEPROMPT =0x00000002;
const uint OFN_HIDEREADONLY =0x00000004;
const uint OFN_NOCHANGEDIR =0x00000008;
const uint OFN_SHOWHELP =0x00000010;
const uint OFN_ENABLEHOOK =0x00000020;
const uint OFN_ENABLETEMPLATE =0x00000040;
const uint OFN_ENABLETEMPLATEHANDLE =0x00000080;
const uint OFN_NOVALIDATE =0x00000100;
const uint OFN_ALLOWMULTISELECT =0x00000200;
const uint OFN_EXTENSIONDIFFERENT =0x00000400;
const uint OFN_PATHMUSTEXIST =0x00000800;
const uint OFN_FILEMUSTEXIST =0x00001000;
const uint OFN_CREATEPROMPT =0x00002000;
const uint OFN_SHAREAWARE =0x00004000;
const uint OFN_NOREADONLYRETURN =0x00008000;
const uint OFN_NOTESTFILECREATE =0x00010000;
const uint OFN_NONETWORKBUTTON =0x00020000;
const uint OFN_NOLONGNAMES =0x00040000;
const uint OFN_EXPLORER =0x00080000;
const uint OFN_NODEREFERENCELINKS =0x00100000;
const uint OFN_LONGNAMES =0x00200000;
const uint SBS_HORZ =0x0000;
const uint SBS_VERT =0x0001;
const uint SBS_TOPALIGN =0x0002;
const uint SBS_LEFTALIGN =0x0002;
const uint SBS_BOTTOMALIGN =0x0004;
const uint SBS_RIGHTALIGN =0x0004;
const uint SBS_SIZEBOXTOPLEFTALIGN =0x0002;
const uint SBS_SIZEBOXBOTTOMRIGHTALIGN =0x0004;
const uint SBS_SIZEBOX =0x0008;
export HWND CreateWindowExW(
DWORD dwExStyle,
LPWSTR lpClassName,
LPWSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWndParent ,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam);
HWND CreateWindowW(
LPWSTR lpClassName,
LPWSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWndParent ,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam)
{
return CreateWindowExW(0, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}
// PIXELFORMATDESCRIPTOR stuff
const uint PFD_TYPE_RGBA = 0;
const uint PFD_TYPE_COLORINDEX = 1;
const uint PFD_MAIN_PLANE = 0;
const uint PFD_OVERLAY_PLANE = 1;
const uint PFD_DOUBLEBUFFER = 1;
const uint PFD_STEREO = 2;
const uint PFD_DRAW_TO_WINDOW = 4;
const uint PFD_DRAW_TO_BITMAP = 8;
const uint PFD_SUPPORT_GDI = 16;
const uint PFD_SUPPORT_OPENGL = 32;
const uint PFD_GENERIC_FORMAT = 64;
const uint PFD_NEED_PALETTE = 128;
const uint PFD_NEED_SYSTEM_PALETTE = 0x00000100;
const uint PFD_SWAP_EXCHANGE = 0x00000200;
const uint PFD_SWAP_COPY = 0x00000400;
const uint PFD_SWAP_LAYER_BUFFERS = 0x00000800;
const uint PFD_GENERIC_ACCELERATED = 0x00001000;
const uint PFD_DEPTH_DONTCARE = 0x20000000;
const uint PFD_DOUBLEBUFFER_DONTCARE = 0x40000000;
const uint PFD_STEREO_DONTCARE = 0x80000000;
export int ChoosePixelFormat(HDC hdc, PIXELFORMATDESCRIPTOR* ppfd);
export int DescribePixelFormat(HDC hdc, int iPixelFormat, UINT nBytes, PIXELFORMATDESCRIPTOR* ppfd);
alias HANDLE HGLRC;
const int WGL_SWAP_MAIN_PLANE = 1;
//int wglUseFontOutlinesW(HDC, uint, uint, uint, float, float, int, _GLYPHMETRICSFLOAT *);
//int wglUseFontOutlinesA(HDC, uint, uint, uint, float, float, int, _GLYPHMETRICSFLOAT *);
//int wglUseFontBitmapsW(HDC, uint, uint, uint);
//int wglUseFontBitmapsA(HDC, uint, uint, uint);
//int wglSetLayerPaletteEntries(HDC, int, int, int, uint*);
//int wglRealizeLayerPalette(HDC, int, int);
//int wglGetLayerPaletteEntries(HDC, int, int, int, uint*);
//int wglDescribeLayerPlane(HDC*, int, int, uint, LAYERPLANEDESCRIPTOR *);
//HGLRC wglCreateLayerContext(HDC, int);
export int wglSwapLayerBuffers(HDC, uint);
export int wglShareLists(HGLRC, HGLRC);
export int wglMakeCurrent(HDC, HGLRC);
export void* wglGetProcAddress(char*);
export HDC wglGetCurrentDC();
export HGLRC wglGetCurrentContext();
export int wglDeleteContext(HGLRC);
export HGLRC wglCreateContext(HDC);
export int wglCopyContext(HGLRC, HGLRC, uint);
export BOOL SwapBuffers(HDC);
const int SM_CXBORDER = 5;
const int SM_CYBORDER = 5;
const int SM_CXFIXEDFRAME = 7;
const int SM_CYFIXEDFRAME = 8;
const int SM_CXEDGE = 45;
const int SM_CYEDGE= 46;
const int SM_CXMENUCHECK = 71;
const int SM_CYMENUCHECK = 72;
//
// these wrappers makes windows unicode look alot better and avoids excessive code duplication
package
{
HWND CreateWindowX(
char[] lpClassName,
char[] lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWndParent ,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam)
{
if (useWfuncs)
return CreateWindowExW(0, toUTF16z(lpClassName), toUTF16z(lpWindowName), dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
else
return CreateWindowExA(0, toMBSz(lpClassName), toMBSz(lpWindowName), dwStyle, X, Y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
}
BOOL SendMessageX(HWND hWnd, UINT msg, WPARAM wParam, char[] lParam)
{
if (useWfuncs)
return SendMessageW(hWnd, msg, wParam, cast(LPARAM)toUTF16z(lParam));
else
return SendMessageW(hWnd, msg, wParam, cast(LPARAM)toMBSz(lParam));
}
int MessageBoxX(HWND hWnd, char[] lpText, char[] lpCaption, UINT uType)
{
if (useWfuncs)
return MessageBoxW(hWnd, toUTF16z(lpText), toUTF16z(lpCaption), uType);
else
return MessageBoxA(hWnd, toMBSz(lpText), toMBSz(lpCaption), uType);
}
BOOL GetTextExtentPoint32X(HDC dc, char[] str, int len, SIZE* s)
{
if (useWfuncs) {
wchar[] wstr = toUTF16(str);
return GetTextExtentPoint32W(dc, wstr.ptr, wstr.length, s);
} else {
size_t al;
char* ansi = toMBSzl(str, al);
return GetTextExtentPoint32A(dc, ansi, al, s);
}
}
BOOL AppendMenuX(HMENU menu, uint flags, void*item, char[] str)
{
if (useWfuncs)
return AppendMenuW(menu, flags, item, toUTF16z(str));
else
return AppendMenuA(menu, flags, item, toMBSz(str));
}
}
/******************************************
* Converts the UTF-8 string s into a null-terminated string in a Windows
* 8-bit character set.
*
* Params:
* s = UTF-8 string to convert.
* reslen = the number of bytes in the resulting buffer
* (not including the null terminator) will be place here.
* codePage = is the number of the target codepage, or
* 0 - ANSI,
* 1 - OEM,
* 2 - Mac
*
* Authors:
* yaneurao, Walter Bright, Stewart Gordon
*/
private import std.windows.syserror;
char* toMBSzl(char[] s, out size_t reslen, uint codePage = 0)
{
// Only need to do this if any chars have the high bit set
foreach (char c; s)
{
if (c >= 0x80)
{
char[] result;
int readLen;
wchar* ws = std.utf.toUTF16z(s);
result.length = WideCharToMultiByte(codePage, 0, ws, -1, null, 0,
null, null);
if (result.length)
{
readLen = WideCharToMultiByte(codePage, 0, ws, -1, result.ptr,
result.length, null, null);
}
if (!readLen || readLen != result.length)
{
throw new Exception("Couldn't convert string: " ~
sysErrorString(GetLastError()));
}
reslen = result.length ? result.length-1 : 0;
return result.ptr;
}
}
reslen = s.length;
return std.string.toStringz(s);
}