Help Center

CWindow.Popup windowsmethod

WindowsmethodCWindow.incdoc-orphan
No implementation located. This member is documented, but the source scan found no matching declaration. It is likely declared in a header this scan does not resolve, or provided by a macro.

Description

To create a popup window you simply create a new instance of the CWindow class and, in the Create method, you make it child of the main window and use the WS_POPUPWINDOW style.

The window created this way is modeless. To make it modal, we need to disable the parent window:

When the popup dialog is closed, we need to enable the parent window:

Examples

DIM pWindow AS CWindow pWindow.Create(hParent, "Popup window", @PopupWndProc, , , , , _ WS_VISIBLE OR WS_CAPTION OR WS_POPUPWINDOW OR WS_THICKFRAME, WS_EX_WINDOWEDGE)

CASE WM_CREATE EnableWindow GetParent(hwnd), FALSE

CASE WM_CLOSE ' // Enables parent window keeping parent's zorder EnableWindow GetParent(hwnd), CTRUE

#INCLUDE ONCE "windows.bi" #INCLUDE ONCE "AfxNova/CWindow.inc" USING AfxNova

CONST IDC_POPUP = 1001

DECLARE FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _

BYVAL hPrevInstance AS HINSTANCE, _
                       BYVAL pwszCmdLine AS WSTRING PTR, _
                       BYVAL nCmdShow AS LONG) AS LONG

END wWinMain(GetModuleHandleW(NULL), NULL, WCOMMAND(), SW_NORMAL)

DECLARE FUNCTION WndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT DECLARE FUNCTION PopupWindow (BYVAL hParent AS HWND) AS LONG DECLARE FUNCTION PopupWndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

' ======================================================================================== ' Main ' ======================================================================================== FUNCTION wWinMain (BYVAL hInstance AS HINSTANCE, _

BYVAL hPrevInstance AS HINSTANCE, _
               BYVAL pwszCmdLine AS WSTRING PTR, _
               BYVAL nCmdShow AS LONG) AS LONG

' // Set process DPI aware SetProcessDpiAwareness(PROCESS_SYSTEM_DPI_AWARE)

DIM pWindow AS CWindow pWindow.Create(NULL, "CWindow with a popup window", @WndProc) pWindow.SetClientSize(500, 320) pWindow.Center

' // Add a button pWindow.AddControl("Button", pWindow.hWindow, IDC_POPUP, "&Popup", 350, 250, 75, 23)

FUNCTION = pWindow.DoEvents(nCmdShow)

END FUNCTION ' ========================================================================================

' ======================================================================================== ' Window procedure ' ======================================================================================== FUNCTION WndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

SELECT CASE uMsg

CASE WM_CREATE
     EXIT FUNCTION

  CASE WM_COMMAND
     ' // If ESC key pressed, close the application sending an WM_CLOSE message
     SELECT CASE LOWORD(wParam)
        CASE IDCANCEL
           IF HIWORD(wParam) = BN_CLICKED THEN
              SendMessageW hwnd, WM_CLOSE, 0, 0
              EXIT FUNCTION
           END IF
        CASE IDC_POPUP
           IF HIWORD(wParam) = BN_CLICKED THEN
              PopupWindow(hwnd)
              EXIT FUNCTION
           END IF
     END SELECT

CASE WM_DESTROY

PostQuitMessage(0)
     EXIT FUNCTION

END SELECT

FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)

END FUNCTION ' ========================================================================================

' ======================================================================================== ' Popup window procedure ' ======================================================================================== FUNCTION PopupWindow (BYVAL hParent AS HWND) AS LONG

DIM pWindow AS CWindow pWindow.Create(hParent, "Popup window", @PopupWndProc, , , , , _

WS_VISIBLE OR WS_CAPTION OR WS_POPUPWINDOW OR WS_THICKFRAME, WS_EX_WINDOWEDGE)

pWindow.Brush = GetStockObject(WHITE_BRUSH) pWindow.SetClientSize(300, 200) pWindow.Center(pWindow.hWindow, hParent) ' / Process Windows messages FUNCTION = pWindow.DoEvents

END FUNCTION ' ========================================================================================

' ======================================================================================== ' Popup window procedure ' ======================================================================================== FUNCTION PopupWndProc (BYVAL hWnd AS HWND, BYVAL uMsg AS UINT, BYVAL wParam AS WPARAM, BYVAL lParam AS LPARAM) AS LRESULT

DIM hOldFont AS HFONT STATIC hNewFont AS HFONT

SELECT CASE uMsg

CASE WM_CREATE
     ' // Get a pointer to the CWindow class from the CREATESTRUCT structure
     DIM pCreateStruct AS CREATESTRUCT PTR = CAST(CREATESTRUCT PTR, lParam)
     DIM pWindow AS CWindow PTR = CAST(CWindow PTR, pCreateStruct->lpCreateParams)
     ' // Create a new font scaled according the DPI ratio
     IF pWindow->DPI <> 96 THEN hNewFont = pWindow->CreateFont("Tahoma", 9)
     ' Disable parent window to make popup window modal
     EnableWindow GetParent(hwnd), FALSE
     EXIT FUNCTION

  CASE WM_COMMAND
     SELECT CASE LOWORD(wParam)
        ' // If ESC key pressed, close the application sending an WM_CLOSE message
        CASE IDCANCEL
           IF HIWORD(wParam) = BN_CLICKED THEN
              SendMessageW hwnd, WM_CLOSE, 0, 0
              EXIT FUNCTION
           END IF
     END SELECT

  CASE WM_PAINT

DIM rc AS RECT, ps AS PAINTSTRUCT, hDC AS HANDLE

hDC = BeginPaint(hWnd, @ps)
     IF hNewFont THEN hOldFont = CAST(HFONT, SelectObject(hDC, CAST(HGDIOBJ, hNewFont)))
     GetClientRect(hWnd, @rc)
     DrawTextW(hDC, "Hello, World!", -1, @rc, DT_SINGLELINE or DT_CENTER or DT_VCENTER)
     IF hNewFont THEN SelectObject(hDC, CAST(HGDIOBJ, CAST(HFONT, hOldFont)))
     EndPaint(hWnd, @ps)
     EXIT FUNCTION

  CASE WM_CLOSE
     ' // Enables parent window keeping parent's zorder
     EnableWindow GetParent(hwnd), CTRUE
     ' // Don't exit; let DefWindowProcW perform the default action

CASE WM_DESTROY

' // Destroy the new font
     IF hNewFont THEN DeleteObject(CAST(HGDIOBJ, hNewFont))
     ' // End the application by sending an WM_QUIT message
     PostQuitMessage(0)
     EXIT FUNCTION

END SELECT

FUNCTION = DefWindowProcW(hWnd, uMsg, wParam, lParam)

END FUNCTION ' ========================================================================================

' / Process Windows messages FUNCTION = pWindow.DoEvents

DIM hWndPopUp AS HWND = pWindow.hWindow DIM uMsg AS tagMsg DO IF PeekMessageW(@uMsg, NULL, 0, 0, PM_REMOVE) THEN

IF IsDialogMessageW(hWndPopUp, @uMsg) = 0 THEN
     TranslateMessage @uMsg
     DispatchMessage @uMsg
  END IF

END IF LOOP WHILE IsWindow(hWndPopUp) FUNCTION = uMsg.wParam

Reference

  • Include file CWindow.inc
  • Documented in Windows/Windows GUI/CWindow Class.md
  • Topic: CWindow Class