diff options
Diffstat (limited to 'widgetfactory.cpp')
| -rw-r--r-- | widgetfactory.cpp | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/widgetfactory.cpp b/widgetfactory.cpp index c7f5f8d..060544b 100644 --- a/widgetfactory.cpp +++ b/widgetfactory.cpp @@ -38,7 +38,9 @@ enum { IDM_BACKGROUND_GREEN, IDM_BACKGROUND_BLUE, IDM_PANES, - IDM_PANES__MAX = IDM_PANES + PANE__MAX + IDM_PANES__MAX = IDM_PANES + PANE__MAX, + IDM_MODALDIALOG_PANES, + IDM_MODALDIALOG_PANES__MAX = IDM_MODALDIALOG_PANES + PANE__MAX }; BOOL (WINAPI *fnGradientFill)(HDC, PTRIVERTEX, ULONG, PVOID, ULONG, ULONG) = NULL; @@ -52,6 +54,8 @@ enum PanelBackgroundMode { #define FM_PANEL_SET_BGMODE (ALF_WM_USER + 1) +static void wfModalDialogRun(HWND owner, int pane); + /* common stuff */ typedef struct { DWORD bgmode; @@ -740,6 +744,14 @@ addPaneToNotebook(HWND hwndNotebook, int paneId) g_paneInitTable[paneId](panel); } +static void +handleClose(void *closure, HWND window) +{ + (void)closure; + + ALF_Toplevel_SetModalResult(window, 0); +} + static LRESULT handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, HWND control) { @@ -802,9 +814,67 @@ handleCommand(void *closure, HWND window, WORD notificationcode, WORD sourceid, addPaneToNotebook(nb, paneId); } + if (sourceid >= IDM_MODALDIALOG_PANES && sourceid < IDM_MODALDIALOG_PANES__MAX) { + int paneId = sourceid - IDM_MODALDIALOG_PANES; + wfModalDialogRun(window, paneId); + } + 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_LayoutSetColumnExpandNumerator(dialog, 1, 1); + ALF_LayoutSetRowExpandNumerator(dialog, 1, 1); + ALF_LayoutSetRowMinSize(dialog, 0, 525); + ALF_LayoutSetRowMinSize(dialog, 2, 525); + ALF_LayoutSetColumnMinSize(dialog, 0, 525); + ALF_LayoutSetColumnMinSize(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, + &g_wfModalDialogVtbl, + (void*)(LONG_PTR)pane); + ALF_Toplevel_ShowModal(dlg); + DestroyWindow(dlg); +} + int CALLBACK #ifdef UNICODE wWinMain @@ -827,14 +897,17 @@ WinMain } } + wfModalDialogPrepareVtbl(); + ALFToplevelVTable vtbl; ZeroMemory(&vtbl, sizeof(vtbl)); vtbl.command = handleCommand; + vtbl.close = handleClose; ALF_Initialize(); - HWND win = ALF_CreateToplevelWindow(NULL, &vtbl, NULL); + HWND win = ALF_CreateToplevelWindow(0, WS_OVERLAPPEDWINDOW, NULL, &vtbl, NULL); if (!win) { MessageBox(0, TEXT("couldn't create main window!"), 0, MB_ICONHAND|MB_OK); return 1; @@ -870,12 +943,14 @@ WinMain HMENU mainmenu = CreateMenu(); HMENU filemenu = CreateMenu(); HMENU newtabmn = CreateMenu(); + HMENU modwndmn = 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_SEPARATOR, 0, 0); AppendMenu(filemenu, MF_STRING, IDM_FILE_CLOSE, TEXT("&Close\tAlt+F4")); @@ -892,6 +967,7 @@ WinMain 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]); } SetMenu(win, mainmenu); |
