#include "alf/alf.h" enum { PANE_BUTTONS = 0, PANE_LABEL, PANE_COMBO, PANE_NOTEBOOK, PANE_CHECKBOX, PANE_GROUPBOX, 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 }; enum { ID_COMBO1 = 100, ID_COMBO2, ID_LBLCOMBOTEXT, ID_BTNCOMBOCLEAR, ID_NOTEBOOK, ID_HELLO, ID_B_TABBGSOLID, ID_B_TABBGTEXTURE, 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_PANES, IDM_PANES__MAX = IDM_PANES + PANE__MAX }; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; enum PanelBackgroundMode { BG_INHERIT, BG_GRADIENT, BG_SOLID_GREEN, BG_SOLID_BLUE }; #define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1) /* 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_AddWidgetLayoutFlag(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) { ALF_InvalidateBackground(hwnd); } 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_PanelSetEdge(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_AddButton(panel, (WORD)-1, 2, 2, TEXT("Hello, World!")); ALF_SetWidgetLayoutMinSize(panel, b, 0, 0); b = ALF_AddButton(panel, (WORD)-1, 2, 4, TEXT("Hello, World!")); EnableWindow(b, FALSE); ALF_SetWidgetLayoutMinSize(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_AddWidget(panel, 4, 2, hwndNb1, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddWidget(panel, 4, 4, hwndNb2, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); b = ALF_AddButton(panel, (WORD)-1, 4, 6, TEXT("Hello, World!")); ALF_SetWidgetLayoutMinSize(panel, b, 0, 0); b = ALF_AddButton(panel, (WORD)-1, 2, 8, TEXT("Multiline\r\nButton")); ALF_SetWidgetLayoutMinSize(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_AddWidget(panel, 4, 8, hwndNb3, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_LayoutSetRowMinSize(panel, 1, 825); ALF_LayoutSetRowMinSize(panel, 3, 825); ALF_LayoutSetRowMinSize(panel, 5, 825); ALF_LayoutSetRowMinSize(panel, 7, 825); ALF_LayoutSetRowMinSize(panel, 9, 825); ALF_LayoutSetColumnMinSize(panel, 1, 825); ALF_LayoutSetColumnMinSize(panel, 3, 825); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_PanelSetEdge(panel, BDR_RAISEDINNER); panel = ALF_AddPanel(outerPanel, (WORD)-1, 0, 1); ALF_AddButton(panel, (WORD)-1, 2, 2, TEXT("Standard")); 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_AddWidget(panel, 4, 2, hwndNb4, 5625, 1725, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddButton(panel, (WORD)-1, 2, 4, TEXT("Expanding")); 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_AddWidget(panel, 4, 4, hwndNb5, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_AddButton(panel, (WORD)-1, 2, 6, TEXT("Expanding\r\nMultiline")); 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_AddWidget(panel, 4, 6, hwndNb6, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_LayoutSetRowMinSize(panel, 1, 825); ALF_LayoutSetRowMinSize(panel, 3, 825); ALF_LayoutSetRowMinSize(panel, 5, 825); ALF_LayoutSetRowMinSize(panel, 7, 825); ALF_LayoutSetColumnMinSize(panel, 1, 825); ALF_LayoutSetColumnMinSize(panel, 3, 825); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 4, 1); ALF_LayoutSetRowExpandNumerator(panel, 6, 1); ALF_PanelSetEdge(panel, BDR_RAISEDINNER); ALF_LayoutSetRowExpandNumerator(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_AddWidget(panel, 3, 0, hwndBc4, 1000, 0, ALF_LAYOUT_INHERITFONT); ALF_AddWidget(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_PanelSetVTable(panel, &buttonPanelVtbl, priv); } /* label panel */ //FIXME! replace with real widget static HWND makeSeparator(HWND parent, int x, int y) { HWND p = ALF_AddPanel(parent, (WORD)-1, x, y); ALF_PanelSetEdge(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_LabelSetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 0, 2, TEXT("Left\r\nCenter")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 0, 4, TEXT("Left\r\nBottom")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_LEFT | ALF_LABEL_ALIGN_BOTTOM); l = ALF_AddLabel(g, (WORD)-1, 2, 0, TEXT("Center\r\nTop")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 2, 2, TEXT("Center\r\nCenter")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 2, 4, TEXT("Center\r\nBottom")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_BOTTOM); l = ALF_AddLabel(g, (WORD)-1, 4, 0, TEXT("Right\r\nTop")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_RIGHT | ALF_LABEL_ALIGN_TOP); l = ALF_AddLabel(g, (WORD)-1, 4, 2, TEXT("Right\r\nCenter")); ALF_LabelSetStyle(l, ALF_LABEL_ALIGN_RIGHT | ALF_LABEL_ALIGN_VCENTER); l = ALF_AddLabel(g, (WORD)-1, 4, 4, TEXT("Right\r\nBottom")); ALF_LabelSetStyle(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_LayoutSetRowExpandNumerator(g, 0, 1); ALF_LayoutSetRowExpandNumerator(g, 2, 1); ALF_LayoutSetRowExpandNumerator(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_LayoutSetColumnExpandNumerator(g, 0, 1); ALF_LayoutSetColumnExpandNumerator(g, 2, 1); ALF_LayoutSetColumnExpandNumerator(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_LabelSetStyle(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_LayoutSetRowExpandNumerator(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_PanelSetVTable(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_ComboBoxInsertString(hwndCombo1, 0, TEXT("Hello World!")); ALF_ComboBoxInsertString(hwndCombo1, -1, TEXT("Goodbye World!")); ALF_ComboBoxInsertString(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_ComboBoxAddString(hwndCombo2, TEXT("Hello World!")); ALF_ComboBoxAddString(hwndCombo2, TEXT("Goodbye World!")); ALF_ComboBoxAddString(hwndCombo2, TEXT("The quick brown fox jumps over the lazy dog")); ALF_AddLabel(panel, ID_LBLCOMBOTEXT, 2, 6, TEXT("[ComboBox2 value]")); ALF_ComboBoxSetText(hwndCombo2, TEXT("Goodbye World!")); ALF_LayoutSetRowMinSize(panel, 1, 825); ALF_LayoutSetRowMinSize(panel, 3, 825); ALF_LayoutSetRowMinSize(panel, 5, 825); ALF_LayoutSetRowMinSize(panel, 7, 825); ALF_LayoutSetColumnMinSize(panel, 1, 825); ALF_LayoutSetColumnMinSize(panel, 3, 825); ALF_LayoutSetColumnExpandNumerator(panel, 2, 1); ALF_LayoutSetRowExpandNumerator(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_PanelSetVTable(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_NotebookAddTab(hwndTab, TEXT("Notebook Debug")); HWND hwndTabPanel1 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 1")); HWND hwndTabPanel2 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 2")); HWND hwndTabPanel3 = ALF_NotebookAddTab(hwndTab, TEXT("Another tab")); ALF_NotebookAddTab(hwndTab, TEXT("Yet another empty tab")); ALF_SetBackgroundColor(hwndTabPanel3, ALF_COLOR_RGB(0, 255, 0)); ALF_AddButton(hwndTabPanel0, ID_B_TABBGSOLID, 0, 0, TEXT("Solid tab background")); ALF_AddButton(hwndTabPanel0, ID_B_TABBGTEXTURE, 0, 1, TEXT("Textured tab background")); ALF_LayoutSetRowExpandNumerator(hwndTabPanel0, 2, 1); ALF_LayoutSetColumnExpandNumerator(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_LayoutSetRowExpandNumerator(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")); } static ALFPanelVTable notebookPanelVtbl = { notebookPanelAttach, commonPanelDestroy, commonPanelMessage, NULL, NULL, commonPanelPaint, NULL }; static void notebookPanelInit(HWND panel) { CommonPanelPriv *priv = ALF_New(CommonPanelPriv, 1); ALF_PanelSetVTable(panel, ¬ebookPanelVtbl, priv); } /* checkbox panel */ static void checkboxPanelAttach(void *closure, HWND outerPanel) { (void)closure; HWND panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 1, TEXT("ALF Checkbox")); 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_LayoutSetRowMinSize(panel, 3, 525); ALF_LayoutSetRowMinSize(panel, 5, 525); ALF_LayoutSetRowMinSize(panel, 7, 525); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 1, TEXT("Nat&ive Checkbox")); HWND hwnd = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Native Checkbox &with long text"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, 0, 0, 100, 100, panel, (HMENU)(ULONG_PTR)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddWidget(panel, 1, 1, hwnd, 2, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); hwnd = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Native disabled Chec&kbox"), WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_AUTOCHECKBOX, 0, 0, 100, 100, panel, (HMENU)(ULONG_PTR)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); EnableWindow(hwnd, FALSE); ALF_AddWidget(panel, 1, 3, hwnd, 0, 0, ALF_LAYOUT_SIZE_CHECKBOX | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_LayoutSetRowMinSize(panel, 2, 525); ALF_LayoutSetRowMinSize(panel, 4, 525); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 1, 3, TEXT("ALF Radio Button")); 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_LayoutSetRowMinSize(panel, 3, 525); ALF_LayoutSetRowMinSize(panel, 5, 525); ALF_LayoutSetRowMinSize(panel, 7, 525); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 9, 1); panel = ALF_AddGroupBox(outerPanel, (WORD)-1, 3, 3, TEXT("Native Radio")); hwnd = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Native Radio Butto&n with long text"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 100, 100, panel, (HMENU)(ULONG_PTR)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); SendMessage(hwnd, BM_SETCHECK, BST_CHECKED, 0); ALF_AddWidget(panel, 1, 1, hwnd, 0, 0, ALF_LAYOUT_SIZE_RADIOBUTTON | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); hwnd = CreateWindowEx(0, TEXT("BUTTON"), TEXT("Native Radio B&utton #2"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 0, 0, 100, 100, panel, (HMENU)(ULONG_PTR)-1, (HINSTANCE)GetModuleHandle(NULL), NULL); ALF_AddWidget(panel, 1, 3, hwnd, 0, 0, ALF_LAYOUT_SIZE_RADIOBUTTON | ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); ALF_LayoutSetRowMinSize(panel, 2, 525); ALF_LayoutSetRowMinSize(panel, 4, 525); ALF_LayoutSetColumnExpandNumerator(panel, 9, 1); ALF_LayoutSetRowExpandNumerator(panel, 9, 1); ALF_LayoutSetRowMinSize(outerPanel, 0, 825); ALF_LayoutSetRowMinSize(outerPanel, 2, 825); ALF_LayoutSetColumnMinSize(outerPanel, 0, 825); ALF_LayoutSetColumnMinSize(outerPanel, 2, 825); ALF_LayoutSetColumnMinSize(outerPanel, 4, 825); ALF_LayoutSetColumnExpandNumerator(outerPanel, 1, 1); ALF_LayoutSetColumnExpandNumerator(outerPanel, 3, 1); ALF_LayoutSetRowExpandNumerator(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_PanelSetVTable(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_AddWidget(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_AddWidget(panel, 3, 5, hwndGb2, 0, 0, ALF_LAYOUT_INHERITFONT | ALF_LAYOUT_TRANSPARENTBG); EnableWindow(hwndGb2, FALSE); ALF_LayoutSetRowMinSize(panel, 0, 825); ALF_LayoutSetRowMinSize(panel, 2, 825); ALF_LayoutSetRowMinSize(panel, 4, 825); ALF_LayoutSetRowMinSize(panel, 6, 825); ALF_LayoutSetColumnMinSize(panel, 0, 825); ALF_LayoutSetColumnMinSize(panel, 2, 825); ALF_LayoutSetColumnMinSize(panel, 4, 825); ALF_LayoutSetRowExpandNumerator(panel, 3, 1); ALF_LayoutSetRowExpandNumerator(panel, 5, 1); ALF_LayoutSetColumnExpandNumerator(panel, 1, 1); ALF_LayoutSetColumnExpandNumerator(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_PanelSetVTable(panel, &groupboxPanelVtbl, 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, }; static void addPaneToNotebook(HWND hwndNotebook, int paneId) { HWND panel = ALF_NotebookAddTab(hwndNotebook, g_paneLabels[paneId]); g_paneInitTable[paneId](panel); } 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_ComboBoxCurrentText(control); ALF_SetWidgetText(window, ID_LBLCOMBOTEXT, text); ALF_Free(text); } if (control != NULL && sourceid == ID_BTNCOMBOCLEAR) { HWND combo = ALF_WidgetHwndById(window, ID_COMBO2); ALF_ComboBoxSetCurrentIndex(combo, -1); } if (sourceid == ID_HELLO) { MessageBox(window, TEXT("Hello World!"), TEXT("Hello"), MB_ICONASTERISK|MB_OK); } if (control != NULL && sourceid == ID_B_TABBGSOLID) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); ALF_NotebookAddFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); } if (control != NULL && sourceid == ID_B_TABBGTEXTURE) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); ALF_NotebookRemoveFlag(nb, ALF_NOTEBOOK_SOLID_TAB_BACKGROUND); } if (sourceid == IDM_FILE_CLOSE) { SendMessage(window, WM_CLOSE, 0, 0); } if (sourceid == IDM_BACKGROUND_BLUE) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); HWND panel = ALF_NotebookSelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_BLUE); } if (sourceid == IDM_BACKGROUND_GREEN) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); HWND panel = ALF_NotebookSelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_SOLID_GREEN); } if (sourceid == IDM_BACKGROUND_INHERIT) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); HWND panel = ALF_NotebookSelectedPanel(nb); SendMessage(panel, FM_PANEL_SET_BGMODE, 0, (LPARAM)BG_INHERIT); } if (sourceid == IDM_BACKGROUND_GRADIENT) { HWND nb = ALF_WidgetHwndById(window, ID_NOTEBOOK); HWND panel = ALF_NotebookSelectedPanel(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_WidgetHwndById(window, ID_NOTEBOOK); addPaneToNotebook(nb, paneId); } return 0; } 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"); } } ALFWindowVTable vtbl; ZeroMemory(&vtbl, sizeof(vtbl)); vtbl.command = handleCommand; ALF_Initialize(); HWND win = ALF_CreateToplevelWindow(NULL, &vtbl, NULL); if (!win) { MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); return 1; } HWND hwndNtbk = ALF_AddNotebook(win, ID_NOTEBOOK, 1, 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); HWND btnpanel = ALF_AddPanel(win, (WORD)-1, 1, 3); ALF_AddButton(btnpanel, ID_HELLO, 1, 3, TEXT("&Hello World!")); ALF_AddButton(btnpanel, (WORD)-1, 3, 3, TEXT("Goodbye, World")); ALF_LayoutSetRowMinSize(win, 2, 525); ALF_LayoutSetRowMinSize(win, 0, 525); ALF_LayoutSetRowMinSize(win, 4, 525); ALF_LayoutSetColumnMinSize(win, 0, 525); ALF_LayoutSetColumnMinSize(win, 2, 525); ALF_LayoutSetRowExpandNumerator(win, 1, 1); ALF_LayoutSetColumnExpandNumerator(win, 1, 1); ALF_LayoutSetColumnExpandNumerator(btnpanel, 9, 1); ALF_LayoutSetColumnMinSize(btnpanel, 2, 525); ALF_SetDefaultButton(win, ID_HELLO); ALF_ResizeWindow(win, 1, 1); HMENU mainmenu = CreateMenu(); HMENU filemenu = CreateMenu(); HMENU newtabmn = 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_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4")); 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]); } SetMenu(win, mainmenu); ALF_ShowModal(win); ALF_DestroyWindow(win); ALF_UnInitialize(); return 0; } void WINAPI _entry(void) { ExitProcess((UINT) #ifdef UNICODE wWinMain #else WinMain #endif (GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW)); }