Overview

Most people know what WndTabs is by now. If you don't, then I suggest
you visit the overview page, which also
highlights the new features in every release.

In general, WndTabs is an add-in for Visual C++ 5/6 and eVC 3 (and to some
extent eVC4 *)
which adds a much needed tab strip to the Visual Studio MDI workspace. The
tabs are much more than a window switching vehicle, exposing many useful file
and window management functions.

A feature tour is also
available online. It is recommended for both new and experienced user!

Version 3.1 Blurbs

The WndTabs source base is quite large (almost 30,000 lines, not including the
extension module) and is too big to cover in one article. Instead, I would
like to focus on the things that were added during the latest release.

The Installer

Though not a programmer topic per se, I wanted to share my experiences in the world of installation.

Versions 3.0x of WndTabs were shipped using an MSI installer I created with InstallShield.
As good or as bad as InstallShield is as a development platform, there is
something that it cannot change, namely MSI, the underlying technology. MSI,
for those who don't know, is Microsoft's installer technology/installation platform. It supports
advanced features such as
install on demand (as you see in Office) and auto-healing as well as the more
trivial installation tasks.

I'll spare you the gorgy details, and go straight to the bottom line: For
small, web based software products, MSI is unsuitable. Here are
some reasons why (in no particular order):

It's buggy. There's no pretty way of saying it. And it's
cryptic. A user can get an error such as "The system
administrator has set policies to prevent the installation" when in
fact there is no such policy. The fix in this case is removing an even
more cryptic registry entry (HKEY_CLASSES_ROOT\Installer\Products\A7AC1985CAF0BB64FB37E18FB2A89724
for WndTabs). That's not good for either you or your users.

Many other bugs exist, and I won't list them all here. If you are curious,
have a look at the installation
FAQ (questions marked as "Versions 3.0x") for some more issues
I frequently had to deal with.

Yet another brain dead feature of MSI is that the user is required to keep
the source installation package in order to uninstall. This is fine if
your product ships on a CD (the installer asks you to pop in the CD, which
is fine). But if you downloaded the installer from the web, then
deleted or moved it (which is a common thing users do), you will not be able
to uninstall the software. On a related note, this issue also
affects "patch" installations.

Minor complaint - authoring anything but the simplest installers is a
nightmare in MSI. This, even with tools like InstallShield at your
side.

As you can guess, the support nightmare eventually drove me to use a different
installer, one which I am much more pleased with. Again, MSI is not
necessarily evil in general, but I suggest that if you choose it as your
installation vehicle, make sure you do your homework and know what you're doing.

User Interface Localization - WndTabs in Multiple Languages

One of the biggest changes in WndTabs 3.10 involved the addition of
localization capabilities. This might not be a big feature for us English speakers
(as end users at least). However, with the increasingly global
economy, many of us will find ourselves with requirements for a multi-lingual user
interface.

First off, I'd like to mention that WndTabs still supports Win9x, so it
doesn't use Unicode (and yes, I know there's a version of Unicode for Win9x, but
I really don't need another support nightmare). A user
downloading a language pack in his/her language would be required to use the
appropriate code page for their language. If your product is intended for
the NT class of operating systems, Unicode is the way to go.

How It's Done

Localization is based mostly on a wonderful little MFC function called AfxSetResourceHandle().
MSDN is a little vague about the usefulness of this function, giving the
following description:

Use this function to set the HINSTANCE
handle that determines where the default resources of the application are
loaded.

In essence, AfxSetResourceHandle() lets you instruct MFC to grab all the
resources from a place other than your main executable/DLL. For instance,
if you have a string table with the following entry:

IDS_WELCOME "Welcome"

You can create a resource DLL (say French.dll) with the following string
table entry

IDS_WELCOME "Bienvenue"

You would then use AfxSetResourceHandle() to grab the French string as
needed:

CString cStr;
cStr.LoadString(IDS_WELCOME); // cStr is now "Welcome"// make the French resources the default resources
AfxSetResourceHandle(AfxLoadLibrary("French.dll"));
cStr.LoadString(IDS_WELCOME); // cStr is now "Bienvenue"

It Gets Better

As I said, MFC will use the specified resource DLL whenever it looks for a
resource. But at least for one resource (strings), it will automatically
"fall-back" to your executable/DLL if it can't find something in the
resource DLL. In our previous example, assume that IDS_WELCOME
wasn't defined in the French DLL. In that case, the final LoadString()
will result in cStr="Welcome" (MFC won't find IDS_WELCOME
in the resource DLL, so it will just grab it from the main resources). Don't
expect this behavior for bitmaps or dialogs though. This is unfortunate,
because it means that (unless you want to spend a lot of time coding around
this), you will need to include all your bitmaps in the language DLLs, even if
they are the same as the bitmaps in the main resources.

Loading Resources Yourself

One last note. If you want to load resources manually after using AfxSetResourceHandle(),
you should use the AfxGetResourceHandle() function to get the
pointer to the active resource DLL.

What Was (and Was Not) Translated

For this release, only the dialogs, menus and string tables were
translated. Any bitmap with English text will still be in English (though
given time, those would be easy to address as well).

One large area that was not addressed was the help file. Translating
the help file would require tremendous effort from the translators. These
are people who volunteer to translate WndTabs into their native language for
nothing more than a thank you (thanks guys!), and I didn't want to drown them in work.
Code changes would also have to be put in place, as I'd have to upgrade my HTML
help subsystem to support multiple help files. I decided that if the
translation packs are a run-off success, that I'd invest time in localized help
file in the next release.

Internet Keyboards

One nice new feature in v3.10 is support for Internet keyboards. These
keyboards feature extra keys such as back, forward, stop etc. Diligent
user Frank Fesevur suggested the feature and was kind enough to send me an MSDN
link. To sum up, these keyboard work through a new message call WM_APPCOMMAND. An enhanced input device will send this message, with the
LPARAM value holding information such which special key was pressed and from
which device the message originated (see the note below). Here is some
sample code for handling this message:

Version 3.10 (June 17, 2002)

New Feature: Support for Internet keyboards for tab cycling and other commands.

New Feature: The middle mouse button can now be mapped to any WndTabs command.

New Feature: Shift+Close button ("X") now does "Close All Except". WndTabsExt

New Feature: Right click on Close button displays a context menu. WndTabsExt

New Feature: Grouping of files from different directories can be constrained to just files from the same project.1WndTabsExt1 The freeware Workspace Whiz! Interface package must be installed for this feature to work.

New Feature: Buttons on grouped tab can now be sorted. WndTabsExt

New Feature: Added new commands for cycling through windows in Tab Order.

Improvement: Grouping of files from different directories is more accurate. WndTabsExt

Improvement: Greatly reduced flickering while single-stepping in the debugger.

Bug Fixed: In rare conditions, some WndTabs commands could cause a crash if activated from a keyboard shortcut.

Bug Fixed: Close button would still work when disabled from options dialog. WndTabsExt

Bug Fixed: Closing a resource tab with the close button ("X") would close all resources. WndTabsExt

Bug Fixed: Better handling of files with an ampersand ("&") in their name.

Note

Make sure to check out the WndTabs web site which is more likely to have updates and betas:http://www.wndtabs.com

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

I have recently upgraded from Windows 7 to Windows 10 and then I got an error.

WndTabs failed to load WndTabsExt.mod and some features are missing now.
Google's result was trying to get you into purchasing all those suspicious tools to fix your registry things.

I looked at the source codes and found that it is simply a AfxLoadLibrary failure. dont know why it will fail only in Windows 10.
Anyway, I simply copy the WndTabsExt.mod from the WndTabs folder into the Windows System32 folder and it works perfectly now.
In case anyone run into this trouble, and I would also like to express my gratitude to the author for creating such a great tools on this opportunity.

Some addins are incompatible with WndTabs, since they fight for the same hooks WndTabs uses to integrate with the editor. If you're running an incompatible addin, you will have to choose between that addin and WndTabs.

Another potential cause for the crash is Numega DriverStudio, which is known to cause WndTabs to crash. Numega never responded to my inquiries related to DriverStudio, so this problem was never fixed.

I am unable to acces the site wndtabs.com and hence unable to download the wndtabs add-in for Visual Studio 6.0. Please guide me on the right website where this has been shifted, if is the case or where else I can download the same

Hi,
I am Visual Assist 10 customer and having licenced version of that add-in.. So, I am using it, now i have installed binaries for wndtabs and done all shortcut keys settings as per my requirement.. Now, when i am opening any project, it shuts down whole visual C++ application automatically.. So, there may be some problem with this product ??

... this is obviously not made when the projets contain more than 10 files or so (IMO). The tabs rendering is rather strange (If you select two rows of tabs, ou can still see five pixels of the third one, and misclick it), it flickers quite a lot, and some of the feature (like putting a cross in the tab to close it) won't work, even if supposed to.

So, I was very enthusiastic about this add-in after having read the first posts and comments, but i'm a bit disappointed now

But, let me congratulate, because besides these minor display effects, the work behind is awesome, and the idea is very handy.

Anyway. Every other IDE I've seen and used has a tabstrip for open files. Why VS6 didn't is beyond me. EXCELLENT Add-in. It's almost stealing, using it as freeware. I'm so registering for the Pro version. Cudos! Looking forward to developments in the SDK, as well.

You did not find the splash screen code in WndTabs because it was moved into the private library.

However, this is easy enough to do:
1. Create a modeless dialog that is a child of the desktop.
2. Start a thread that Sleep()'s for the duration you want, and then posts a WM_CLOSE to the splash dialog.