#include <pbsdboot.h>
#include <commctrl.h>
#include <res/resource.h>
int
CreateMainWindow(HINSTANCE hInstance, HWND hWnd, LPCTSTR name, int cmdbar_height)
{
HRSRC res;
unsigned char *mem;
int i;
DLGTEMPLATE dlg;
DLGITEMTEMPLATE item;
RECT rect;
int ratio_x, ratio_y;
res = FindResource(hInstance, name, RT_DIALOG);
if (res == NULL) {
debug_printf(TEXT("error=%d\n"), GetLastError());
}
mem = (unsigned char*)LockResource(LoadResource(NULL, res));
dlg = *(DLGTEMPLATE*)mem;
mem += sizeof(DLGTEMPLATE);
GetClientRect(hWnd, &rect);
rect.top += cmdbar_height;
ratio_x = (rect.right - rect.left) * 100 / dlg.cx;
ratio_y = (rect.bottom - rect.top) * 100 / dlg.cy;
if (*(WORD*)mem == 0xffff) {
mem += sizeof(WORD);
debug_printf(TEXT("Dlg: menu=%04x\n"), *(WORD*)mem);
mem += sizeof(WORD);
} else
if (*(WORD*)mem == 0x0000) {
mem += sizeof(WORD);
debug_printf(TEXT("Dlg: menu=none\n"));
} else {
debug_printf(TEXT("Dlg: menu=%s\n"), (TCHAR*)mem);
while (*(WORD*)mem) {
mem += sizeof(WORD);
}
mem += sizeof(WORD);
}
if (*(WORD*)mem == 0xffff) {
mem += sizeof(WORD);
debug_printf(TEXT("Dlg: class=%04x\n"), *(WORD*)mem);
mem += sizeof(WORD);
} else
if (*(WORD*)mem == 0x0000) {
mem += sizeof(WORD);
debug_printf(TEXT("Dlg: class=none\n"));
} else {
debug_printf(TEXT("Dlg: class=%s\n"), (TCHAR*)mem);
while (*(WORD*)mem) {
mem += sizeof(WORD);
}
mem += sizeof(WORD);
}
debug_printf(TEXT("Dlg: title=%s\n"), (TCHAR*)mem);
while (*(WORD*)mem) {
mem += sizeof(WORD);
}
mem += sizeof(WORD);
if (dlg.style & DS_SETFONT) {
debug_printf(TEXT("Dlg: font size=%d\n"), *(WORD*)mem);
mem += sizeof(WORD);
debug_printf(TEXT("Dlg: font name=%s ("), (TCHAR*)mem);
while (*(WORD*)mem) {
debug_printf(TEXT("%04x"), *(WORD*)mem);
mem += sizeof(WORD);
}
debug_printf(TEXT(")\n"));
mem += sizeof(WORD);
}
for (i = 0; i < dlg.cdit; i++) {
TCHAR *class_name = NULL;
TCHAR *window_text = NULL;
if ((long)mem % sizeof(DWORD)) {
mem = (unsigned char*)(((long)mem / sizeof(DWORD) + 1) * sizeof(DWORD));
}
item = *(DLGITEMTEMPLATE*)mem;
mem += sizeof(DLGITEMTEMPLATE);
if (*(WORD*)mem == 0xffff) {
mem += sizeof(WORD);
switch (*(WORD*)mem) {
case 0x0080: class_name = TEXT("BUTTON"); break;
case 0x0081: class_name = TEXT("EDIT"); break;
case 0x0082: class_name = TEXT("STATIC"); break;
case 0x0083: class_name = TEXT("LISTBOX"); break;
case 0x0084: class_name = TEXT("SCROLLBAR"); break;
case 0x0085: class_name = TEXT("COMBOBOX"); break;
default:
debug_printf(TEXT("class=%04x "), *(WORD*)mem);
break;
}
mem += sizeof(WORD);
} else {
class_name = (TCHAR*)mem;
while (*(WORD*)mem) {
mem += sizeof(WORD);
}
mem += sizeof(WORD);
}
if (*(WORD*)mem == 0xffff) {
mem += sizeof(WORD);
debug_printf(TEXT("contents=%04x "), *(WORD*)mem);
mem += sizeof(WORD);
} else {
window_text = (TCHAR*)mem;
while (*(WORD*)mem) {
mem += sizeof(WORD);
}
mem += sizeof(WORD);
}
if (item.id == 0xffff) {
item.id = i + 1;
}
if (class_name) {
debug_printf(TEXT("Control: %04x "), item.id);
debug_printf(TEXT("class=%s "), class_name);
debug_printf(TEXT("contents=%s "),
window_text ? window_text : TEXT(""));
CreateWindowEx(
item.dwExtendedStyle,
class_name,
window_text,
item.style,
item.x * ratio_x / 100,
item.y * ratio_y / 100 + cmdbar_height,
item.cx * ratio_x / 100,
item.cy * ratio_y / 100,
hWnd,
(HMENU)item.id,
hInstance,
NULL);
}
#if 0
if ((long)mem % sizeof(DWORD)) {
}
#endif
debug_printf(TEXT("data=0x%x bytes\n"), *(WORD*)mem);
mem += *(WORD*)mem;
mem += sizeof(WORD);
}
return (0);
}