Hi,
I've just started looking to test what can be displayed in the title bar and I am finding that I am getting additional numbers with brackets after at the end of the information I want displayed. I'm running dual screens and the Left monitor by default has a (1) in the title bar and the right a (2). Now I'm getting (1) (2) (1) on the left and (1) (2) (1) (2) on the right but I cant figure out why these are appearing. I would prefer that none were visible at all if possible. The code I have been using is :
Public Sub hooks_OnDesignFileOpened(ByVal fileName As String) Dim UsersName As String Dim FullPath As String Const str_USTN_USERNAME As String = "$(_USTN_USERNAME)" Const str_DGNFILE As String = "$(_DGNFILE)" UsersName = ActiveWorkspace.ExpandConfigurationVariable(str_USTN_USERNAME) FullPath = ActiveWorkspace.ExpandConfigurationVariable(str_DGNFILE) Application.Caption = FullPath & " : " & UsersName & " : " Debug.Print "Application.Caption"End Sub
In addition to this:
Thanks
Thanks Jon
I did as you said and sure enough the monitor titles do change to Screen 0 and Screen 1.
So I've now tried to get this to load each time I open a file so I've merged Fu's code with some of my former code so its now all in a single Code Module and looks like:
Option ExplicitPrivate m_oOpenClose As clsOpenClose' ---------------------------------------------------------------------Const strMODULE_NAME As String = "modMain"Declare Function mdlNativeWindow_getMainHandle Lib "stdmdlbltin.dll" (ByVal iScreen As Long) As LongDeclare Function SetWindowTextA Lib "user32.dll" (ByVal hwnd As Long, ByVal lpString As String) As BooleanSub SetDualScreenAppTitle(iScreen As Long, title As String) Dim winHandle As Long winHandle = mdlNativeWindow_getMainHandle(iScreen) SetWindowTextA winHandle, titleEnd SubPublic Sub OnProjectLoad() Set m_oOpenClose = New clsOpenClose Dim UsersName As String Dim File As String Const strUsers_Full_Name As String = "$(_FullName)" Const str_DGNFILE As String = "$(_DGNFILE)" UsersName = ActiveWorkspace.ExpandConfigurationVariable(strUsers_Full_Name) File = ActiveWorkspace.ExpandConfigurationVariable(str_DGNFILE) SetDualScreenAppTitle 0, File SetDualScreenAppTitle 1, "Current User: " & UsersName & " - Todays Date: " & DateEnd Sub
The problem is that its not changing the title automatically as it was previously. If I run it manually it does work so I can't understand why its not working when I open a drawing but then again I know nothing about VBA so I'm probably making an obvious error.
Also, I've been trying to understand IModelActivateEvents as per Roberts suggestion. Can you script it so that the same code used in the openclose class is run each time a model change is activated? The end result I want is a custom title bar that remains visible in all models.
Hi I3loom,
I think when the macro OnProjectLoad is executing, the MicroStation's main window has not been initialized.
You can solve this probelm by following way:
1. Desgin a simple MDL application as a initapp.
2. In this MDL application, you send a command to the end of MicroStation's input queue, thus give MicroStation a chance to initialize and complete its start.
3. In this command function, you load your VBA project.
HTH, Yongan.Fu
Hi and thanks.
That all sounds very simple however I have zero programming experience and I have no idea how to go about creating an MDL app. I've just browsed through some MDL code examples in the programming wiki and it looks very confusing to someone not familiar with MDL.
Is there documentation provided that is suitable for someone in my position (basically MDL for dummies?) that explains the how to go about creating an MDL application i.e. well written example code that it fully explained similar to what Microsoft's Hey, Scripting Guy blog does so that someone trying to learn isn't going to be confused by the subject?
or
Is the documention provided by Bentley geared towards people who are familiar with programming?
If there's not then it likely I'm going to have to forget this entirely.
If you don't familiar with MDL, forget it although you can learn it after you install MicroStation SDK (can download this SDK from SELECTServices). The following way maybe a good choice for you--hooking MicroStation's new EnterIdle event to set the dual screen application title. And after using this, you don't need to hook ModelActivateEvent anymore.
1. Your code module is as below:
Declare Function mdlNativeWindow_getMainHandle Lib "stdmdlbltin.dll" (ByVal iScreen As Long) As LongDeclare Function SetWindowTextA Lib "user32.dll" (ByVal hwnd As Long, ByVal lpString As String) As BooleanSub SetDualScreenAppTitle(iScreen As Long, title As String) Dim winHandle As Long winHandle = mdlNativeWindow_getMainHandle(iScreen) SetWindowTextA winHandle, titleEnd SubSub OnProjectLoad() AddEnterIdleEventHandler New clsEnterIdleEnd Sub
2. Your class module is as below: (NOTE, the class name must be 'clsEnterIdle')
Implements IEnterIdleEventPrivate Sub IEnterIdleEvent_EnterIdle(ByVal Reserved As Long) SetDualScreenAppTitle 0, "Screen 0" SetDualScreenAppTitle 1, "Screen 1"End SubHTH, Yongan.Fu
Implements IEnterIdleEventPrivate Sub IEnterIdleEvent_EnterIdle(ByVal Reserved As Long) SetDualScreenAppTitle 0, "Screen 0" SetDualScreenAppTitle 1, "Screen 1"End Sub
Unknown said: The following way maybe a good choice for you--hooking MicroStation's new EnterIdle event.
Thanks for pointing that out. The EnterIdle event crept stealthily into the V8i API. It's helpful to have someone point out new features!
Regards, Jon Summers LA Solutions
Wow many thanks Fu, that solution works perfectly.