static void AddStandardComponent(WORD type, PCTSTR caption, DWORD style,
DWORD exStyle, int x, int y, int w, int h, WORD id)
{
DLGITEMTEMPLATE item;
WORD preType = 0xFFFF;
// DWORD algin the beginning of the component data
AlignData(sizeof(DWORD));
// Increment the component count
dialogTemplate->cdit++;
}
static void AddStatic(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0082, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
static void AddEditBox(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0081, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
static void AddButton(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0080, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
void DDLG_New_DynamicDialog(PCTSTR caption, DWORD style, int x, int y, int w, int h)
{
usedBufferLength = sizeof(DLGTEMPLATE );
totalBufferLength = usedBufferLength;
After modified builtin_raw_input(), add
this DynaDialog.c to project. Then make it.
/*------------ DynaDialog.c ------------*/
//adapt from http://www.flipcode.org/cgi-bin/fcarticles.cgi?show=64064
#include <windows.h>
char* RawInputChar(char* prompt);
LPCTSTR RawInputBox(LPCTSTR prompt);
LRESULT CALLBACK RawInputBoxCB(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static DLGTEMPLATE* dialogTemplate;
static int totalBufferLength;
static int usedBufferLength;
DLGTEMPLATE* DDLG_Template()
{
return dialogTemplate;
}
void DDLG_Free_DynamicDialog()
{
free(dialogTemplate);
}
static void EnsureSpace(int length)
{
if (length + usedBufferLength > totalBufferLength)
{
void* newBuffer;
totalBufferLength += length * 2;
newBuffer = malloc(totalBufferLength);
memcpy(newBuffer, dialogTemplate, usedBufferLength);
free(dialogTemplate);
dialogTemplate = (DLGTEMPLATE*)newBuffer;
}
}
static void AppendData(void* data, int dataLength)
{
EnsureSpace(dataLength);
memcpy((char*)dialogTemplate + usedBufferLength, data, dataLength);
usedBufferLength += dataLength;
}
static void AppendString(PCTSTR string)
{
int length = lstrlen(string) + 1;
AppendData((void *)string, length * sizeof(WCHAR));
}
static void AlignData(int size)
{
int paddingSize = usedBufferLength % size;
if (paddingSize != 0)
{
EnsureSpace(paddingSize);
usedBufferLength += paddingSize;
}
}
static void AddStandardComponent(WORD type, PCTSTR caption, DWORD style,
DWORD exStyle, int x, int y, int w, int h, WORD id)
{
DLGITEMTEMPLATE item;
WORD preType = 0xFFFF;
// DWORD algin the beginning of the component data
AlignData(sizeof(DWORD));
item.style = style;
item.x = x;
item.y = y;
item.cx = w;
item.cy = h;
item.id = id;
item.dwExtendedStyle = exStyle;
AppendData(&item, sizeof(DLGITEMTEMPLATE));
AppendData(&preType, sizeof(WORD));
AppendData(&type, sizeof(WORD));
AppendString(caption);
// Increment the component count
dialogTemplate->cdit++;
}
static void AddStatic(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0082, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
static void AddEditBox(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0081, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
static void AddButton(PCTSTR caption, DWORD style, DWORD exStyle, int x, int y,
int w, int h, WORD id)
{
WORD creationDataLength = 0;
AddStandardComponent(0x0080, caption, style, exStyle, x, y, w, h, id);
AppendData(&creationDataLength, sizeof(WORD));
}
void DDLG_New_DynamicDialog(PCTSTR caption, DWORD style, int x, int y, int w, int h)
{
usedBufferLength = sizeof(DLGTEMPLATE );
totalBufferLength = usedBufferLength;
dialogTemplate = (DLGTEMPLATE*)malloc(totalBufferLength);
dialogTemplate->style = style;
dialogTemplate->x = x;
dialogTemplate->y = y;
dialogTemplate->cx = w;
dialogTemplate->cy = h;
dialogTemplate->cdit = 0;
dialogTemplate->dwExtendedStyle = 0x80000000L;
// The dialog box doesn't have a menu or a special class
AppendData(_T("\0"), 2);
AppendData(_T("\0"), 2);
// Add the dialog's caption to the template
AppendString(caption);
}
enum { INPUTBOX_MAXSTR=120, INPUTBOX_ID_TEXT=111 };
typedef struct
{
TCHAR strData[INPUTBOX_MAXSTR+1];
int strLen;
}
INPUTBOX_DATA;
LRESULT CALLBACK RawInputBoxCB(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static INPUTBOX_DATA* pData;
switch (message)
{
case WM_INITDIALOG:
pData = (INPUTBOX_DATA*) lParam;
return TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK) {
pData->strLen = GetDlgItemText(hDlg, INPUTBOX_ID_TEXT, pData->strData, INPUTBOX_MAXSTR);
EndDialog(hDlg, (int)pData);
return TRUE;
}
break;
}
return FALSE;
}
LPCTSTR RawInputBox(LPCTSTR prompt)
{
static INPUTBOX_DATA data;
DDLG_New_DynamicDialog(_T("Input"), WS_CAPTION | WS_POPUP, 0, 0, 139, 58);
AddStatic(prompt, WS_VISIBLE, 0, 7, 7, 125, 15, -1);
AddEditBox(_T(""), WS_VISIBLE | WS_TABSTOP | ES_AUTOHSCROLL, WS_EX_STATICEDGE,
7, 22, 125, 17, INPUTBOX_ID_TEXT);
AddButton(_T("OK"), WS_VISIBLE | BS_DEFPUSHBUTTON, 0,
7, 40, 36, 18, IDOK);
DialogBoxIndirectParam(GetModuleHandle(0), DDLG_Template(), GetForegroundWindow(),
(DLGPROC)RawInputBoxCB, (LPARAM)&data);
DDLG_Free_DynamicDialog();
return data.strData;
}
char* RawInputChar(char* prompt)
{
static char chData[INPUTBOX_MAXSTR+1];
WCHAR wchData[INPUTBOX_MAXSTR+1];
LPCTSTR input;
BOOL usedDefChar;
MultiByteToWideChar(CP_ACP, 0, prompt, -1, wchData, INPUTBOX_MAXSTR);
input = RawInputBox(wchData);
WideCharToMultiByte(CP_ACP, 0, input, -1, chData, INPUTBOX_MAXSTR, "?", &usedDefChar);
return chData;
}