VBcoders Guest



Don't have an account yet? Register
 


Forgot Password?



Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible !

by T-REX Software (14 Submissions)
Category: Windows API Call/Explanation
Compatability: Visual Basic 3.0
Difficulty: Unknown Difficulty
Originally Published: Wed 24th March 1999
Date Added: Mon 8th February 2021
Rating: (1 Votes)

Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible !

Rate Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible !




Option Explicit

'CTL3D API calls... If you don't have CTL3DV2.DLL, you can delete the V2 and it should
'still work properly.
Declare Function Ctl3dAutoSubclass Lib "Ctl3DV2.DLL" (ByVal hInst As Integer) As Integer
Declare Function Ctl3dRegister Lib "Ctl3DV2.DLL" (ByVal hInst As Integer) As Integer
Declare Function Ctl3dUnregister Lib "Ctl3DV2.DLL" (ByVal hInst As Integer) As Integer
Declare Function Ctl3dSubclassDlgEx Lib "Ctl3DV2.DLL" (ByVal hWnd As Integer, ByVal dFlags As Long) As Integer
Declare Function Ctl3dSubclassCtlEx Lib "Ctl3DV2.DLL" (ByVal hWnd As Integer, ByVal cFlags As Integer) As Integer
Declare Function Ctl3dUnsubclassCtl Lib "Ctl3DV2.DLL" (ByVal hWnd As Integer) As Integer
Declare Function Ctl3DGetVer Lib "Ctl3DV2.DLL" () As Integer


'Other API Calls for the Forms...
Declare Function GetModuleHandle Lib "Kernel" (ByVal ModuleName As String) As Integer
Declare Function GetWindowLong Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Long
Declare Function GetWindowWord Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer) As Integer
Declare Function SetWindowLong Lib "User" (ByVal hWnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As Long) As Long

Global Const FIXED_DOUBLE = 3
Global Const DS_MODALFRAME = &H80&
Global Const GWL_STYLE = (-16)
Global Const GWW_HINSTANCE = (-6)
Global Const CTL3D_ALL = &HFFFF

'Menu API's for adjusting the 3D Dialog box system menu...
Declare Function GetSystemMenu% Lib "User" (ByVal hWnd%, ByVal bRevert%)
Declare Function RemoveMenu% Lib "User" (ByVal hMenu%, ByVal nPosition%, ByVal wFlags%)
Global Const MF_BYPOSITION = &H400

'Some colors for us to use...
Global Const COLOR_BLACK = &H0&
Global Const COLOR_LIGHT_GRAY = &HC0C0C0
Global Const COLOR_DARK_GRAY = &H808080
Global Const COLOR_WHITE = &HFFFFFF

'/* Ctl3d Control ID */
Global Const CTL3D_BUTTON_CTL = 0
Global Const CTL3D_LISTBOX_CTL = 1
Global Const CTL3D_EDIT_CTL = 2
Global Const CTL3D_COMBO_CTL = 3
Global Const CTL3D_STATIC_CTL = 4

'Global Variables to allow for SubClassing Ctrls in our form...
Global gSubClassCtls As Integer
Global gCTL3DMajorVersion As Integer
Global gCTL3DMinorVersion As Integer



'This procedure does a couple of things.
'First, it will attempt to register your application to the CTL3D Program.
'Second, it will attempt to tell you if the system can register 3D Controls
'Only CTL3D Version 2.63 or greater can be used to make VB controls appear 3D
'
'
Function App3DRegister() As Integer

Dim appInst%, suc%

'Really just needed if we can get the CTL3D or CTL3DV2 dll's
On Error GoTo AppRegError

'Do version checking.  This will also let us know if we can't get the dll's
suc% = Ctl3DGetVer()

'If we get a version number then pass check it for control subclass capability
If suc% > 0 Then
    gCTL3DMajorVersion = (suc% And 65100) \ (2 ^ 8)
    gCTL3DMinorVersion = suc% And 255
    If (gCTL3DMajorVersion > 1) And (gCTL3DMinorVersion > 12) Then gSubClassCtls = True
End If

'Get the application instance...
appInst% = GetModuleHandle(App.EXEName)
'Now register the application
suc% = Ctl3dRegister(appInst%)
'Did it register?
If suc% = 0 Then Exit Function

'Now subclass all of the dialog and message boxes for 3D, should work with VB
suc% = Ctl3dAutoSubclass(appInst%)
'We had not problems so tell the app we registered with CTL3D
App3DRegister = True

'In case an error occurred
AppRegError:

End Function

'Before you exit your application, give this procedure a call..
'In this case, I have a procedure called ExitProgram() that allows
'me to do all of my cleanup functions.  This procedure is in there.
'
Sub App3DUnregister()

'Call this just before your application exits..

Dim appInst%, suc%

'Get the application instance again..
appInst% = GetModuleHandle(App.EXEName)

'Now unregister us...
suc% = Ctl3dUnregister(appInst%)

End Sub

'
' ControlIn3D paints a 3D-border around the control given in ctrlTarget.
' nBevel controls the the deepness, nSpace the distance between the control
' and the 3D-border and bInset sets the border to be drawn inset or outset.
'
' Parts of this code are taken from the VB Tips & Tricks help file.
' Original code written by Matej Nastran.
'
'
Sub ComboBoxIn3D(ctrlCombo As Control, nBevel As Integer)
    
    Dim PixelX As Integer, PixelY As Integer
    Dim CTop As Integer, CRight As Integer, CBottom As Integer

    ' Just put "No 3D" in the Tag property and your ComboBox keeps 2D
    If InStr(UCase(ctrlCombo.Tag), "NO 3D") = 0 Then
    
        ControlIn3D ctrlCombo, nBevel, 0, True
    
        If ctrlCombo.Style = 0 Then             'Remove white space only
            PixelX = Screen.TwipsPerPixelX      'if it is a Dropdown ComboBox
            PixelY = Screen.TwipsPerPixelY
            CTop = ctrlCombo.Top
            CRight = ctrlCombo.Left + ctrlCombo.Width
            CBottom = ctrlCombo.Top + ctrlCombo.Height
            ctrlCombo.Parent.Line (CRight - PixelX * 24, CTop)-(CRight - PixelX * 18, CBottom - PixelY), COLOR_LIGHT_GRAY, BF
        End If
    End If

End Sub

'
'
' ControlIn3D paints a 3D-border around the control given in ctrlTarget.
' nBevel controls the the deepness, nSpace the distance between the control
' and the 3D-border and bInset sets the border to be drawn inset or outset.
'
' Parts of this code are taken from the VB Tips & Tricks help file.
' Original code written by Matej Nastran.
'
Sub ControlIn3D(ctrlTarget As Control, nBevel As Integer, nSpace As Integer, bInset As Integer)
    Dim CTop As Integer, CLeft As Integer, CRight As Integer, CBottom As Integer
    Dim PixelX As Integer, PixelY As Integer, AddX As Integer, AddY As Integer
    Dim i As Integer

    ' Just put "No 3D" in the Tag property and your control keeps 2D
    If InStr(UCase(ctrlTarget.Tag), "NO 3D") = 0 Then
        PixelX = Screen.TwipsPerPixelX
        PixelY = Screen.TwipsPerPixelY
        CTop = ctrlTarget.Top - PixelY
        CLeft = ctrlTarget.Left - PixelX
        CRight = ctrlTarget.Left + ctrlTarget.Width
        CBottom = ctrlTarget.Top + ctrlTarget.Height
        If bInset Then          ' Draw border inset
            For i = nSpace To (nBevel + nSpace - 1)
            AddX = i * PixelX: AddY = i * PixelY
            ctrlTarget.Parent.Line (CLeft - AddX, CTop - AddY)-(CRight + AddX, CTop - AddY), COLOR_DARK_GRAY
            ctrlTarget.Parent.Line (CLeft - AddX, CTop - AddY)-(CLeft - AddX, CBottom + AddY), COLOR_DARK_GRAY
            ctrlTarget.Parent.Line (CLeft - AddX, CBottom + AddY)-(CRight + AddX + PixelX, CBottom + AddY), COLOR_WHITE
            ctrlTarget.Parent.Line (CRight + AddX, CTop - AddY)-(CRight + AddX, CBottom + AddY), COLOR_WHITE
            Next i
        Else                    ' Draw border outset
            For i = nSpace To (nBevel + nSpace - 1)
            AddX = i * PixelX: AddY = i * PixelY
            ctrlTarget.Parent.Line (CRight + AddX, CBottom + AddY)-(CRight + AddX, CTop - AddY), COLOR_DARK_GRAY
            ctrlTarget.Parent.Line (CRight + AddX, CBottom + AddY)-(CLeft - AddX, CBottom + AddY), COLOR_DARK_GRAY
            ctrlTarget.Parent.Line (CRight + AddX, CTop - AddY)-(CLeft - AddX - PixelX, CTop - AddY), COLOR_WHITE
            ctrlTarget.Parent.Line (CLeft - AddX, CBottom + AddY)-(CLeft - AddX, CTop - AddY), COLOR_WHITE
            Next i
        End If
    End If

End Sub

'This procedure modifies the menu for the dialog box.
'In order for this to work correctly, the form must have the MinButton and MaxButton set
'to false if you leave the ControlBox property set to true.  Otherwise, Restore, Maximize, and
'Minimize will stay on...
'
Sub DlgSysMenu(fm As Form)

Dim hSysMenu%, suc%

' Obtain the handle to the forms System menu
hSysMenu% = GetSystemMenu(fm.hWnd, False)

' Remove all but the MOVE and CLOSE options.  The menu items
' must be removed starting with the last menu item.
'
suc% = RemoveMenu(hSysMenu, 8, MF_BYPOSITION) 'Switch to
suc% = RemoveMenu(hSysMenu, 7, MF_BYPOSITION) 'Separator
suc% = RemoveMenu(hSysMenu, 5, MF_BYPOSITION) 'Separator


End Sub

'
' FormIn3D paints a 3D-border around controls on the given Form frmTarget.
' nBevel controls the the deepness of the 3D-border.
'
' Controls that are affected:
'       TextBox         ListBox         ComboBox
'       DriveListBox    DirListBox      FileListBox
'       Line
'       ... (list can be easly expanded)
'
' Just put "No 3D" in the Tag property of a specific control or the form
' itself and it is not painted in 3D.
'
' Call this function from your forms Paint-event.
'
' Parts of this code are taken from the VB Tips & Tricks help file.
' Original code written by Matej Nastran.
'
' Modifications from original source:  bBlaster was removed because it wasn't
' necessary for this file.
'
Sub FormIn3D(frmTarget As Form, nBevel As Integer)
    Dim DrawWidthOld As Integer, ScaleModeOld As Integer
    Dim i As Integer, Ret As Integer
    Dim ctrlTarget As Control
    Static bBusy As Integer
    

    If bBusy Then Exit Sub          'Got some DoEvents. Just in case...
    bBusy = True

    DrawWidthOld = frmTarget.DrawWidth
    frmTarget.DrawWidth = 1
    ScaleModeOld = frmTarget.ScaleMode
    frmTarget.ScaleMode = 1     'Twips

    DoEvents
    
    'Loop controls
    For i = 0 To (frmTarget.Controls.Count - 1)
    Set ctrlTarget = frmTarget.Controls(i)
    If TypeOf ctrlTarget Is TextBox Then ControlIn3D ctrlTarget, nBevel, 0, True
    If TypeOf ctrlTarget Is ListBox Then ControlIn3D ctrlTarget, nBevel, 0, True
    If TypeOf ctrlTarget Is ComboBox Then   'ComboBoxes are special
        ComboBoxIn3D ctrlTarget, nBevel
    End If
    If TypeOf ctrlTarget Is DriveListBox Then ControlIn3D ctrlTarget, nBevel, 0, True
    If TypeOf ctrlTarget Is DirListBox Then ControlIn3D ctrlTarget, nBevel, 0, True
    If TypeOf ctrlTarget Is FileListBox Then ControlIn3D ctrlTarget, nBevel, 0, True
    If TypeOf ctrlTarget Is Line Then       'Lines are also special
        LineIn3D ctrlTarget
    End If
    If TypeOf ctrlTarget Is Label Then ControlIn3D ctrlTarget, nBevel, 0, True
    Next i
    
    frmTarget.DrawWidth = DrawWidthOld      'Always restore what you change
    frmTarget.ScaleMode = ScaleModeOld

    bBusy = False

End Sub

'This procedure makes my dialog box appear 3D.
'
'This snippet of code was taken by a submission from
'RANDRIAMBOLOLONA Roland H. - Compuserve ID - 100331,2516
'
'He says he got some of it from the MARCH '95 VBPJ  Code Listing - TIPS.TXT
'
'This procedure was not commented, I am just telling you where I got the source
'for this because it works very well...
'
'This procedure modifies the menu for the dialog box.
' This procedure makes the VB form appear as a dialog box for CTL3D to read
' and paint it...
'
Sub FormToDialog(frm As Form)

    Dim hWnd As Integer
    Dim iResult As Integer
    Dim lStyle As Long

    hWnd = frm.hWnd
    If frm.BorderStyle = FIXED_DOUBLE Then
        frm.BackColor = COLOR_LIGHT_GRAY
        lStyle = GetWindowLong(hWnd, GWL_STYLE)
        lStyle = lStyle Or DS_MODALFRAME
        lStyle = SetWindowLong(hWnd, GWL_STYLE, lStyle)
        iResult = Ctl3dSubclassDlgEx(hWnd, &H0)
    End If

End Sub

'
' LineIn3D paints the given Line-control ctrlLine in 3D.
' frmTarget is the Form containing that Line.
'
' Parts of this code are taken from the VB Tips & Tricks help file.
' Original code written by Matej Nastran.
'
Sub LineIn3D(ctrlLine As Control)

    If InStr(UCase(ctrlLine.Tag), "NO 3D") = 0 Then
    ctrlLine.BorderColor = COLOR_DARK_GRAY
    'Check if line is vertical or horizontal
    If Abs(ctrlLine.X2 - ctrlLine.X1) > Abs(ctrlLine.Y2 - ctrlLine.Y1) Then
        ctrlLine.Parent.Line (ctrlLine.X1, ctrlLine.Y1 + Screen.TwipsPerPixelY)-(ctrlLine.X2, ctrlLine.Y2 + Screen.TwipsPerPixelY), COLOR_WHITE
    Else
        ctrlLine.Parent.Line (ctrlLine.X1 + Screen.TwipsPerPixelX, ctrlLine.Y1)-(ctrlLine.X2 + Screen.TwipsPerPixelX, ctrlLine.Y2), COLOR_WHITE
    End If
    End If

End Sub

'Make3DDlg
'Call this procedure in a forms Form_Load event to register the form
'as a 3D Dialog.  This procedure calls the appropriate subprocedures
'in making the Dialog 3D
'
Sub Make3DDlg(dlgfrm As Form)

'Set the dlg forms attributes for CTL3D to paint it..
FormToDialog dlgfrm

'Now make the system menu for the form to show only Move and Close.
'NOTE:  You must set the MinButton and MaxButton properties to False.
'The ControlBox property being set to False will have no effect on
'this procedure.
DlgSysMenu dlgfrm

'Turn all of the controls 3D. If you have the wrong version, MakeDlgCtrls will not
'register the controls because the API call isn't there.
'If the CTL3D is too old, then place the following code in each dialogs Form_Paint event
'   FormIn3D Me, 1
'
If gSubClassCtls Then MakeDlgCtrls3D dlgfrm

End Sub

' This procedure cycles through the controls in the form and then
' attempts to subclass them for 3D effects.  Because the controls in VB
' are all class Thunder, CTL3D can't see them as they are so we force
' it to say "Hey, Paint me 3D!"
'
' You can add other controls to this list as long as they match the
' specification on them.
'
'
'
'
Sub MakeDlgCtrls3D(dlgfrm As Form)

Dim i As Integer
Dim ctrl As Control

If Not gSubClassCtls Then Exit Sub

For i = 0 To (dlgfrm.Controls.Count - 1)
    Set ctrl = dlgfrm.Controls(i)
    If TypeOf ctrl Is TextBox Then Reg3DCtrl ctrl, CTL3D_EDIT_CTL
    If TypeOf ctrl Is ListBox Then Reg3DCtrl ctrl, CTL3D_LISTBOX_CTL
    If TypeOf ctrl Is ComboBox Then Reg3DCtrl ctrl, CTL3D_COMBO_CTL
    If TypeOf ctrl Is DriveListBox Then Reg3DCtrl ctrl, CTL3D_COMBO_CTL
    If TypeOf ctrl Is DirListBox Then Reg3DCtrl ctrl, CTL3D_LISTBOX_CTL
    If TypeOf ctrl Is FileListBox Then Reg3DCtrl ctrl, CTL3D_LISTBOX_CTL
    If TypeOf ctrl Is CheckBox Then Reg3DCtrl ctrl, CTL3D_BUTTON_CTL
    If TypeOf ctrl Is OptionButton Then Reg3DCtrl ctrl, CTL3D_BUTTON_CTL
Next i

dlgfrm.Refresh

End Sub

'  Used to register a control for 3D by CTL3D.  Does not have to be
'  a dialog form to have it painted 3D
'
'
Sub Reg3DCtrl(ctrl As Control, ctrltype As Integer)

Dim suc%

suc% = Ctl3dSubclassCtlEx(ctrl.hWnd, ctrltype)

End Sub

'  This unregisters controls from the dialog or whatever form.  Use this
'  as a cleanup method so as not to corrupt CTL3D or waste resources.
'  Called from the Form_Unload procedure
'
Sub Undo3DCtrls(frm As Form)

Dim i As Integer
Dim ctrl As Control


If Not gSubClassCtls Then Exit Sub

For i = 0 To (frm.Controls.Count - 1)
    Set ctrl = frm.Controls(i)
    If TypeOf ctrl Is TextBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is ListBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is ComboBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is DriveListBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is DirListBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is FileListBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is CheckBox Then UnReg3DCtrl ctrl
    If TypeOf ctrl Is OptionButton Then UnReg3DCtrl ctrl
Next i


End Sub

'  Call this procedure to unregister your controls
'  If you call the Reg3DCtrl procedure, call this one
'  in the Form_Unload event for the form.
'
'
Sub UnReg3DCtrl(ctrl As Control)

Dim suc%

suc% = Ctl3dUnsubclassCtl(ctrl.hWnd)


End Sub



Download this snippet    Add to My Saved Code

Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible ! Comments

No comments have been posted about Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible !. Why not be the first to post a comment about Ever wanted to use CTL3D.DLL in your Visual Basic applications, well now it's possible !.

Post your comment

Subject:
Message:
0/1000 characters