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.
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
' ========================================================================================