• Welcome to Powerbasic Museum 2020-B.
 

News:

Forum in repository mode. No new members allowed.

Main Menu

CreateDDW (show me the code)

Started by Patrice Terrier, June 26, 2009, 03:00:00 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Patrice Terrier

Extended DDW

You probably like the WinDev exclusive DDW feature, however it has some limitations:
1 - It works only with native WinDev controls.
2 - It relies on the graphic card configuration and on the processor speed.
3 - It doesn't work with DirectX nor with OpenGL.

The CreateDDW below has no limitation, however it must be used only on true 32-bit or 64-bit OS (W2K, XP, VISTA, Windows 7).
It is based on direct call to the low level API, and uses the layerd window extended style.
It could be used with any third party addons as well as with 3D graphics using DirectX or OpenGL.



CONSTANT
  CS_VREDRAW        = 1
  CS_HREDRAW        = 2
  WM_SETCURSOR      = 32
  IDC_WAIT          = 32514
  WS_EX_TOOLWINDOW  = 128
  WS_POPUP          = -2147483648
  WS_DISABLED       = 134217728
  WS_EX_LAYERED     = 524288
  GWL_EXSTYLE       = -20
  LWA_ALPHA         = 2
END



WNDCLASSEX is structure
  cbSize        is unsigned int //Type C : UINT
  style         is unsigned int //Type C : UINT
  lpfnWndProc   is int      //Type C : WNDPROC
  cbClsExtra    is int      //Type C : int
  cbWndExtra    is int      //Type C : int
  hInstance     is int      //Type C : HINSTANCE
  hIcon         is int      //Type C : HICON
  hCursor       is int      //Type C : HCURSOR
  hbrBackground is int      //Type C : HBRUSH
  lpszMenuName  is int      //Type C : LPCSTR
  lpszClassName is int      //Type C : LPCSTR
  hIconSm       is int      //Type C : HICON
END



FUNCTION GetWindowRgn(LOCAL nX is int, LOCAL nY is int, LOCAL nhWnd is int)
nRet, nRgn, n1, n2, n3, n4 are int = 0
nRgn = API("GDI32", "CreateRectRgn", n1, n2, n3, n4)
IF API("USER32", "GetWindowRgn", nhWnd, nRgn) THEN
  IF API("GDI32", "OffsetRgn", nRgn, nX, nY) THEN nRet = nRgn
END
RESULT nRet



FUNCTION DDWproc(LOCAL nhWnd is int, LOCAL nMsg is int, LOCAL nwParam is int, LOCAL nlParam is int)
nRet is int
IF nMsg = WM_SETCURSOR THEN
  API("USER32", "SetCursor", API("USER32", "LoadCursorA", Null, IDC_WAIT))
  nRet = 1
ELSE
  nRet = API("USER32", "DefWindowProcA", nhWnd, nMsg, nwParam, nlParam)
END
RESULT nRet



FUNCTION RegisterDDWclass()
wc is WNDCLASSEX
zClass is string ASCIIZ on 16 = "DDWINDOWEX"
wcStyle is int = CS_HREDRAW + CS_VREDRAW
wc:cbSize = Dimension(wc)
IsInitialized is int = API("USER32.DLL", "GetClassInfoExA", Instance, &zClass, &wc)
IF IsInitialized    = 0 THEN
  wc:style         = wcStyle
  wc:lpfnWndProc   = &DDWproc
  wc:cbClsExtra    = 0
  wc:cbWndExtra    = 0 // Extend_cbWndExtra * 4
  wc:hInstance     = Instance
  wc:hIcon         = Null
  wc:hCursor       = API("USER32", "LoadCursorA", Null, IDC_WAIT)
  wc:hbrBackground = API("GDI32", "GetStockObject", 4) // BlackBrush
  wc:lpszMenuName  = Null
  wc:lpszClassName = &zClass
  wc:hIconSm       = Null
  IF API("USER32.DLL", "RegisterClassExA", &wc) THEN IsInitialized = True
END
RESULT IsInitialized



FUNCTION IsOsNT()
nRet is int
sVersion is string = SysWindowsVersion()
IF sVersion = "NT 5" THEN sVersion = "0"
// Check the OS before to apply the shadow effect
IF StringCount("0XV2", Left(sVersion, 1)) THEN nRet = -1 // 2000, XP, 2003, VISTA
RESULT nRet



FUNCTION GetWindowLong(LOCAL nHandle is int, LOCAL nIndex is int)
nRet is int = API("USER32", "GetWindowLongA", nHandle, nIndex)
RESULT nRet



FUNCTION SetWindowLong(LOCAL nHandle is int, LOCAL nIndex is int, LOCAL nNewValue is int)
nRet is int = API("USER32", "SetWindowLongA", nHandle, nIndex, nNewValue)
RESULT nRet



FUNCTION SetLayeredWindowAttributes(LOCAL nHandle is int, LOCAL nAlpha is 1-byte unsigned int)
nRet, nBlackColor, nUseStyle are int
IF IsOsNT THEN
 nBlackColor = 0
 nUseStyle = BinaryOR(GetWindowLong(nHandle, GWL_EXSTYLE), WS_EX_LAYERED)
 SetWindowLong(nHandle, GWL_EXSTYLE, nUseStyle)
 nRet = API("USER32", "SetLayeredWindowAttributes", nHandle, nBlackColor, nAlpha, LWA_ALPHA)
END
RESULT nRet



FUNCTION CreateDDW(LOCAL nParent is int)
nDDW, nUseStyle are is int
stRW is RECT
IF RegisterDDWclass() THEN
  IF nParent <> 0 THEN
     nUseStyle = BinaryOR(WS_POPUP, WS_DISABLED)
     nDDW = API("USER32","CreateWindowExA", ...
     WS_EX_TOOLWINDOW, ... // SDK extended style
     "DDWINDOWEX",...      // The unique class name
     "", ...               // Caption
     nUseStyle, ...        // SDK style
     0, ...                // X location
     0, ...                // Y location
     0, ...                // Control width
     0, ...                // Control height
     nParent, ...          // Parent handle
     0, ...                // Control ID
     Instance, ...         // Instance
     0)
     IF nDDW THEN
        SetLayeredWindowAttributes(nDDW, 132)
        // Get the region of the parent window.
        nRgn is int = GetWindowRgn(0, 0, nParent)
        // Assign same region shape to our DDW window.
        nRet is int = API("USER32", "SetWindowRgn", nDDW, nRgn, 0)
        API("USER32", "GetWindowRect", nParent, &stRW)
        // Setup the good size for our DDW window.
        API("USER32", "SetWindowPos", nDDW, nParent, stRW:nLeft, stRW:nTop, stRW:nRight, stRW:nBottom, SWP_NOACTIVATE)
        API("USER32", "ShowWindow", nDDW, SW_SHOW)
     END
  END
END
RESULT nDDW



PROCEDURE DestroyDDW(nDDW is int)
IF nDDW THEN API("USER32", "DestroyWindow", nDDW); nDDW = 0


To use it, call CreateDDW before to open the child popup, then call DestroyDDW once done.
MyWindow..Handle is the handle of the parent window that should be grayed.

Syntax example:

nDDW is int = CreateDDW(MyWindow..Handle)
  Open("MyChildPopupWindow")
DestroyDDW(nDDW)

Patrice Terrier
GDImage (advanced graphic addon)
http://www.zapsolution.com