#include "alf/alf.h" #include enum { PANE_BUTTONS = 0, PANE_LABEL, PANE_COMBO, PANE_NOTEBOOK, PANE_CHECKBOX, PANE_GROUPBOX, PANE_ICONVIEW, PANE_SPINBOX, PANE_PROGRESS, PANE__MAX }; static const TCHAR *g_paneLabels[PANE__MAX] = { TEXT("Buttons"), //PANE_BUTTONS TEXT("Label"), //PANE_LABEL, TEXT("Combo Box"), //PANE_COMBO, TEXT("Notebook"), //PANE_NOTEBOOK, TEXT("Checkbox"), //PANE_CHECKBOX, TEXT("GroupBox"), //PANE_GROUPBOX, TEXT("Icon View"), //PANE_ICONVIEW, TEXT("Spin Box"), //PANE_SPINBOX TEXT("Progress") //PANE_PROGRESS }; enum { ID_COMBO1 = 100, ID_COMBO2, ID_LBLCOMBOTEXT, ID_BTNCOMBOCLEAR, ID_NOTEBOOK, ID_HELLO, ID_SPINBOX, ID_SPINBOXOUT, ID_PROGRESS_SPINBOX, ID_PROGRESS_BAR, ID_PROGRESS_GAUGE, ID_PROGRESS_NATIVE_BAR, ID_PROGRESS_NORMAL, ID_PROGRESS_PAUSED, ID_PROGRESS_ERROR, ID_PROGRESS_INDETERMINATE, IDM_FILE, IDM_FILE_CLOSE, IDM_HELP, IDM_HELP_ABOUT, IDM_BACKGROUND, IDM_BACKGROUND_INHERIT, IDM_BACKGROUND_GRADIENT, IDM_BACKGROUND_GREEN, IDM_BACKGROUND_BLUE, IDM_CENTER_ON_MONITOR, IDM_MESSAGEDLG_INFO, IDM_MESSAGEDLG_WARNING, IDM_MESSAGEDLG_ERROR, IDM_MESSAGEDLG_QUESTION, IDM_MESSAGEDLG_DANGERQUESTION, IDM_PANES, IDM_PANES__MAX = IDM_PANES + PANE__MAX, IDM_MODALDIALOG_PANES, IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX, IDM_MODELESSDIALOG_PANES, IDM_MODELESSDIALOG_PANES__MAX = IDM_MODELESSDIALOG_PANES + PANE__MAX }; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; static ALFApplication *g_application = NULL; enum PanelBackgroundMode { BG_INHERIT, BG_GRADIENT, BG_SOLID_GREEN, BG_SOLID_BLUE }; #define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1) static void wfModalDialogRun(HWND owner, int pane); static void wfModelessDialogStart(int pane); /* common stuff */ typedef struct { DWORD bgmode; } CommonPanelPriv; static void commonPanelPaint(void *closure, HWND hwndPanel, HDC dc, RECT *rcPaint) { CommonPanelPriv *priv = (CommonPanelPriv *)closure; if (priv->bgmode == BG_GRADIENT) { RECT rcClient; GetClientRect(hwndPanel, &rcClient); if (fnGradientFill) { TRIVERTEX vertex[6]; vertex[0].x = rcClient.left; vertex[0].y = rcClient.top; vertex[0].Red = 0xff00; vertex[0].Green = 0x8000; vertex[0].Blue = 0x0000; vertex[0].Alpha = 0x0000; vertex[1].x = rcClient.left; vertex[1].y = rcClient.bottom; vertex[1].Red = 0x9000; vertex[1].Green = 0x0000; vertex[1].Blue = 0x9000; vertex[1].Alpha = 0x0000; vertex[2].x = rcClient.right; vertex[2].y = rcClient.top; vertex[2].Red = 0x9000; vertex[2].Green = 0x0000; vertex[2].Blue = 0x9000; vertex[2].Alpha = 0x0000; vertex[3].x = rcClient.right; vertex[3].y = rcClient.bottom; vertex[3].Red = 0x0000; vertex[3].Green = 0xd000; vertex[3].Blue = 0xd000; vertex[3].Alpha = 0x0000; vertex[4].x = rcClient.left; vertex[4].y = rcClient.bottom; vertex[4].Red = 0x9000; vertex[4].Green = 0x0000; vertex[4].Blue = 0x9000; vertex[4].Alpha = 0x0000; vertex[5].x = rcClient.right; vertex[5].y = rcClient.top; vertex[5].Red = 0x9000; vertex[5].Green = 0x0000; vertex[5].Blue = 0x9000; vertex[5].Alpha = 0x0000; GRADIENT_TRIANGLE gTriangle[2]; gTriangle[0].Vertex1 = 0; gTriangle[0].Vertex2 = 1; gTriangle[0].Vertex3 = 2; gTriangle[1].Vertex1 = 3; gTriangle[1].Vertex2 = 4; gTriangle[1].Vertex3 = 5; fnGradientFill(dc, vertex, 6, gTriangle, 2, GRADIENT_FILL_TRIANGLE); } else { HBRUSH white = (HBRUSH)GetStockObject(WHITE_BRUSH); HBRUSH gray = (HBRUSH)GetStockObject(GRAY_BRUSH); int s = 10; for (int y = rcClient.top; y < rcClient.bottom; y += 2*s) { for (int x = rcClient.left; x < rcClient.right; x += 2*s) { RECT a = { x, y, x + s, y + s }; RECT b = { x + s, y, x + s + s, y + s }; RECT c = { x, y + s, x + s, y + s + s }; RECT d = { x + s, y + s, x + s + s, y + s + s }; FillRect(dc, &a, white); FillRect(dc, &b, gray); FillRect(dc, &c, gray); FillRect(dc, &d, white); } } } } else { ALF_Panel_DefPaint(hwndPanel, dc, rcPaint); } } static LRESULT commonPanelMessage(void *closure, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { CommonPanelPriv *priv = (CommonPanelPriv *)closure; if (msg == FM_PANEL_SET_BGMODE) { priv->bgmode = (DWORD)lparam; switch (priv->bgmode) { case BG_INHERIT: ALF_Layout_AddControlFlag(GetParent(hwnd), hwnd, ALF_LAYOUT_INHERITBGCOLOR); ALF_InvalidateBackground(hwnd); break; case BG_GRADIENT: ALF_SetBackgroundColor(hwnd, ALF_COLOR_TRANSPARENT); ALF_InvalidateBackground(hwnd); break; case BG_SOLID_BLUE: ALF_SetBackgroundColor(hwnd, ALF_COLOR_RGB(0, 0, 255)); break; case BG_SOLID_GREEN: ALF_SetBackgroundColor(hwnd, ALF_COLOR_RGB(0, 255, 0)); break; } return TRUE; } if (msg == WM_SIZE && priv->bgmode == BG_GRADIENT) { // HACK doing the invalidation before the layout leads to unnecessary // redraws. I have no idea why, but switching the order of the calls // makes the problem mostly go away. LRESULT rv = ALF_Panel_DefWindowProc(hwnd, msg, wparam, lparam); ALF_InvalidateBackground(hwnd); return rv; } return ALF_Panel_DefWindowProc(hwnd, msg, wparam, lparam); } static void commonPanelDestroy(void *closure, HWND window) { (void)window; ALF_Free(closure); } /* button panel */ static void buttonPanelAttach(void *closure, HWND outerPanel) { (void)closure; HWND b; HWND panel; ALF_Panel_SetEdge(outerPanel, BDR_SUNKENOUTER); panel = ALF_AddPanel(outerPanel, (WORD)-1, 0, 0); ALF_AddLabel(panel, (WORD)-1, 0, 2, TEXT("normal")); ALF_AddLabel(panel, (WORD)-1, 0, 4, TEXT("disabled")); ALF_AddLabel(panel, (WORD)-1, 2, 0, TEXT("ALF")); ALF_AddLabel(panel, (WORD)-1, 4, 0, TEXT("native")); ALF_AddLabel(panel, (WORD)-1, 0, 6, TEXT("layout dummy")); b = ALF_AddCustomButton(panel, (WORD)-1, 2, 2, TEXT("Hello, World!"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); ALF_Layout_SetControlMinSize(panel, b, 0, 0); b = ALF_AddCustomButton(panel, (WORD)-1, 2, 4, TEXT("Hello, World!"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); EnableWindow(b, FALSE); ALF_Layout_SetControlMinSize(panel, b, 0, 0); HWND hwndNb1 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("H&ello, World!"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); HWND hwndNb2 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Hello, World!"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); EnableWindow(hwndNb2, FALSE); ALF_AddControl(panel, 4, 2, hwndNb1, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddControl(panel, 4, 4, hwndNb2, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); b = ALF_AddCustomButton(panel, (WORD)-1, 4, 6, TEXT("Hello, World!"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); ALF_Layout_SetControlMinSize(panel, b, 0, 0); b = ALF_AddCustomButton(panel, (WORD)-1, 2, 8, TEXT("Multiline\r\nButton"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); ALF_Layout_SetControlMinSize(panel, b, 0, 0); HWND hwndNb3 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Multiline\r\nButton"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 4, 8, hwndNb3, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_Layout_SetRowMinSize(panel, 1, 825); ALF_Layout_SetRowMinSize(panel, 3, 825); ALF_Layout_SetRowMinSize(panel, 5, 825); ALF_Layout_SetRowMinSize(panel, 7, 825); ALF_Layout_SetRowMinSize(panel, 9, 825); ALF_Layout_SetColumnMinSize(panel, 1, 825); ALF_Layout_SetColumnMinSize(panel, 3, 825); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Panel_SetEdge(panel, BDR_RAISEDINNER); panel = ALF_AddPanel(outerPanel, (WORD)-1, 0, 1); ALF_AddCustomButton(panel, (WORD)-1, 2, 2, TEXT("Standard"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); HWND hwndNb4 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Standard"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 4, 2, hwndNb4, 5625, 1725, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddCustomButton(panel, (WORD)-1, 2, 4, TEXT("Expanding"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); HWND hwndNb5 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Expanding"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 4, 4, hwndNb5, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddCustomButton(panel, (WORD)-1, 2, 6, TEXT("Expanding\r\nMultiline"), ALF_CustomButtonMeasureText, ALF_CustomButtonPaintText, NULL); HWND hwndNb6 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Expanding\r\nMultiline"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON | BS_MULTILINE, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 4, 6, hwndNb6, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_Layout_SetRowMinSize(panel, 1, 825); ALF_Layout_SetRowMinSize(panel, 3, 825); ALF_Layout_SetRowMinSize(panel, 5, 825); ALF_Layout_SetRowMinSize(panel, 7, 825); ALF_Layout_SetColumnMinSize(panel, 1, 825); ALF_Layout_SetColumnMinSize(panel, 3, 825); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 4, 1); ALF_Layout_SetRowExpandNumerator(panel, 6, 1); ALF_Panel_SetEdge(panel, BDR_RAISEDINNER); panel = ALF_AddPanel(outerPanel, (WORD)-1, 0, 2); ALF_Panel_SetEdge(panel, BDR_RAISEDINNER); HICON winlogo = ALF_LoadIcon(NULL, IDI_WINLOGO, 64, 64); // FIXME! memory leak here b = ALF_AddCustomButton(panel, (WORD)-1, 0, 0, TEXT("WINLOGO"), ALF_CustomButtonMeasureIcon, ALF_CustomButtonPaintIcon, (void*)winlogo); ALF_Layout_SetControlMinSize(panel, b, 0, 0); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(outerPanel, 1, 1); // TODO: recreate old button box /*HWND panel = ALF_AddPanel(win, (WORD)-1, 1, 2); ALF_AddButton(panel, ID_BC1, 0, 0, TEXT("1")); ALF_AddButton(panel, ID_BC2, 1, 0, TEXT("2")); ALF_AddButton(panel, ID_BC3, 2, 0, TEXT("3")); ALF_LayoutSetRowExpandNumerator(panel, 1, 1); HWND hwndBc4 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("4"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(int)ID_BC4, (HINSTANCE)GetWindowLongPtr(panel, GWLP_HINSTANCE), NULL); HWND hwndBc5 = CreateWindowEx(0, TEXT("BUTTON"), TEXT("5"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 100, panel, (HMENU)(int)ID_BC5, (HINSTANCE)GetWindowLongPtr(panel, GWLP_HINSTANCE), NULL); EnableWindow(hwndBc5, FALSE); ALF_AddControl(panel, 3, 0, hwndBc4, 1000, 0, ALF_LAYOUT_INHERITFONT); ALF_AddControl(panel, 4, 0, hwndBc5, 1000, 0, ALF_LAYOUT_INHERITFONT);*/ } static ALFPanelVTable buttonPanelVtbl = { buttonPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void buttonPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &buttonPanelVtbl, priv); } /* label panel */ //FIXME! replace with real control static HWND makeSeparator(HWND parent, int x, int y) { HWND p = ALF_AddPanel(parent, (WORD)-1, x, y); ALF_Panel_SetEdge(p, BDR_SUNKENOUTER); return p; } static void labelPanelAttach(void *closure, HWND panel) { (void)closure; HWND l, g; g = ALF_AddGroupBox(panel, (WORD)-1, 0, 0, TEXT("Horizontal and Vertical")); l = ALF_AddLabel(g, (WORD)-1, 0, 0, TEXT("Left\r\nTop")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 0, 2, TEXT("Left\r\nCenter")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 0, 4, TEXT("Left\r\nBottom")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_BOTTOM); l = ALF_AddLabel(g, (WORD)-1, 2, 0, TEXT("Center\r\nTop")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 2, 2, TEXT("Center\r\nCenter")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 2, 4, TEXT("Center\r\nBottom")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_BOTTOM); l = ALF_AddLabel(g, (WORD)-1, 4, 0, TEXT("Right\r\nTop")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_RIGHT | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 4, 2, TEXT("Right\r\nCenter")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_RIGHT | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 4, 4, TEXT("Right\r\nBottom")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_RIGHT | ALF_LABEL_ALIGN_BOTTOM); makeSeparator(g, 0, 1); makeSeparator(g, 0, 3); makeSeparator(g, 2, 1); makeSeparator(g, 2, 3); makeSeparator(g, 4, 1); makeSeparator(g, 4, 3); ALF_Layout_SetRowExpandNumerator(g, 0, 1); ALF_Layout_SetRowExpandNumerator(g, 2, 1); ALF_Layout_SetRowExpandNumerator(g, 4, 1); makeSeparator(g, 1, 0); makeSeparator(g, 1, 2); makeSeparator(g, 1, 4); makeSeparator(g, 3, 0); makeSeparator(g, 3, 2); makeSeparator(g, 3, 4); ALF_Layout_SetColumnExpandNumerator(g, 0, 1); ALF_Layout_SetColumnExpandNumerator(g, 2, 1); ALF_Layout_SetColumnExpandNumerator(g, 4, 1); g = ALF_AddGroupBox(panel, (WORD)-1, 1, 0, TEXT("Like Edit")); ALF_AddLabel(g, (WORD)-1, 1, 2, TEXT("Bas&eline")); ALF_AddEdit(g, (WORD)-1, 3, 2, TEXT("Baseline Comparison")); l = ALF_AddLabel(g, (WORD)-1, 3, 4, TEXT("Left Comparison")); ALF_Label_SetStyle(l, ALF_LABEL_ALIGN_LEFT_LIKE_EDIT | ALF_LABEL_ALIGN_TOP); g = ALF_AddGroupBox(panel, (WORD)-1, 0, 2, TEXT("Other Stuff")); l = ALF_AddLabel(g, (WORD)-1, 0, 0, TEXT("Colored")); ALF_SetBackgroundColor(l, ALF_COLOR_RGB(0, 0, 255)); ALF_SetTextColor(l, ALF_COLOR_RGB(255, 255, 255)); l = ALF_AddLabel(g, (WORD)-1, 0, 1, TEXT("Disabled")); EnableWindow(l, FALSE); ALF_Layout_SetRowExpandNumerator(panel, 0, 1); } static ALFPanelVTable labelPanelVtbl = { labelPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void labelPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &labelPanelVtbl, priv); } /* combo box panel */ static void comboPanelAttach(void *closure, HWND panel) { (void)closure; ALF_AddLabel(panel, (WORD)-1, 0, 2, TEXT("&Editable Combo Box:")); HWND hwndCombo1 = ALF_AddEditableComboBox(panel, ID_COMBO1, 2, 2, TEXT("Hello!")); ALF_ComboBox_InsertString(hwndCombo1, 0, TEXT("Hello World!")); ALF_ComboBox_InsertString(hwndCombo1, -1, TEXT("Goodbye World!")); ALF_ComboBox_InsertString(hwndCombo1, 1, TEXT("The quick brown fox jumps over the lazy dog")); ALF_AddLabel(panel, (WORD)-1, 0, 4, TEXT("Selection-Only Combo Box:")); HWND hwndCombo2 = ALF_AddSelectionOnlyComboBox(panel, ID_COMBO2, 2, 4); ALF_AddButton(panel, ID_BTNCOMBOCLEAR, 4, 4, TEXT("Clear")); ALF_ComboBox_AddString(hwndCombo2, TEXT("Hello World!")); ALF_ComboBox_AddString(hwndCombo2, TEXT("Goodbye World!")); ALF_ComboBox_AddString(hwndCombo2, TEXT("The quick brown fox jumps over the lazy dog")); ALF_AddLabel(panel, ID_LBLCOMBOTEXT, 2, 6, TEXT("[ComboBox2 value]")); ALF_ComboBox_SetText(hwndCombo2, TEXT("Goodbye World!")); ALF_Layout_SetRowMinSize(panel, 1, 825); ALF_Layout_SetRowMinSize(panel, 3, 825); ALF_Layout_SetRowMinSize(panel, 5, 825); ALF_Layout_SetRowMinSize(panel, 7, 825); ALF_Layout_SetColumnMinSize(panel, 1, 825); ALF_Layout_SetColumnMinSize(panel, 3, 825); ALF_Layout_SetColumnExpandNumerator(panel, 2, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); } static ALFPanelVTable comboPanelVtbl = { comboPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void comboPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &comboPanelVtbl, priv); } /* notebook panel */ static void notebookPanelAttach(void *closure, HWND panel) { (void)closure; HWND hwndTab = ALF_AddNotebook(panel, (WORD)-1, 0, 0); HWND hwndTabPanel0 = ALF_Notebook_AddTab(hwndTab, TEXT("Notebook Debug")); HWND hwndTabPanel1 = ALF_Notebook_AddTab(hwndTab, TEXT("Tab 1")); HWND hwndTabPanel2 = ALF_Notebook_AddTab(hwndTab, TEXT("Tab 2")); HWND hwndTabPanel3 = ALF_Notebook_AddTab(hwndTab, TEXT("Another tab")); ALF_Notebook_AddTab(hwndTab, TEXT("Yet another empty tab")); ALF_SetBackgroundColor(hwndTabPanel3, ALF_COLOR_RGB(0, 255, 0)); ALF_AddButton(hwndTabPanel0, (WORD)-1, 0, 0, TEXT("Some button")); ALF_AddButton(hwndTabPanel0, (WORD)-1, 0, 1, TEXT("Some other button")); ALF_Layout_SetRowExpandNumerator(hwndTabPanel0, 2, 1); ALF_Layout_SetColumnExpandNumerator(hwndTabPanel0, 1, 1); ALF_AddLabel(hwndTabPanel1, (WORD)-1, 0, 0, TEXT("Hello World!")); ALF_AddLabel(hwndTabPanel2, (WORD)-1, 0, 0, TEXT("Goodbye, &World!")); ALF_AddEdit(hwndTabPanel2, (WORD)-1, 1, 0, TEXT("lol")); ALF_AddLabel(hwndTabPanel1, (WORD)-1, 0, 1, TEXT("Blabla")); ALF_Layout_SetRowExpandNumerator(hwndTabPanel1, 1, 1); ALF_AddLabel(hwndTabPanel1, (WORD)-1, 0, 2, TEXT("No 3")); ALF_AddEdit(hwndTabPanel1, (WORD)-1, 0, 3, TEXT("Dummy")); ALF_SetText(hwndTabPanel2, TEXT("Panel Text Demo Test Test Test")); HWND hwndNativeTabCtrl = CreateWindow(WC_TABCONTROL, TEXT(""), WS_CHILD|WS_CLIPSIBLINGS|WS_VISIBLE, 0, 0, 1, 1, panel, NULL, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 0, 2, hwndNativeTabCtrl, 10, 8250, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); TCITEM tci; ZeroMemory(&tci, sizeof(tci)); tci.mask = TCIF_TEXT | TCIF_IMAGE; tci.iImage = -1; tci.pszText = TEXT("Yet another empty tab"); TabCtrl_InsertItem(hwndNativeTabCtrl, 0, &tci); tci.pszText = TEXT("Another tab"); TabCtrl_InsertItem(hwndNativeTabCtrl, 0, &tci); tci.pszText = TEXT("Tab 2"); TabCtrl_InsertItem(hwndNativeTabCtrl, 0, &tci); tci.pszText = TEXT("Tab 1"); TabCtrl_InsertItem(hwndNativeTabCtrl, 0, &tci); tci.pszText = TEXT("Notebook Debug"); TabCtrl_InsertItem(hwndNativeTabCtrl, 0, &tci); } static ALFPanelVTable notebookPanelVtbl = { notebookPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void notebookPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, ¬ebookPanelVtbl, priv); } /* checkbox panel */ static void checkboxPanelAttach(void *closure, HWND outerPanel) { (void)closure; HWND panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 1, TEXT("Checkbox 1")); ALF_AddCheckbox(panel, (WORD)-1, 1, 2, TEXT("Some Checkbo&x with a very very really very very long text")); HWND l = ALF_AddLabel(panel, (WORD)-1, 1, 4, TEXT("Width checker")); ALF_SetBackgroundColor(l, ALF_COLOR_RGB(0, 0, 255)); ALF_SetTextColor(l, ALF_COLOR_RGB(255, 255, 255)); ALF_AddCheckbox(panel, (WORD)-1, 1, 6, TEXT("Another Checkbox")); HWND c = ALF_AddCheckbox(panel, (WORD)-1, 1, 8, TEXT("Disabled Checkbox")); EnableWindow(c, FALSE); ALF_Layout_SetRowMinSize(panel, 3, 525); ALF_Layout_SetRowMinSize(panel, 5, 525); ALF_Layout_SetRowMinSize(panel, 7, 525); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 1, TEXT("Ch&eckbox 2")); ALF_AddCheckbox(panel, (WORD)-1, 1, 1, TEXT("Native Checkbox &with long text")); HWND hwnd = ALF_AddCheckbox(panel, (WORD)-1, 1, 3, TEXT("Native disabled Chec&kbox")); EnableWindow(hwnd, FALSE); ALF_Layout_SetRowMinSize(panel, 2, 525); ALF_Layout_SetRowMinSize(panel, 4, 525); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 3, TEXT("Radio 1")); hwnd = ALF_AddRadioButton(panel, (WORD)-1, 1, 2, TEXT("Some R&adio button")); ALF_AddRadioButton(panel, (WORD)-1, 1, 4, TEXT("Anot&her long One")); ALF_AddRadioButton(panel, (WORD)-1, 1, 6, TEXT("Option 3")); ALF_AddRadioButton(panel, (WORD)-1, 1, 8, TEXT("Option IV")); SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); ALF_Layout_SetRowMinSize(panel, 3, 525); ALF_Layout_SetRowMinSize(panel, 5, 525); ALF_Layout_SetRowMinSize(panel, 7, 525); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 3, TEXT("Radio 2")); hwnd = ALF_AddRadioButton(panel, (WORD)-1, 1, 1, TEXT("Native Radio Butto&n with long text")); SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); ALF_AddRadioButton(panel, (WORD)-1, 1, 3, TEXT("Native Radio B&utton #2")); ALF_Layout_SetRowMinSize(panel, 2, 525); ALF_Layout_SetRowMinSize(panel, 4, 525); ALF_Layout_SetColumnExpandNumerator(panel, 9, 1); ALF_Layout_SetRowExpandNumerator(panel, 9, 1); ALF_Layout_SetRowMinSize(outerPanel, 0, 825); ALF_Layout_SetRowMinSize(outerPanel, 2, 825); ALF_Layout_SetColumnMinSize(outerPanel, 0, 825); ALF_Layout_SetColumnMinSize(outerPanel, 2, 825); ALF_Layout_SetColumnMinSize(outerPanel, 4, 825); ALF_Layout_SetColumnExpandNumerator(outerPanel, 1, 1); ALF_Layout_SetColumnExpandNumerator(outerPanel, 3, 1); ALF_Layout_SetRowExpandNumerator(outerPanel, 1, 1); } static ALFPanelVTable checkboxPanelVtbl = { checkboxPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void checkboxPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &checkboxPanelVtbl, priv); } /* groupbox panel */ static void groupboxPanelAttach(void *closure, HWND panel) { (void)closure; ALF_AddLabel(panel, (WORD)-1, 1, 1, TEXT("ALF")); ALF_AddLabel(panel, (WORD)-1, 3, 1, TEXT("native")); HWND hwndGb0 = ALF_AddGroupBox(panel, (WORD)-1, 1, 3, TEXT("Test Bo&x")); HWND hwndGb1 = CreateWindowEx(WS_EX_TRANSPARENT, TEXT("BUTTON"), TEXT("Test Box"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_GROUPBOX, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 3, 3, hwndGb1, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddEdit(hwndGb0, (WORD)-1, 0, 0, TEXT("Dummy")); HWND hwndGb3 = ALF_AddGroupBox(panel, (WORD)-1, 1, 5, TEXT("Disabled")); EnableWindow(hwndGb3, FALSE); HWND hwndGb2 = CreateWindowEx(WS_EX_TRANSPARENT, TEXT("BUTTON"), TEXT("Disabled"), WS_CHILD | WS_TABSTOP | WS_VISIBLE | BS_GROUPBOX, 0, 0, 100, 100, panel, (HMENU)(WORD)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddControl(panel, 3, 5, hwndGb2, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); EnableWindow(hwndGb2, FALSE); ALF_Layout_SetRowMinSize(panel, 0, 825); ALF_Layout_SetRowMinSize(panel, 2, 825); ALF_Layout_SetRowMinSize(panel, 4, 825); ALF_Layout_SetRowMinSize(panel, 6, 825); ALF_Layout_SetColumnMinSize(panel, 0, 825); ALF_Layout_SetColumnMinSize(panel, 2, 825); ALF_Layout_SetColumnMinSize(panel, 4, 825); ALF_Layout_SetRowExpandNumerator(panel, 3, 1); ALF_Layout_SetRowExpandNumerator(panel, 5, 1); ALF_Layout_SetColumnExpandNumerator(panel, 1, 1); ALF_Layout_SetColumnExpandNumerator(panel, 3, 1); } static ALFPanelVTable groupboxPanelVtbl = { groupboxPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void groupboxPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &groupboxPanelVtbl, priv); } /* iconview panel */ static void iconviewPanelAttach(void *closure, HWND panel) { (void)closure; HICON winlogo = ALF_LoadIcon(NULL, IDI_WINLOGO, 64, 64); // FIXME! memory leak here ALF_AddIconView(panel, (WORD)-1, 1, 3, winlogo); ALF_Layout_SetRowMinSize(panel, 0, 825); ALF_Layout_SetRowMinSize(panel, 2, 825); ALF_Layout_SetRowMinSize(panel, 4, 825); ALF_Layout_SetRowMinSize(panel, 6, 825); ALF_Layout_SetColumnMinSize(panel, 0, 825); ALF_Layout_SetColumnMinSize(panel, 2, 825); ALF_Layout_SetColumnMinSize(panel, 4, 825); ALF_Layout_SetRowExpandNumerator(panel, 3, 1); ALF_Layout_SetRowExpandNumerator(panel, 5, 1); ALF_Layout_SetColumnExpandNumerator(panel, 1, 1); ALF_Layout_SetColumnExpandNumerator(panel, 3, 1); } static ALFPanelVTable iconviewPanelVtbl = { iconviewPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void iconviewPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &iconviewPanelVtbl, priv); } /* spinbox panel */ static LRESULT spinboxPanelCommand(void *closure, HWND panel, WORD notificationcode, WORD sourceid, HWND control) { (void)closure; if (notificationcode == EN_CHANGE && sourceid == ID_SPINBOX) { HWND out = ALF_ControlHwndById(panel, ID_SPINBOXOUT); TCHAR buf[12]; wsprintf(buf, TEXT("%d"), (int)ALF_SpinBox_Pos(control)); ALF_SetText(out, buf); return 1; } return 0; } static void spinboxPanelAttach(void *closure, HWND panel) { (void)closure; ALF_AddLabel(panel, (WORD)-1, 1, 1, TEXT("Spin Box -10 to +42")); ALF_AddNumericSpinBox(panel, ID_SPINBOX, 3, 1, 12, -10, 42); ALF_AddLabel(panel, ID_SPINBOXOUT, 3, 3, TEXT("initial")); ALF_Layout_SetRowMinSize(panel, 0, 825); ALF_Layout_SetRowMinSize(panel, 2, 825); ALF_Layout_SetRowMinSize(panel, 4, 825); ALF_Layout_SetColumnMinSize(panel, 0, 825); ALF_Layout_SetColumnMinSize(panel, 2, 525); ALF_Layout_SetColumnMinSize(panel, 4, 825); ALF_Layout_SetRowExpandNumerator(panel, 1, 1); ALF_Layout_SetRowExpandNumerator(panel, 3, 1); ALF_Layout_SetColumnExpandNumerator(panel, 3, 1); ALF_Layout_SetColumnExpandNumerator(panel, 4, 1); } static ALFPanelVTable spinboxPanelVtbl = { spinboxPanelAttach, commonPanelDestroy, commonPanelMessage, spinboxPanelCommand, NULL, commonPanelPaint, NULL }; static void spinboxPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &spinboxPanelVtbl, priv); } /* progress panel */ static LRESULT progressPanelCommand(void *closure, HWND panel, WORD notificationcode, WORD sourceid, HWND control) { (void)closure; if (notificationcode == EN_CHANGE && sourceid == ID_PROGRESS_SPINBOX) { ALF_Progress_SetValue(ALF_ControlHwndById(panel, ID_PROGRESS_BAR), (int)ALF_SpinBox_Pos(control)); ALF_Progress_SetValue(ALF_ControlHwndById(panel, ID_PROGRESS_NATIVE_BAR), (int)ALF_SpinBox_Pos(control)); ALF_Progress_SetValue(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), (int)ALF_SpinBox_Pos(control)); TCHAR buf[4]; wsprintf(buf, TEXT("%d"), (int)ALF_SpinBox_Pos(control)); ALF_SetText(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), buf); return 1; } if (notificationcode == BN_CLICKED) { if (sourceid == ID_PROGRESS_NORMAL) { ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_BAR), ALF_PROGRESS_STATE_NORMAL); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_NATIVE_BAR), ALF_PROGRESS_STATE_NORMAL); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), ALF_PROGRESS_STATE_NORMAL); } if (sourceid == ID_PROGRESS_PAUSED) { ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_BAR), ALF_PROGRESS_STATE_PAUSED); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_NATIVE_BAR), ALF_PROGRESS_STATE_PAUSED); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), ALF_PROGRESS_STATE_PAUSED); } if (sourceid == ID_PROGRESS_ERROR) { ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_BAR), ALF_PROGRESS_STATE_ERROR); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_NATIVE_BAR), ALF_PROGRESS_STATE_ERROR); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), ALF_PROGRESS_STATE_ERROR); } if (sourceid == ID_PROGRESS_INDETERMINATE) { ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_BAR), ALF_PROGRESS_STATE_INDETERMINATE); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_NATIVE_BAR), ALF_PROGRESS_STATE_INDETERMINATE); ALF_Progress_SetState(ALF_ControlHwndById(panel, ID_PROGRESS_GAUGE), ALF_PROGRESS_STATE_INDETERMINATE); } return 1; } return 0; } static void progressPanelAttach(void *closure, HWND panel) { (void)closure; HWND bar = ALF_AddProgressBar(panel, ID_PROGRESS_BAR, 1, 1); ALF_Progress_SetRange(bar, -50, 50); HWND native = ALF_AddNativeProgressBar(panel, ID_PROGRESS_NATIVE_BAR, 1, 3); ALF_Progress_SetRange(native, -50, 50); HWND gauge = ALF_AddProgressGauge(panel, ID_PROGRESS_GAUGE, 1, 5); ALF_Progress_SetRange(gauge, -50, 50); ALF_AddNumericSpinBox(panel, ID_PROGRESS_SPINBOX, 1, 7, 12, -50, 50); ALF_AddButton(panel, ID_PROGRESS_NORMAL, 1, 9, TEXT("Normal")); ALF_AddButton(panel, ID_PROGRESS_PAUSED, 1, 11, TEXT("Paused")); ALF_AddButton(panel, ID_PROGRESS_ERROR, 1, 13, TEXT("Error")); ALF_AddButton(panel, ID_PROGRESS_INDETERMINATE, 1, 15, TEXT("Indeterminate")); ALF_Layout_SetRowMinSize(panel, 0, 825); ALF_Layout_SetRowMinSize(panel, 2, 825); ALF_Layout_SetRowMinSize(panel, 4, 825); ALF_Layout_SetRowMinSize(panel, 6, 825); ALF_Layout_SetRowMinSize(panel, 8, 825); ALF_Layout_SetRowMinSize(panel, 10, 825); ALF_Layout_SetRowMinSize(panel, 12, 825); ALF_Layout_SetRowMinSize(panel, 14, 825); ALF_Layout_SetRowMinSize(panel, 16, 825); ALF_Layout_SetColumnMinSize(panel, 0, 825); ALF_Layout_SetColumnMinSize(panel, 2, 525); ALF_Layout_SetColumnMinSize(panel, 4, 825); ALF_Layout_SetRowExpandNumerator(panel, 16, 1); ALF_Layout_SetColumnExpandNumerator(panel, 1, 1); ALF_Layout_SetColumnExpandNumerator(panel, 3, 1); } static ALFPanelVTable progressPanelVtbl = { progressPanelAttach, commonPanelDestroy, commonPanelMessage, progressPanelCommand, NULL, commonPanelPaint, NULL }; static void progressPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_Panel_SetVTable(panel, &progressPanelVtbl, priv); } void (*g_paneInitTable[PANE__MAX])(HWND) = { buttonPanelInit, //PANE_BUTTONS labelPanelInit, //PANE_LABEL, comboPanelInit, //PANE_COMBO, notebookPanelInit, //PANE_NOTEBOOK, checkboxPanelInit, //PANE_CHECKBOX, groupboxPanelInit, //PANE_GROUPBOX, iconviewPanelInit, //PANE_ICONVIEW, spinboxPanelInit, //PANE_SPINBOX progressPanelInit //PANE_PROGRESS }; static void addPaneToNotebook(HWND hwndNotebook, int paneId) { HWND panel = ALF_Notebook_AddTab(hwndNotebook, g_paneLabels[paneId]); g_paneInitTable[paneId](panel); } static void handleClose(void *closure, HWND window) { (void)closure; //ALF_Toplevel_SetModalResult(window, 0); DestroyWindow(window); } static LRESULT handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, HWND control) { (void)closure; if (notificationcode == CBN_SELCHANGE && sourceid == ID_COMBO2) { TCHAR *text = ALF_ComboBox_CurrentText(control); HWND hwndLbl = ALF_ControlHwndById(window, ID_LBLCOMBOTEXT); ALF_SetText(hwndLbl, text); ALF_Free(text); } if (control != NULL && sourceid == ID_BTNCOMBOCLEAR) { HWND combo = ALF_ControlHwndById(window, ID_COMBO2); ALF_ComboBox_SetCurrentIndex(combo, -1); } if (sourceid == ID_HELLO) { ALF_MessageBox(window, TEXT("Hello World!"), TEXT("Hello"), MB_ICONASTERISK|MB_OK); } if (sourceid == IDM_FILE_CLOSE) { SendMessage(window, WM_CLOSE, 0, 0); } if (sourceid == IDM_BACKGROUND_BLUE) { HWND nb = ALF_ControlHwndById(window, ID_NOTEBOOK); HWND panel = ALF_Notebook_SelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_BLUE); } if (sourceid == IDM_BACKGROUND_GREEN) { HWND nb = ALF_ControlHwndById(window, ID_NOTEBOOK); HWND panel = ALF_Notebook_SelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_GREEN); } if (sourceid == IDM_BACKGROUND_INHERIT) { HWND nb = ALF_ControlHwndById(window, ID_NOTEBOOK); HWND panel = ALF_Notebook_SelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_INHERIT); } if (sourceid == IDM_BACKGROUND_GRADIENT) { HWND nb = ALF_ControlHwndById(window, ID_NOTEBOOK); HWND panel = ALF_Notebook_SelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_GRADIENT); } if (sourceid >= IDM_PANES && sourceid < IDM_PANES__MAX) { int paneId = sourceid - IDM_PANES; HWND nb = ALF_ControlHwndById(window, ID_NOTEBOOK); addPaneToNotebook(nb, paneId); } if (sourceid >= IDM_MODALDIALOG_PANES && sourceid < IDM_MODALDIALOG_PANES__MAX) { int paneId = sourceid - IDM_MODALDIALOG_PANES; wfModalDialogRun(window, paneId); } if (sourceid >= IDM_MODELESSDIALOG_PANES && sourceid < IDM_MODELESSDIALOG_PANES__MAX) { int paneId = sourceid - IDM_MODELESSDIALOG_PANES; wfModelessDialogStart(paneId); } if (sourceid == IDM_CENTER_ON_MONITOR) { ALF_Toplevel_CenterOnCurrentMonitor(window); } if (sourceid == IDM_MESSAGEDLG_INFO) { const TCHAR *text = TEXT("Hello World!\r\n\r\n") TEXT("This is a really long text to show that there is no automatic line breaking going on.\r\n") TEXT("We also want to demo\r\n\r\n\r\n\r\n\r\n\r\n") TEXT("what happens when the text is very high"); ALF_MessageDlg_Information(window, text, TEXT("Hello"), NULL); } if (sourceid == IDM_MESSAGEDLG_WARNING) { ALF_MessageDlg_Warning(window, TEXT("Something noteworthy happened"), TEXT("Warning"), TEXT("Got it!")); } if (sourceid == IDM_MESSAGEDLG_ERROR) { ALF_MessageDlg_Error(window, TEXT("Something happened."), TEXT("ERROR"), NULL); } if (sourceid == IDM_MESSAGEDLG_QUESTION) { if (ALF_MessageDlg_Confirm(window, TEXT("Continue?"), TEXT("Question"), TEXT("Yes"), TEXT("No")) == IDOK) { ALF_MessageDlg_Information(window, TEXT("You clicked OK"), TEXT("Info"), NULL); } else { ALF_MessageDlg_Information(window, TEXT("You clicked Cancel"), TEXT("Info"), NULL); } } if (sourceid == IDM_MESSAGEDLG_DANGERQUESTION) { if (ALF_MessageDlg_ConfirmDanger(window, TEXT("Do you want to format your hard drive?"), TEXT("Question"), TEXT("&Format Drive"), TEXT("Cancel")) == IDOK) { ALF_MessageDlg_Information(window, TEXT("You clicked OK"), TEXT("Info"), NULL); } else { ALF_MessageDlg_Information(window, TEXT("You clicked Cancel"), TEXT("Info"), NULL); } } return 0; } static BOOL wfModalDialogInit(void *closure, HWND dialog) { HWND panel = ALF_AddPanel(dialog, (WORD)-1, 1, 1); int paneid = (int)(LONG_PTR)closure; g_paneInitTable[paneid](panel); ALF_SetText(dialog, g_paneLabels[paneid]); ALF_Layout_SetColumnExpandNumerator(dialog, 1, 1); ALF_Layout_SetRowExpandNumerator(dialog, 1, 1); ALF_Layout_SetRowMinSize(dialog, 0, 525); ALF_Layout_SetRowMinSize(dialog, 2, 525); ALF_Layout_SetColumnMinSize(dialog, 0, 525); ALF_Layout_SetColumnMinSize(dialog, 2, 525); return TRUE; } static LRESULT wfModalDialogWindowProc(void *closure, HWND dialog, UINT msg, WPARAM wp, LPARAM lp) { (void)closure; if (msg == WM_CLOSE) { ALF_Toplevel_SetModalResult(dialog, 0); } return ALF_Toplevel_DefWindowProc(dialog, msg, wp, lp); } static ALFToplevelVTable g_wfModalDialogVtbl; static void wfModalDialogPrepareVtbl(void) { ZeroMemory(&g_wfModalDialogVtbl, sizeof(g_wfModalDialogVtbl)); g_wfModalDialogVtbl.message = wfModalDialogWindowProc; g_wfModalDialogVtbl.initialize = wfModalDialogInit; } static void wfModalDialogRun(HWND owner, int pane) { HWND dlg = ALF_CreateToplevelWindow(WS_EX_DLGMODALFRAME, WS_POPUPWINDOW | WS_CAPTION | WS_THICKFRAME, owner, NULL, &g_wfModalDialogVtbl, (void*)(LONG_PTR)pane); ALF_Toplevel_ShowModal(dlg); DestroyWindow(dlg); } static BOOL wfModelessDialogInit(void *closure, HWND dialog) { HWND panel = ALF_AddPanel(dialog, (WORD)-1, 1, 1); int paneid = (int)(LONG_PTR)closure; g_paneInitTable[paneid](panel); ALF_SetText(dialog, g_paneLabels[paneid]); ALF_Layout_SetColumnExpandNumerator(dialog, 1, 1); ALF_Layout_SetRowExpandNumerator(dialog, 1, 1); ALF_Layout_SetRowMinSize(dialog, 0, 525); ALF_Layout_SetRowMinSize(dialog, 2, 525); ALF_Layout_SetColumnMinSize(dialog, 0, 525); ALF_Layout_SetColumnMinSize(dialog, 2, 525); return TRUE; } static void wfModelessDialogClose(void *closure, HWND dialog) { (void)closure; DestroyWindow(dialog); } static ALFToplevelVTable g_wfModelessDialogVtbl; static void wfModelessDialogPrepareVtbl(void) { ZeroMemory(&g_wfModelessDialogVtbl, sizeof(g_wfModelessDialogVtbl)); g_wfModelessDialogVtbl.close = wfModelessDialogClose; g_wfModelessDialogVtbl.initialize = wfModelessDialogInit; } static void wfModelessDialogStart(int pane) { HWND dlg = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, g_application, &g_wfModelessDialogVtbl, (void*)(LONG_PTR)pane); ShowWindow(dlg, SW_SHOW); } int CALLBACK #ifdef UNICODE wWinMain #else WinMain #endif (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; (void)hInstance; ALF_SetDpiAwareness(ALF_DPI_AWARENESS_PER_MONITOR_AWARE_V2); if (LOBYTE(LOWORD(GetVersion())) >= 4) { HMODULE hMsimg32 = LoadLibraryA("msimg32.dll"); if (hMsimg32) { *((void**)&fnGradientFill) = (void*)GetProcAddress(hMsimg32, "GradientFill"); } } wfModalDialogPrepareVtbl(); wfModelessDialogPrepareVtbl(); ALFToplevelVTable vtbl; ZeroMemory(&vtbl, sizeof(vtbl)); vtbl.command = handleCommand; vtbl.close = handleClose; ALF_Initialize(); g_application = ALF_CreateApplication(); HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, g_application, &vtbl, NULL); if (!win) { MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); return 1; } ALF_SetText(win, TEXT("Widget Factory")); HWND hwndNtbk = ALF_AddNotebook(win, ID_NOTEBOOK, 1, 1); ALF_Layout_SetControlSpan(win, hwndNtbk, 4, 1); addPaneToNotebook(hwndNtbk, PANE_BUTTONS); addPaneToNotebook(hwndNtbk, PANE_LABEL); addPaneToNotebook(hwndNtbk, PANE_CHECKBOX); addPaneToNotebook(hwndNtbk, PANE_NOTEBOOK); addPaneToNotebook(hwndNtbk, PANE_COMBO); addPaneToNotebook(hwndNtbk, PANE_GROUPBOX); addPaneToNotebook(hwndNtbk, PANE_ICONVIEW); addPaneToNotebook(hwndNtbk, PANE_SPINBOX); addPaneToNotebook(hwndNtbk, PANE_PROGRESS); ALF_AddButton(win, ID_HELLO, 1, 3, TEXT("&Hello World!")); ALF_AddButton(win, (WORD)-1, 3, 3, TEXT("Goodbye, World")); ALF_Layout_SetRowMinSize(win, 2, 525); ALF_Layout_SetRowMinSize(win, 0, 525); ALF_Layout_SetRowMinSize(win, 4, 525); ALF_Layout_SetColumnMinSize(win, 0, 525); ALF_Layout_SetColumnMinSize(win, 2, 525); ALF_Layout_SetColumnMinSize(win, 5, 525); ALF_Layout_SetRowExpandNumerator(win, 1, 1); ALF_Layout_SetColumnExpandNumerator(win, 4, 1); ALF_Toplevel_SetDefaultButton(win, ID_HELLO); ALF_SetFocus(GetNextDlgTabItem(win, win, FALSE)); HMENU mainmenu = CreateMenu(); HMENU filemenu = CreateMenu(); HMENU newtabmn = CreateMenu(); HMENU modwndmn = CreateMenu(); HMENU mlwndmn = CreateMenu(); HMENU helpmenu = CreateMenu(); HMENU bgmenu = CreateMenu(); AppendMenu(filemenu, MF_STRING, ID_HELLO, TEXT("Hello")); AppendMenu(filemenu, MF_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_POPUP, (UINT_PTR)newtabmn, TEXT("New Tab")); AppendMenu(filemenu, MF_POPUP, (UINT_PTR)modwndmn, TEXT("Show Modal")); AppendMenu(filemenu, MF_POPUP, (UINT_PTR)mlwndmn, TEXT("Show Modeless")); AppendMenu(filemenu, MF_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4")); AppendMenu(helpmenu, MF_STRING, IDM_CENTER_ON_MONITOR, TEXT("Center Window")); AppendMenu(helpmenu, MF_SEPARATOR, 0, 0); AppendMenu(helpmenu, MF_STRING, IDM_MESSAGEDLG_INFO, TEXT("Information")); AppendMenu(helpmenu, MF_STRING, IDM_MESSAGEDLG_WARNING, TEXT("Warning")); AppendMenu(helpmenu, MF_STRING, IDM_MESSAGEDLG_ERROR, TEXT("Error")); AppendMenu(helpmenu, MF_STRING, IDM_MESSAGEDLG_QUESTION, TEXT("Question")); AppendMenu(helpmenu, MF_STRING, IDM_MESSAGEDLG_DANGERQUESTION, TEXT("Dangerous Question")); AppendMenu(helpmenu, MF_SEPARATOR, 0, 0); AppendMenu(helpmenu, MF_STRING, IDM_HELP_ABOUT, TEXT("&About")); AppendMenu(bgmenu, MF_STRING, IDM_BACKGROUND_INHERIT, TEXT("(Default)")); AppendMenu(bgmenu, MF_STRING, IDM_BACKGROUND_GRADIENT, TEXT("Gradient")); AppendMenu(bgmenu, MF_STRING, IDM_BACKGROUND_BLUE, TEXT("Blue")); AppendMenu(bgmenu, MF_STRING, IDM_BACKGROUND_GREEN, TEXT("Green")); AppendMenu(mainmenu, MF_POPUP, (UINT_PTR)filemenu, TEXT("&File")); AppendMenu(mainmenu, MF_POPUP, (UINT_PTR)bgmenu, TEXT("Background")); AppendMenu(mainmenu, MF_POPUP, (UINT_PTR)helpmenu, TEXT("&Help")); for (int i = 0; i < PANE__MAX; ++i) { AppendMenu(newtabmn, MF_STRING, IDM_PANES + (UINT)i, g_paneLabels[i]); AppendMenu(modwndmn, MF_STRING, IDM_MODALDIALOG_PANES + (UINT)i, g_paneLabels[i]); AppendMenu(mlwndmn, MF_STRING, IDM_MODELESSDIALOG_PANES + (UINT)i, g_paneLabels[i]); } SetMenu(win, mainmenu); ALF_Toplevel_EnsureBigEnough(win); ALF_Application_Run(g_application); ALF_DestroyApplication(g_application); ALF_UnInitialize(); return 0; } void WINAPI _entry(void) { ExitProcess((UINT) #ifdef UNICODE wWinMain #else WinMain #endif (GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW)); }