#include "alf/alf.h" enum { ID_LBLHELLO, ID_LBL2, ID_LBL3, ID_ED1, ID_B1, ID_B2, ID_B3, ID_B4, ID_COMBO1, ID_LBL4, ID_COMBO2, ID_LBL5, ID_LBL6, ID_BC1, ID_BC2, ID_BC3, ID_BC4, ID_BC5, ID_NOTEBOOK, ID__MAX }; static HBRUSH red; static HBRUSH green; static HBRUSH blue; static HBRUSH white; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; LRESULT handleMessage(void *closure, HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { (void)closure; if (msg == WM_CTLCOLORSTATIC) { WORD id = (WORD)GetDlgCtrlID((HWND)lparam); HDC hdcStatic = (HDC)wparam; if (id == ID_LBLHELLO) { SetTextColor(hdcStatic, RGB(0,0,0)); SetBkColor(hdcStatic, RGB(255,0,0)); return (LRESULT)red; } else if (id == ID_LBL2) { SetTextColor(hdcStatic, RGB(0,0,0)); SetBkColor(hdcStatic, RGB(0,255,0)); return (LRESULT)green; } /*else if (id == ID_LBL3) { SetTextColor(hdcStatic, RGB(255,255,255)); SetBkColor(hdcStatic, RGB(0,0,255)); return (LRESULT)blue; } else { SetTextColor(hdcStatic, RGB(0,0,0)); SetBkColor(hdcStatic, RGB(255,255,255)); return (LRESULT)white; }*/ } return ALF_DefWindowProc(hwnd, msg, wparam, lparam); } 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_LBL6, text); ALF_Free(text); } if (control != NULL && sourceid == ID_B4) { HWND combo = ALF_WidgetHwndById(window, ID_COMBO2); ALF_ComboBoxSetCurrentIndex(combo, -1); } if (control != NULL && sourceid == ID_B2) { MessageBox(window, TEXT("Hello World!"), TEXT("Hello"), MB_ICONASTERISK|MB_OK); } if (control != NULL && sourceid == ID_B3) { ALFColor oldcolor = ALF_GetBackgroundColor(window); if (oldcolor == ALF_COLOR_TRANSPARENT) { ALF_SetBackgroundColor(window, ALF_COLOR_SYS(COLOR_BTNFACE)); } else { ALF_SetBackgroundColor(window, ALF_COLOR_TRANSPARENT); } } return 0; } static void handlePaint(void *closure, HWND window, HDC dc, RECT *rcPaint) { (void)closure; ALFColor color = ALF_GetBackgroundColor(window); if (color == ALF_COLOR_TRANSPARENT) { RECT rcClient; GetClientRect(window, &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 { if (rcPaint) { SetBkColor(dc, ALF_ColorToGdi(color)); ExtTextOut(dc, 0, 0, ETO_OPAQUE, rcPaint, TEXT(""), 0, NULL); } else { RECT rcClient; GetClientRect(window, &rcClient); SetBkColor(dc, ALF_ColorToGdi(color)); ExtTextOut(dc, 0, 0, ETO_OPAQUE, &rcClient, TEXT(""), 0, NULL); } } } static void handleWindowPosChanged(void *closure, HWND window, WINDOWPOS *pos) { (void)closure; if (!(pos->flags & SWP_NOSIZE)) { ALFColor bgcolor = ALF_GetBackgroundColor(window); if (bgcolor == ALF_COLOR_TRANSPARENT) ALF_InvalidateBackground(window); } } int CALLBACK #ifdef UNICODE wWinMain #else WinMain #endif (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { (void)hPrevInstance; (void)lpCmdLine; (void)nCmdShow; ALF_SetDpiAwareness(ALF_DPI_AWARENESS_PER_MONITOR_AWARE_V2); red = CreateSolidBrush(RGB(255,0,0)); green = CreateSolidBrush(RGB(0,255,0)); blue = CreateSolidBrush(RGB(0,0,255)); white = CreateSolidBrush(RGB(255,255,255)); if (LOBYTE(LOWORD(GetVersion())) >= 4) { HMODULE hMsimg32 = LoadLibraryA("msimg32.dll"); if (hMsimg32) { *((void**)&fnGradientFill) = (void*)GetProcAddress(hMsimg32, "GradientFill"); } } ALFWindowClassParams cparams; ZeroMemory(&cparams, sizeof(cparams)); //cparams.className = TEXT("DummyClass"); cparams.vtbl.message = handleMessage; cparams.vtbl.command = handleCommand; cparams.vtbl.paint = handlePaint; cparams.vtbl.windowposchanged = handleWindowPosChanged; ALF_Initialize(); LPCTSTR clazz = ALF_RegisterWindowClass(hInstance, &cparams); if (!clazz) MessageBox(0, TEXT("couldn't create window class!"), 0, MB_ICONHAND|MB_OK); HWND win = ALF_InstantiateWindow(hInstance, clazz, NULL, NULL); if (!win) MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); ALF_AddLabel(win, ID_LBL2, 1, 0, TEXT("Hello, 2!\nblub")); HWND hwndLabel = CreateWindow( TEXT("STATIC"), TEXT("Hello World!"), WS_CHILD | WS_VISIBLE | SS_LEFT, 0, 0, 50, 25, win, (HMENU)ID_LBLHELLO, hInstance, NULL); ALF_AddWidget(win, 0, 0, hwndLabel, 5000, 1000, ALF_LAYOUT_INHERITFONT); ALF_AddLabel(win, ID_LBL3, 0, 1, TEXT("Good Morning my &Angel!")); ALF_AddEdit(win, ID_ED1, 1, 1, TEXT("Happy Birthday!")); ALF_AddButton(win, ID_B1, 3, 1, TEXT("&Go Go Go!")); ALF_AddButton(win, ID_B2, 0, 2, TEXT("Oh m&y god,\r\nwho the hell cares?")); ALF_AddLabel(win, ID_LBL4, 0, 3, TEXT("&Editable Combo Box:")); HWND hwndCombo1 = ALF_AddEditableComboBox(win, ID_COMBO1, 1, 3, TEXT("Hello!")); ALF_AddButton(win, ID_B3, 3, 3, TEXT("Change Background")); 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(win, ID_LBL5, 0, 4, TEXT("Selection-Only Combo Box:")); HWND hwndCombo2 = ALF_AddSelectionOnlyComboBox(win, ID_COMBO2, 1, 4); ALF_AddButton(win, ID_B4, 3, 4, TEXT("Lol")); /*HWND b4 = ALF_WidgetAtLayoutPosition(win, 2, 4); ALF_SetWidgetLayoutSize(win, b4, 6427, 0);*/ 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(win, ID_LBL6, 0, 5, TEXT("[ComboBox2 value]")); //ALF_AddWidgetLayoutFlag(win, ALF_WidgetHwndById(win, ID_LBL6), ALF_VEXPAND); //ALF_AddWidgetLayoutFlag(win, ALF_WidgetHwndById(win, ID_B1), ALF_HEXPAND); 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); EnableWindow(ALF_WidgetHwndById(win, ID_BC2), FALSE); HWND hwndTab = ALF_AddNotebook(win, ID_NOTEBOOK, 1, 7); HWND hwndTabPanel1 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 1")); HWND hwndTabPanel2 = ALF_NotebookAddTab(hwndTab, TEXT("Tab 2")); ALF_NotebookAddTab(hwndTab, TEXT("Another tab")); ALF_NotebookAddTab(hwndTab, TEXT("Yet another empty tab")); 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_LayoutSetRowExpandNumerator(win, 7, 1); 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")); HWND l = ALF_AddLabel(win, (WORD)-1, 3, 7, TEXT("Hello There")); SendMessage(l, ALF_WM_LBL_SETSTYLE, 0, ALF_LABEL_ALIGN_HCENTER | ALF_LABEL_ALIGN_VCENTER); ALF_SetDefaultButton(win, ID_B2); ALF_ComboBoxSetText(hwndCombo2, TEXT("Goodbye World!")); ALF_LayoutSetColumnMinSize(win, 2, 825); ALF_LayoutSetColumnExpandNumerator(win, 1, 4); ALF_LayoutSetColumnExpandNumerator(win, 3, 1); EnableWindow(ALF_WidgetHwndById(win, ID_LBL3), FALSE); ALF_ResizeWindow(win, 1, 1); ALF_ShowModal(win); ALF_DestroyWindow(win); ALF_UnregisterWindowClass(hInstance, clazz); ALF_UnInitialize(); return 0; } void _entry(void) { ExitProcess((UINT) #ifdef UNICODE wWinMain #else WinMain #endif (GetModuleHandle(NULL), NULL, GetCommandLine(), SW_SHOW)); }