Embedding Microsoft Office Outlook View Control

Started by José Roca, October 11, 2008, 10:19:42 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

José Roca

 
The following example demonstrates how to embed an instance of the Microsoft Office Outlook View Control using ATL71.DLL as the OLE container (ATL.DLL fails to activate the control).


' ########################################################################################
' Demonstrates how to embed an instance of the Microsoft Office Outlook View Control
' ########################################################################################

#COMPILE EXE
#DIM ALL

$ATL_DLLNAME = "ATL71.DLL"   ' // This control doesn't work with ATL.DLL
#INCLUDE "ATL.INC"           ' // ATL OLE Container
#INCLUDE "COMMCTRL.INC"      ' // Common controls constants and declares
#INCLUDE "OUTLCTL.INC"       ' // Microsoft View Control include file
#RESOURCE "EX_OVC_01.PBR"    ' // Resource file

' Control identifiers
%ID_TOOLBAR          = 1001
%ID_OVC              = 1002

%IDM_CALENDAR        = 28000
%IDM_CONTACTS        = 28001
%IDM_DELETED         = 28002
%IDM_DRAFTS          = 28003
%IDM_INBOX           = 28004
%IDM_NOTES           = 28005
%IDM_OUTBOX          = 28006
%IDM_SENT            = 28007
%IDM_TASKS           = 28009

' Icon identifiers
%IDI_CALENDAR        = 100
%IDI_CONTACTS        = 101
%IDI_DELETED         = 102
%IDI_DRAFTS          = 103
%IDI_INBOX           = 104
%IDI_JOURNAL         = 105
%IDI_NOTES           = 106
%IDI_OUTBOX          = 107
%IDI_OUTLOOK         = 108
%IDI_PERSONALFOLDERS = 109
%IDI_SENT            = 110
%IDI_TASKS           = 111

' ========================================================================================
' Creates the toolbar
' ========================================================================================
SUB OvcCreateToolbar (BYVAL hInstance AS DWORD, BYVAL hWnd AS DWORD)

   LOCAL ttbb          AS TBBUTTON       ' specifies or receives the attributes of a toolbar button
   LOCAL ttbab         AS TBADDBITMAP    ' specifies the images to add to a toolbar
   LOCAL pttbb         AS TBBUTTON PTR   ' address of array of toolbar button info
   LOCAL hToolbar      AS DWORD          ' handle of child window

   ' Create the Toolbar1 toolbar control
   hToolbar = CreateWindowEx(%NULL, _                                             ' extended styles
                              "ToolbarWindow32", _                                 ' class name
                              "", _                                                ' caption
                              %WS_CHILD OR %WS_VISIBLE OR _                        ' window styles
                              %TBSTYLE_TRANSPARENT OR %TBSTYLE_TOOLTIPS OR %TBSTYLE_LIST OR _
                              %CCS_TOP OR %TBSTYLE_FLAT, _                         ' class styles
                              0, 0, _                                              ' left, top
                              401, 28, _                                           ' width, height
                              hWnd, %ID_TOOLBAR, _                                 ' handle of parent, control ID
                              hInstance, BYVAL %NULL)                              ' handle of instance, creation parameters

   ' Allocate memory for the button info array
   pttbb = HeapAlloc(GetProcessHeap(), %HEAP_ZERO_MEMORY, 9 * SIZEOF(ttbb))
   IF ISTRUE pttbb THEN
     ' Send the TB_BUTTONSTRUCTSIZE message, for backward compatibility
     SendMessage hToolbar, %TB_BUTTONSTRUCTSIZE, SIZEOF(ttbb), 0
     ' Set the size of the bitmaps
     SendMessage hToolbar, %TB_SETBITMAPSIZE, 0, MAKLNG(16, 16)
     ' Add bitmaps to the internal image list
     ttbab.hInst = hInstance
     ttbab.nID   = %IDI_CALENDAR
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_CONTACTS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_DELETED
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_DRAFTS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_INBOX
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_JOURNAL
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_NOTES
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_OUTBOX
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_OUTLOOK
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_PERSONALFOLDERS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_SENT
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_TASKS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)

     ' Add buttons to the toolbar
     @pttbb[0].iBitmap   = 0
     @pttbb[0].idCommand = %IDM_CALENDAR
     @pttbb[0].fsState   = %TBSTATE_ENABLED
     @pttbb[0].fsStyle   = %BTNS_BUTTON
     @pttbb[0].dwData    = 0
     @pttbb[0].iString   = -1

     @pttbb[1].iBitmap   = 1
     @pttbb[1].idCommand = %IDM_CONTACTS
     @pttbb[1].fsState   = %TBSTATE_ENABLED
     @pttbb[1].fsStyle   = %BTNS_BUTTON
     @pttbb[1].dwData    = 0
     @pttbb[1].iString   = -1

     @pttbb[2].iBitmap   = 2
     @pttbb[2].idCommand = %IDM_DELETED
     @pttbb[2].fsState   = %TBSTATE_ENABLED
     @pttbb[2].fsStyle   = %BTNS_BUTTON
     @pttbb[2].dwData    = 0
     @pttbb[2].iString   = -1

     @pttbb[3].iBitmap   = 3
     @pttbb[3].idCommand = %IDM_DRAFTS
     @pttbb[3].fsState   = %TBSTATE_ENABLED
     @pttbb[3].fsStyle   = %BTNS_BUTTON
     @pttbb[3].dwData    = 0
     @pttbb[3].iString   = -1

     @pttbb[4].iBitmap   = 4
     @pttbb[4].idCommand = %IDM_INBOX
     @pttbb[4].fsState   = %TBSTATE_ENABLED
     @pttbb[4].fsStyle   = %BTNS_BUTTON
     @pttbb[4].dwData    = 0
     @pttbb[4].iString   = -1

     @pttbb[5].iBitmap   = 6
     @pttbb[5].idCommand = %IDM_NOTES
     @pttbb[5].fsState   = %TBSTATE_ENABLED
     @pttbb[5].fsStyle   = %BTNS_BUTTON
     @pttbb[5].dwData    = 0
     @pttbb[5].iString   = -1

     @pttbb[6].iBitmap   = 7
     @pttbb[6].idCommand = %IDM_OUTBOX
     @pttbb[6].fsState   = %TBSTATE_ENABLED
     @pttbb[6].fsStyle   = %BTNS_BUTTON
     @pttbb[6].dwData    = 0
     @pttbb[6].iString   = -1

     @pttbb[7].iBitmap   = 10
     @pttbb[7].idCommand = %IDM_SENT
     @pttbb[7].fsState   = %TBSTATE_ENABLED
     @pttbb[7].fsStyle   = %BTNS_BUTTON
     @pttbb[7].dwData    = 0
     @pttbb[7].iString   = -1

     @pttbb[8].iBitmap   = 11
     @pttbb[8].idCommand = %IDM_TASKS
     @pttbb[8].fsState   = %TBSTATE_ENABLED
     @pttbb[8].fsStyle   = %BTNS_BUTTON
     @pttbb[8].dwData    = 0
     @pttbb[8].iString   = -1

     SendMessage hToolbar, %TB_ADDBUTTONS, 9, BYVAL pttbb
     ' Free memory that was allocated for the button info
     HeapFree GetProcessHeap(), 0, BYVAL pttbb
     ' Update the size of the toolbar
     SendMessage hToolbar, %TB_AUTOSIZE, 0, 0
   END IF

END SUB
' ========================================================================================

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG

   LOCAL hWndMain AS dword
   LOCAL hCtl AS DWORD
   LOCAL hFont AS DWORD
   LOCAL wcex AS WndClassEx
   LOCAL szClassName AS ASCIIZ * 80
   LOCAL rc AS RECT
   LOCAL szCaption AS asciiz * 255
   LOCAL nLeft AS LONG
   LOCAL nTop AS LONG
   LOCAL nWidth AS LONG
   LOCAL nHeight AS LONG
   LOCAL ticc AS INIT_COMMON_CONTROLSEX   ' specifies common control classes to register

   AtlAxWinInit  ' // Initialize ATL - must be called before creating an AtlAxWin71 window

   hFont = GetStockObject(%ANSI_VAR_FONT)

   ' Load the common controls library and specify the classes to register.
   ticc.dwSize = SIZEOF(ticc)
   ticc.dwICC  = %ICC_BAR_CLASSES
   InitCommonControlsEx ticc

   ' Register the window class
   szClassName        = "MSOUTLCTL"
   wcex.cbSize        = SIZEOF(wcex)
   wcex.style         = %CS_HREDRAW OR %CS_VREDRAW
   wcex.lpfnWndProc   = CODEPTR(WndProc)
   wcex.cbClsExtra    = 0
   wcex.cbWndExtra    = 0
   wcex.hInstance     = hInstance
   wcex.hCursor       = LoadCursor (%NULL, BYVAL %IDC_ARROW)
   wcex.hbrBackground = %COLOR_3DFACE + 1
   wcex.lpszMenuName  = %NULL
   wcex.lpszClassName = VARPTR(szClassName)
   wcex.hIcon         = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) ' Sample, if resource icon: LoadIcon(hInst, "APPICON")
   wcex.hIconSm       = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) ' Remember to set small icon too..
   RegisterClassEx wcex

   ' Window caption
   szCaption = "Microsoft View Control Demo"

   ' Retrieve the size of the working area
   SystemParametersInfo %SPI_GETWORKAREA, 0, BYVAL VARPTR(rc), 0

   ' Calculate the position and size of the window
   nWidth  = (((rc.nRight - rc.nLeft)) + 2) * 0.85   ' 85% of the client screen width
   nHeight = (((rc.nBottom - rc.nTop)) + 2) * 0.80   ' 80% of the client screen height
   nLeft   = ((rc.nRight - rc.nLeft) \ 2) - nWidth \ 2
   nTop    = ((rc.nBottom - rc.nTop) \ 2) - (nHeight \ 2)

   ' Create a window using the registered class
   hWndMain = CreateWindowEx(%WS_EX_CONTROLPARENT, _           ' extended style
                             szClassName, _                    ' window class name
                             szCaption, _                      ' window caption
                             %WS_OVERLAPPEDWINDOW OR _
                             %WS_CLIPCHILDREN, _               ' window style
                             nLeft, _                          ' initial x position
                             nTop, _                           ' initial y position
                             nWidth, _                         ' initial x size
                             nHeight, _                        ' initial y size
                             %NULL, _                          ' parent window handle
                             0, _                              ' window menu handle
                             hInstance, _                      ' program instance handle
                             BYVAL %NULL)                      ' creation parameters


   ' Create the Toolbar
   OvcCreateToolbar hInstance, hWndMain

   ' Show the window
   ShowWindow hWndMain, nCmdShow
   UpdateWindow hWndMain

   ' Message handler loop
   LOCAL uMsg AS tagMsg
   WHILE GetMessage(uMsg, %NULL, 0, 0)
      IF ISFALSE IsDialogMessage(hWndMain, uMsg) THEN
         TranslateMessage uMsg
         DispatchMessage uMsg
      END IF
   WEND

   FUNCTION = uMsg.wParam

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main Window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG

   LOCAL rc AS RECT
   LOCAL hCtl AS DWORD
   LOCAL hr AS DWORD
   LOCAL pOvc AS OVCtl_IViewCtl

   LOCAL  pTOOLTIP  AS TOOLTIPTEXT PTR
   LOCAL  lpNmh AS NMHDR PTR
   STATIC szTipText AS ASCIIZ * 64

   SELECT CASE wMsg

      CASE %WM_SYSCOMMAND
        ' Capture this message and send a %WM_CLOSE message
        IF (wParam AND &HFFF0) = %SC_CLOSE THEN
           SendMessage hWnd, %WM_CLOSE, 0, 0
           EXIT FUNCTION
        END IF

      CASE %WM_CREATE
         ' Create the View Control window container
         hCtl = CreateWindowEx(0, "AtlAxWin71", "OVCtl.OVCtl.1", %WS_CHILD OR %WS_VISIBLE, _
                               0, 0, 0, 0, hWnd, %ID_OVC, GetModuleHandle(""), BYVAL %NULL)
         ' Get a reference to the control
         pOvc = AtlAxGetDispatch(hCtl)
         IF ISOBJECT(pOvc) THEN
            ' Choose the Calendar view
            pOvc.Folder = UCODE$("Inbox")
            ' Release the reference
            pOvc = NOTHING
         END IF

      CASE %WM_SIZE
         ' Resize the toolbar
         SendMessage GetDlgItem(hWnd, %ID_TOOLBAR), wMsg, wParam, lParam
         IF wParam <> %SIZE_MINIMIZED THEN
            GetClientRect hWnd, rc
            MoveWindow GetDlgItem(hWnd, %ID_OVC), 0, 30, (rc.nRight - rc.nLeft), (rc.nBottom - rc.nTop) - 30, %TRUE
         END IF

      CASE %WM_COMMAND
         SELECT CASE LO(WORD, wParam)

            CASE %IDCANCEL
               IF HI(WORD, wParam) = %BN_CLICKED THEN
                  SendMessage hWnd, %WM_CLOSE, 0, 0
                  EXIT FUNCTION
               END IF

            CASE %IDM_CALENDAR, %IDM_CONTACTS, %IDM_DRAFTS, %IDM_DELETED, %IDM_INBOX, _
                 %IDM_NOTES, %IDM_OUTBOX, %IDM_SENT, %IDM_TASKS
               IF HI(WORD, wParam) = %BN_CLICKED THEN
                  hCtl = GetDlgItem(hWnd, %ID_OVC)
                  pOvc = AtlAxGetDispatch(hCtl)
                  IF ISOBJECT(pOvc) THEN
                     ' Choose the view
                     SELECT CASE LO(WORD, wParam)
                        CASE %IDM_CALENDAR : pOvc.Folder = UCODE$("Calendar")
                        CASE %IDM_CONTACTS : pOvc.Folder = UCODE$("Contacts")
                        CASE %IDM_DRAFTS   : pOvc.Folder = UCODE$("Drafts")
                        CASE %IDM_DELETED  : pOvc.Folder = UCODE$("Deleted Items")
                        CASE %IDM_INBOX    : pOvc.Folder = UCODE$("Inbox")
                        CASE %IDM_NOTES    : pOvc.Folder = UCODE$("Notes")
                        CASE %IDM_OUTBOX   : pOvc.Folder = UCODE$("Outbox")
                        CASE %IDM_SENT     : pOvc.Folder = UCODE$("Sent Items")
                        CASE %IDM_TASKS    : pOvc.Folder = UCODE$("Tasks")
                     END SELECT
                     ' Release the reference
                     pOvc = NOTHING
                  END IF
                  EXIT FUNCTION
               END IF

         END SELECT

      CASE %WM_NOTIFY
         lpNmh = lParam
         SELECT CASE @lpNmh.Code
         CASE %TTN_NEEDTEXT ' ToolTips
            pTOOLTIP = lParam
            szTipText = ""
            IF @pTOOLTIP.hdr.code = %TTN_NEEDTEXT THEN
               SELECT CASE @pTOOLTIP.hdr.idFrom
                  CASE %IDM_CALENDAR : szTipText = " Calendar "
                  CASE %IDM_CONTACTS : szTipText = " Contacts "
                  CASE %IDM_DELETED  : szTipText = " Deleted Items "
                  CASE %IDM_DRAFTS   : szTipText = " Drafts "
                  CASE %IDM_INBOX    : szTipText = " Inbox "
                  CASE %IDM_NOTES    : szTipText = " Notes "
                  CASE %IDM_OUTBOX   : szTipText = " Outbox "
                  CASE %IDM_SENT     : szTipText = " Sent Items "
                  CASE %IDM_TASKS    : szTipText = " Tasks "
               END SELECT
               IF szTipText <> "" THEN
                  @pTOOLTIP.lpszText = VARPTR(szTipText)
                  EXIT FUNCTION
               END IF
            END IF
         END SELECT

      CASE %WM_DESTROY
         PostQuitMessage 0
         EXIT FUNCTION

   END SELECT

   FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)

END FUNCTION
' ========================================================================================


The attached file contains all you need to compile and execute the example, including ATL71.DLL, excepting OUTLCTL.INC, included in the Windows API package.

José Roca

#1
 
The following example demonstrates how to embed an instance of the Microsoft Office Outlook View Control using my Ole Container (OLECON.INC).


' ########################################################################################
' Demonstrates how to embed an instance of the Microsoft Office Outlook View Control
' ########################################################################################

#COMPILE EXE
#DIM ALL
#INCLUDE "OLECON.INC"        ' // OLE Container
#INCLUDE "COMMCTRL.INC"      ' // Common controls constants and declares
#INCLUDE "OUTLCTL.INC"       ' // Microsoft View Control include file
#RESOURCE "EX_OVC_01.PBR"    ' // Resource file

' Control identifiers
%ID_TOOLBAR          = 1001
%ID_OVC              = 1002

%IDM_CALENDAR        = 28000
%IDM_CONTACTS        = 28001
%IDM_DELETED         = 28002
%IDM_DRAFTS          = 28003
%IDM_INBOX           = 28004
%IDM_NOTES           = 28005
%IDM_OUTBOX          = 28006
%IDM_SENT            = 28007
%IDM_TASKS           = 28009

' Icon identifiers
%IDI_CALENDAR        = 100
%IDI_CONTACTS        = 101
%IDI_DELETED         = 102
%IDI_DRAFTS          = 103
%IDI_INBOX           = 104
%IDI_JOURNAL         = 105
%IDI_NOTES           = 106
%IDI_OUTBOX          = 107
%IDI_OUTLOOK         = 108
%IDI_PERSONALFOLDERS = 109
%IDI_SENT            = 110
%IDI_TASKS           = 111

' ========================================================================================
' Creates the toolbar
' ========================================================================================
SUB OvcCreateToolbar (BYVAL hInstance AS DWORD, BYVAL hWnd AS DWORD)

   LOCAL ttbb          AS TBBUTTON       ' specifies or receives the attributes of a toolbar button
   LOCAL ttbab         AS TBADDBITMAP    ' specifies the images to add to a toolbar
   LOCAL pttbb         AS TBBUTTON PTR   ' address of array of toolbar button info
   LOCAL hToolbar      AS DWORD          ' handle of child window

   ' Create the Toolbar1 toolbar control
   hToolbar = CreateWindowEx(%NULL, _                                             ' extended styles
                              "ToolbarWindow32", _                                 ' class name
                              "", _                                                ' caption
                              %WS_CHILD OR %WS_VISIBLE OR _                        ' window styles
                              %TBSTYLE_TRANSPARENT OR %TBSTYLE_TOOLTIPS OR %TBSTYLE_LIST OR _
                              %CCS_TOP OR %TBSTYLE_FLAT, _                         ' class styles
                              0, 0, _                                              ' left, top
                              401, 28, _                                           ' width, height
                              hWnd, %ID_TOOLBAR, _                                 ' handle of parent, control ID
                              hInstance, BYVAL %NULL)                              ' handle of instance, creation parameters

   ' Allocate memory for the button info array
   pttbb = HeapAlloc(GetProcessHeap(), %HEAP_ZERO_MEMORY, 9 * SIZEOF(ttbb))
   IF ISTRUE pttbb THEN
     ' Send the TB_BUTTONSTRUCTSIZE message, for backward compatibility
     SendMessage hToolbar, %TB_BUTTONSTRUCTSIZE, SIZEOF(ttbb), 0
     ' Set the size of the bitmaps
     SendMessage hToolbar, %TB_SETBITMAPSIZE, 0, MAKLNG(16, 16)
     ' Add bitmaps to the internal image list
     ttbab.hInst = hInstance
     ttbab.nID   = %IDI_CALENDAR
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_CONTACTS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_DELETED
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_DRAFTS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_INBOX
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_JOURNAL
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_NOTES
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_OUTBOX
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_OUTLOOK
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_PERSONALFOLDERS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_SENT
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)
     ttbab.nID   = %IDI_TASKS
     SendMessage hToolbar, %TB_ADDBITMAP, 1, BYVAL VARPTR(ttbab)

     ' Add buttons to the toolbar
     @pttbb[0].iBitmap   = 0
     @pttbb[0].idCommand = %IDM_CALENDAR
     @pttbb[0].fsState   = %TBSTATE_ENABLED
     @pttbb[0].fsStyle   = %BTNS_BUTTON
     @pttbb[0].dwData    = 0
     @pttbb[0].iString   = -1

     @pttbb[1].iBitmap   = 1
     @pttbb[1].idCommand = %IDM_CONTACTS
     @pttbb[1].fsState   = %TBSTATE_ENABLED
     @pttbb[1].fsStyle   = %BTNS_BUTTON
     @pttbb[1].dwData    = 0
     @pttbb[1].iString   = -1

     @pttbb[2].iBitmap   = 2
     @pttbb[2].idCommand = %IDM_DELETED
     @pttbb[2].fsState   = %TBSTATE_ENABLED
     @pttbb[2].fsStyle   = %BTNS_BUTTON
     @pttbb[2].dwData    = 0
     @pttbb[2].iString   = -1

     @pttbb[3].iBitmap   = 3
     @pttbb[3].idCommand = %IDM_DRAFTS
     @pttbb[3].fsState   = %TBSTATE_ENABLED
     @pttbb[3].fsStyle   = %BTNS_BUTTON
     @pttbb[3].dwData    = 0
     @pttbb[3].iString   = -1

     @pttbb[4].iBitmap   = 4
     @pttbb[4].idCommand = %IDM_INBOX
     @pttbb[4].fsState   = %TBSTATE_ENABLED
     @pttbb[4].fsStyle   = %BTNS_BUTTON
     @pttbb[4].dwData    = 0
     @pttbb[4].iString   = -1

     @pttbb[5].iBitmap   = 6
     @pttbb[5].idCommand = %IDM_NOTES
     @pttbb[5].fsState   = %TBSTATE_ENABLED
     @pttbb[5].fsStyle   = %BTNS_BUTTON
     @pttbb[5].dwData    = 0
     @pttbb[5].iString   = -1

     @pttbb[6].iBitmap   = 7
     @pttbb[6].idCommand = %IDM_OUTBOX
     @pttbb[6].fsState   = %TBSTATE_ENABLED
     @pttbb[6].fsStyle   = %BTNS_BUTTON
     @pttbb[6].dwData    = 0
     @pttbb[6].iString   = -1

     @pttbb[7].iBitmap   = 10
     @pttbb[7].idCommand = %IDM_SENT
     @pttbb[7].fsState   = %TBSTATE_ENABLED
     @pttbb[7].fsStyle   = %BTNS_BUTTON
     @pttbb[7].dwData    = 0
     @pttbb[7].iString   = -1

     @pttbb[8].iBitmap   = 11
     @pttbb[8].idCommand = %IDM_TASKS
     @pttbb[8].fsState   = %TBSTATE_ENABLED
     @pttbb[8].fsStyle   = %BTNS_BUTTON
     @pttbb[8].dwData    = 0
     @pttbb[8].iString   = -1

     SendMessage hToolbar, %TB_ADDBUTTONS, 9, BYVAL pttbb
     ' Free memory that was allocated for the button info
     HeapFree GetProcessHeap(), 0, BYVAL pttbb
     ' Update the size of the toolbar
     SendMessage hToolbar, %TB_AUTOSIZE, 0, 0
   END IF

END SUB
' ========================================================================================

' ========================================================================================
' Main
' ========================================================================================
FUNCTION WINMAIN (BYVAL hInstance AS DWORD, BYVAL hPrevInstance AS DWORD, BYVAL lpszCmdLine AS ASCIIZ PTR, BYVAL nCmdShow AS LONG) AS LONG

   LOCAL hWndMain    AS DWORD
   LOCAL hFont       AS DWORD
   LOCAL wcex        AS WNDCLASSEX
   LOCAL szClassName AS ASCIIZ * 80
   LOCAL rc          AS RECT
   LOCAL szCaption   AS ASCIIZ * 255
   LOCAL nLeft       AS LONG
   LOCAL nTop        AS LONG
   LOCAL nWidth      AS LONG
   LOCAL nHeight     AS LONG
   LOCAL ticc        AS INIT_COMMON_CONTROLSEX

   ' Required: Initialize the Ole Container
   OC_WinInit

   hFont = GetStockObject(%ANSI_VAR_FONT)

   ' Load the common controls library and specify the classes to register.
   ticc.dwSize = SIZEOF(ticc)
   ticc.dwICC  = %ICC_BAR_CLASSES
   InitCommonControlsEx ticc

   ' Register the window class
   szClassName        = "MSOUTLCTL"
   wcex.cbSize        = SIZEOF(wcex)
   wcex.style         = %CS_HREDRAW OR %CS_VREDRAW
   wcex.lpfnWndProc   = CODEPTR(WndProc)
   wcex.cbClsExtra    = 0
   wcex.cbWndExtra    = 0
   wcex.hInstance     = hInstance
   wcex.hCursor       = LoadCursor (%NULL, BYVAL %IDC_ARROW)
   wcex.hbrBackground = %COLOR_3DFACE + 1
   wcex.lpszMenuName  = %NULL
   wcex.lpszClassName = VARPTR(szClassName)
   wcex.hIcon         = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) ' Sample, if resource icon: LoadIcon(hInst, "APPICON")
   wcex.hIconSm       = LoadIcon (%NULL, BYVAL %IDI_APPLICATION) ' Remember to set small icon too..
   RegisterClassEx wcex

   ' Window caption
   szCaption = "Microsoft View Control Demo"

   ' Retrieve the size of the working area
   SystemParametersInfo %SPI_GETWORKAREA, 0, BYVAL VARPTR(rc), 0

   ' Calculate the position and size of the window
   nWidth  = (((rc.nRight - rc.nLeft)) + 2) * 0.85   ' 85% of the client screen width
   nHeight = (((rc.nBottom - rc.nTop)) + 2) * 0.80   ' 80% of the client screen height
   nLeft   = ((rc.nRight - rc.nLeft) \ 2) - nWidth \ 2
   nTop    = ((rc.nBottom - rc.nTop) \ 2) - (nHeight \ 2)

   ' Create a window using the registered class
   hWndMain = CreateWindowEx(%WS_EX_CONTROLPARENT, _           ' extended style
                             szClassName, _                    ' window class name
                             szCaption, _                      ' window caption
                             %WS_OVERLAPPEDWINDOW OR _
                             %WS_CLIPCHILDREN, _               ' window style
                             nLeft, _                          ' initial x position
                             nTop, _                           ' initial y position
                             nWidth, _                         ' initial x size
                             nHeight, _                        ' initial y size
                             %NULL, _                          ' parent window handle
                             0, _                              ' window menu handle
                             hInstance, _                      ' program instance handle
                             BYVAL %NULL)                      ' creation parameters


   ' Create the Toolbar
   OvcCreateToolbar hInstance, hWndMain

   ' Show the window
   ShowWindow hWndMain, nCmdShow
   UpdateWindow hWndMain

   ' Message handler loop
   LOCAL uMsg AS tagMsg
   WHILE GetMessage(uMsg, %NULL, 0, 0)
       ' This control doesn't require message forwarding
'      IF ISFALSE OC_ForwardMessage(GetFocus, uMsg) THEN
         IF ISFALSE IsDialogMessage(hWndMain, uMsg) THEN
            TranslateMessage uMsg
            DispatchMessage uMsg
         END IF
'      END IF
   WEND

   FUNCTION = uMsg.wParam

END FUNCTION
' ========================================================================================

' ========================================================================================
' Main Window procedure
' ========================================================================================
FUNCTION WndProc (BYVAL hWnd AS DWORD, BYVAL wMsg AS DWORD, BYVAL wParam AS DWORD, BYVAL lParam AS LONG) AS LONG

   LOCAL  rc        AS RECT
   LOCAL  hCtl      AS DWORD
   LOCAL  hr        AS DWORD
   LOCAL  pOvc      AS OVCtl_IViewCtl

   LOCAL  pTOOLTIP  AS TOOLTIPTEXT PTR
   LOCAL  lpNmh     AS NMHDR  PTR
   STATIC szTipText AS ASCIIZ *   64

   SELECT CASE wMsg

      CASE %WM_SYSCOMMAND
        ' Capture this message and send a %WM_CLOSE message
        IF (wParam AND &HFFF0) = %SC_CLOSE THEN
           SendMessage hWnd, %WM_CLOSE, 0, 0
           EXIT FUNCTION
        END IF

      CASE %WM_CREATE
         ' Create the View Control window container
         hCtl = CreateWindowEx(0, $OC_CLASSNAME, "OVCtl.OVCtl.1", %WS_CHILD OR %WS_VISIBLE, _
                               0, 0, 0, 0, hWnd, %ID_OVC, GetModuleHandle(""), BYVAL %NULL)
         ' Get a reference to the control
         pOvc = OC_GetDispatch(hCtl)
         IF ISOBJECT(pOvc) THEN
            ' Choose the Calendar view
            pOvc.Folder = UCODE$("Inbox")
            ' Release the reference
            pOvc = NOTHING
         END IF

      CASE %WM_SIZE
         ' Resize the toolbar
         SendMessage GetDlgItem(hWnd, %ID_TOOLBAR), wMsg, wParam, lParam
         IF wParam <> %SIZE_MINIMIZED THEN
            GetClientRect hWnd, rc
            MoveWindow GetDlgItem(hWnd, %ID_OVC), 0, 30, (rc.nRight - rc.nLeft), (rc.nBottom - rc.nTop) - 30, %TRUE
         END IF

      CASE %WM_COMMAND
         SELECT CASE LO(WORD, wParam)

            CASE %IDCANCEL
               IF HI(WORD, wParam) = %BN_CLICKED THEN
                  SendMessage hWnd, %WM_CLOSE, 0, 0
                  EXIT FUNCTION
               END IF

            CASE %IDM_CALENDAR, %IDM_CONTACTS, %IDM_DRAFTS, %IDM_DELETED, %IDM_INBOX, _
                 %IDM_NOTES, %IDM_OUTBOX, %IDM_SENT, %IDM_TASKS
               IF HI(WORD, wParam) = %BN_CLICKED THEN
                  hCtl = GetDlgItem(hWnd, %ID_OVC)
                  pOvc = OC_GetDispatch(hCtl)
                  IF ISOBJECT(pOvc) THEN
                     ' Choose the view
                     SELECT CASE LO(WORD, wParam)
                        CASE %IDM_CALENDAR : pOvc.Folder = UCODE$("Calendar")
                        CASE %IDM_CONTACTS : pOvc.Folder = UCODE$("Contacts")
                        CASE %IDM_DRAFTS   : pOvc.Folder = UCODE$("Drafts")
                        CASE %IDM_DELETED  : pOvc.Folder = UCODE$("Deleted Items")
                        CASE %IDM_INBOX    : pOvc.Folder = UCODE$("Inbox")
                        CASE %IDM_NOTES    : pOvc.Folder = UCODE$("Notes")
                        CASE %IDM_OUTBOX   : pOvc.Folder = UCODE$("Outbox")
                        CASE %IDM_SENT     : pOvc.Folder = UCODE$("Sent Items")
                        CASE %IDM_TASKS    : pOvc.Folder = UCODE$("Tasks")
                     END SELECT
                     ' Release the reference
                     pOvc = NOTHING
                  END IF
                  EXIT FUNCTION
               END IF

         END SELECT

      CASE %WM_NOTIFY
         lpNmh = lParam
         SELECT CASE @lpNmh.Code
         CASE %TTN_NEEDTEXT ' ToolTips
            pTOOLTIP = lParam
            szTipText = ""
            IF @pTOOLTIP.hdr.code = %TTN_NEEDTEXT THEN
               SELECT CASE @pTOOLTIP.hdr.idFrom
                  CASE %IDM_CALENDAR : szTipText = " Calendar "
                  CASE %IDM_CONTACTS : szTipText = " Contacts "
                  CASE %IDM_DELETED  : szTipText = " Deleted Items "
                  CASE %IDM_DRAFTS   : szTipText = " Drafts "
                  CASE %IDM_INBOX    : szTipText = " Inbox "
                  CASE %IDM_NOTES    : szTipText = " Notes "
                  CASE %IDM_OUTBOX   : szTipText = " Outbox "
                  CASE %IDM_SENT     : szTipText = " Sent Items "
                  CASE %IDM_TASKS    : szTipText = " Tasks "
               END SELECT
               IF szTipText <> "" THEN
                  @pTOOLTIP.lpszText = VARPTR(szTipText)
                  EXIT FUNCTION
               END IF
            END IF
         END SELECT

      CASE %WM_DESTROY
         PostQuitMessage 0
         EXIT FUNCTION

   END SELECT

   FUNCTION = DefWindowProc(hWnd, wMsg, wParam, lParam)

END FUNCTION
' ========================================================================================