Microsoft Visual C++ is two complete Windows application development systems in one product. If you so choose, you can develop C-language Windows programs using only the Win32 API. C-language Win32 programming is described in Charles Petzold's book Programming Windows 95 (Microsoft Press, 1996). You can use many Visual C++ tools, including the resource editors, to make low-level Win32 programming easier.
Visual C++ also includes the ActiveX Template Library (ATL), which you can use to develop ActiveX controls for the Internet. ATL programming is neither Win32 C-language programming nor MFC programming, and it's complex enough to deserve its own book.
This book is not about C-language Win32 programming or ATL programming (although Chapter 29 and Chapter 30 provide an introduction to ATL). It's about C++ programming within the MFC library application framework that's part of Visual C++. You'll be using the C++ classes documented in the Microsoft Visual C++ MFC Library Reference (Microsoft Press, 1997), and you'll also be using application framework-specific Visual C++ tools such as AppWizard and ClassWizard.
Use of the MFC library programming interface doesn't cut you off from the Win32 functions. In fact, you'll almost always need some direct Win32 calls in your MFC library programs.
A quick run-through of the Visual C++ components will help you get your bearings before you zero in on the application framework. Figure 1-1 shows an overview of the Visual C++ application build process.
Figure 1-1. The Visual C++ application build process.
Microsoft Visual C++ 6.0 and the Build Process
Visual Studio 6.0 is a suite of developer tools that includes Visual C++ 6.0. The Visual C++ IDE is shared by several tools including Microsoft Visual J++. The IDE has come a long way from the original Visual Workbench, which was based on QuickC for Windows. Docking windows, configurable toolbars, plus a customizable editor that runs macros, are now part of Visual Studio. The online help system (now integrated with the MSDN Library viewer) works like a Web browser. Figure 1-2 shows Visual C++ 6.0 in action.
Figure 1-2. Visual C++ 6.0 windows.
If you've used earlier versions of Visual C++ or another vendor's IDE, you already understand how Visual C++ 6.0 operates. But if you're new to IDEs, you'll need to know what a project is. A project is a collection of interrelated source files that are compiled and linked to make up an executable Windows-based program or a DLL. Source files for each project are generally stored in a separate subdirectory. A project depends on many files outside the project subdirectory too, such as include files and library files.
Experienced programmers are familiar with makefiles. A makefile stores compiler and linker options and expresses all the interrelationships among source files. (A source code file needs specific include files, an executable file requires certain object modules and libraries, and so forth.) A make program reads the makefile and then invokes the compiler, assembler, resource compiler, and linker to produce the final output, which is generally an executable file. The make program uses built-in inference rules that tell it, for example, to invoke the compiler to generate an OBJ file from a specified CPP file.
In a Visual C++ 6.0 project, there is no makefile (with an MAK extension) unless you tell the system to export one. A text-format project file (with a DSP extension) serves the same purpose. A separate text-format workspace file (with a DSW extension) has an entry for each project in the workspace. It's possible to have multiple projects in a workspace, but all the examples in this book have just one project per workspace. To work on an existing project, you tell Visual C++ to open the DSW file and then you can edit and build the project.
Visual C++ creates some intermediate files too. The following table lists the files that Visual C++ generates in the workspace.
|BSC||Browser information file|
|OPT||Holds workspace configuration|
|PLG||Builds log file|
* Do not delete or edit in a text editor.
The Resource EditorsWorkspace ResourceView
When you click on the ResourceView tab in the Visual C++ Workspace window, you can select a resource for editing. The main window hosts a resource editor appropriate for the resource type. The window can also host a wysiwyg editor for menus and a powerful graphical editor for dialog boxes, and it includes tools for editing icons, bitmaps, and strings. The dialog editor allows you to insert ActiveX controls in addition to standard Windows controls and the new Windows common controls (which have been further extended in Visual C++ 6.0). Chapter 3 shows pictures of the ResourceView page and one of the resource editors (the dialog editor).
Each project usually has one text-format resource script (RC) file
that describes the project's menu, dialog, string, and accelerator resources. The
RC file also has #include statements to bring in resources from other
subdirectories. These resources include project-specific items, such as bitmap (BMP) and
icon (ICO) files, and resources common to all Visual
C++ programs, such as error message strings. Editing the RC file outside the resource editors is not
recommended. The resource editors can also process EXE and DLL files, so you
can use the clipboard to "steal" resources, such as bitmaps and icons, from
other Windows applications.
The C/C++ Compiler
The Visual C++ compiler can process both C source code and
C++ source code. It determines the language by looking at the source code's filename
extension. A C extension indicates C source code, and CPP or CXX indicates
C++ source code. The compiler is compliant with all ANSI standards, including the
latest recommendations of a working group on C++ libraries, and has
additional Microsoft extensions. Templates, exceptions, and runtime type
identification (RTTI) are fully supported in Visual
C++ version 6.0. The C++ Standard Template Library (STL) is also included, although it is not integrated into the MFC library.
The Source Code Editor
Visual C++ 6.0 includes a sophisticated source code editor that supports
many features such as dynamic syntax coloring, auto-tabbing, keyboard bindings
for a variety of popular editors (such as VI and EMACS), and pretty printing.
In Visual C++ 6.0, an exciting new feature named AutoComplete has been
added. If you have used any of the Microsoft Office products or Microsoft Visual
Basic, you might already be familiar with this technology. Using the Visual
C++ 6.0 AutoComplete feature, all you have to do is type the beginning of a
programming statement and the editor will provide you with a list of
possible completions to choose from. This feature is extremely handy when you
are working with C++ objects and have forgotten an exact member function or
data member namethey are all there in the list for you. You no longer have
to memorize thousands of Win32 APIs or rely heavily on the online help
system, thanks to this new feature.
The Resource Compiler
The Visual C++ resource compiler reads an ASCII resource script (RC) file
from the resource editors and writes a binary RES file for the linker.
The linker reads the OBJ and RES files produced by the
C/C++ compiler and the resource compiler, and it accesses LIB files for MFC code, runtime
library code, and Windows code. It then writes the project's EXE file. An
incremental link option minimizes the execution time when only minor changes have
been made to the source files. The MFC header files contain
#pragma statements (special compiler directives) that specify the required library files, so you
don't have to tell the linker explicitly which libraries to read.
If your program works the first time, you don't need the debugger. The rest of us might need one from time to time. The Visual C++ debugger has been steadily improving, but it doesn't actually fix the bugs yet. The debugger works closely with Visual C++ to ensure that breakpoints are saved on disk. Toolbar buttons insert and remove breakpoints and control single-step execution. Figure 1-3 illustrates the Visual C++ debugger in action. Note that the Variables and Watch windows can expand an object pointer to show all data members of the derived class and base classes. If you position the cursor on a simple variable, the debugger shows you its value in a little window. To debug a program, you must build the program with the compiler and linker options set to generate debugging information.
Figure 1-3. The Visual C++ debugger window.
Visual C++ 6.0 adds a new twist to debugging with the Edit And
Continue feature. Edit And Continue lets you debug an application, change the
application, and then continue debugging with the new code. This feature
dramatically reduces the amount of time you spend debugging because you
no longer have to manually leave the debugger, recompile, and then debug
again. To use this feature, simply edit any code while in the debugger and then hit
the continue button. Visual C++ 6.0 automatically compiles the changes
and restarts the debugger for you.
AppWizard is a code generator that creates a working skeleton of a Windows application with features, class names, and source code filenames that you specify through dialog boxes. You'll use AppWizard extensively as you work through the examples in this book. Don't confuse AppWizard with older code generators that generate all the code for an application. AppWizard code is minimalist code; the functionality is inside the application framework base classes. AppWizard gets you started quickly with a new application.
Advanced developers can build custom AppWizards. Microsoft
Corporation has exposed its macro-based system for generating projects. If you
discover that your team needs to develop multiple projects with a
telecommunications interface, you can build a special wizard that automates the process.
ClassWizard is a program (implemented as a DLL) that's accessible from
Visual C++'s View menu. ClassWizard takes the drudgery out of maintaining
Visual C++ class code. Need a new class, a new virtual function, or a new
message-handler function? ClassWizard writes the prototypes, the function bodies,
and (if necessary) the code to link the Windows message to the function.
ClassWizard can update class code that you write, so you avoid the maintenance
problems common to ordinary code generators. Some ClassWizard features are
available from Visual C++'s WizardBar toolbar, shown in Figure
The Source Browser
If you write an application from scratch, you probably have a good mental picture of your source code files, classes, and member functions. If you take over someone else's application, you'll need some assistance. The Visual C++ Source Browser (the browser, for short) lets you examine (and edit) an application from the class or function viewpoint instead of from the file viewpoint. It's a little like the "inspector" tools available with object-oriented libraries such as Smalltalk. The browser has the following viewing modes:
A typical browser window is shown in Chapter 3.
If you rearrange the lines in any source code file, Visual C++ regenerates the browser database when you rebuild the project. This increases the build time.
In addition to the browser, Visual C++ has a ClassView option that
does not depend on the browser database. You get a tree view of all the classes in
your project, showing member functions and data members. Double-click on
an element, and you see the source code immediately. The ClassView does not
show hierarchy information, whereas the browser does.
In Visual C++ 6.0, the help system has been moved to a separate application named the MSDN Library Viewer. This help system is based on HTML. Each topic is covered in an individual HTML document; then all are combined into indexed files. The MSDN Library Viewer uses code from Microsoft Internet Explorer 4.0, so it works like the Web browser you already know. MSDN Library can access the help files from the Visual C++ CD-ROM (the default installation option) or from your hard disk, and it can access HTML files on the Internet.
Visual C++ 6.0 allows you to access help in four ways:
Whichever way you access online help, you can copy any help text to
the clipboard for inclusion in your program.
Windows Diagnostic Tools
Visual C++ 6.0 contains a number of useful diagnostic tools.
SPY++ gives you a tree view of your system's processes, threads, and windows. It also lets
you view messages and examine the windows of running applications. You'll
find PVIEW (PVIEW95 for Windows 95) useful for killing errant processes
that aren't visible from the Windows 95 task list. (The Windows NT Task
Manager, which you can run by right-clicking the toolbar, is an alternative to
PVIEW.) Visual C++ also includes a whole suite of ActiveX utilities, an ActiveX
control test program (now with full source code in Visual C++ 6.0), the help
workshop (with compiler), a library manager, binary file viewers and editors, a source
code profiler, and other utilities.
Source Code Control
During development of Visual C++ 5.0, Microsoft bought the rights to an
established source code control product named SourceSafe. This product has
since been included in the Enterprise Edition of Visual
C++ and Visual Studio Enterprise, and it is integrated into Visual
C++ so that you can coordinate large software projects. The master copy of the project's source code is stored in
a central place on the network, and programmers can check out modules
for updates. These checked-out modules are usually stored on the
programmer's local hard disk. After a programmer checks in modified files, other team
members can synchronize their local hard disk copies to the master copy. Other
source code control systems can also be integrated into Visual
The Visual C++ Components and Controls Gallery lets you share software components among different projects. The Gallery manages three types of modules:
If you decide to use one of the prepackaged Visual C++ components, try it out first in a dummy project to see if it's what you really want. Otherwise, it might be difficult to remove the generated code from your regular project.
All user-generated Gallery items can be imported from and exported
to OGX files. These files are the distribution and sharing medium for Visual
The Microsoft Foundation Class Library Version 6.0
The Microsoft Foundation Class Library version 6.0 (the MFC library, for
short) is really the subject of this book. It defines the application framework that
you'll be learning intimately. Chapter 2 gets you started with actual code and
introduces some important concepts.
The Microsoft Active Template Library
ATL is a tool, separate from MFC, for building ActiveX controls. You can build ActiveX controls with either MFC or ATL, but ATL controls are much smaller and quicker to load on the Internet. Chapter 29 and Chapter 30 provide a brief overview of ATL and creating ActiveX controls with ATL.