SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftMask/OCX 7.0 - Masked Edit Control
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftPrintPreview/DLL 2.0 - Print Preview Control (discontinued)
SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftDirectory 3.5 - File/Folder Control (discontinued)
SftMask/OCX 7.0 - Masked Edit Control
SftOptions 1.0 - Registry/INI Control (discontinued)
SftPrintPreview/OCX 1.0 - Print Preview Control (discontinued)
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftTabs/NET 6.0 - Tab Control (discontinued)
SftTree/NET 2.0 - Tree Control
This sample illustrates GDI+ images, bitmaps, icons, checkboxes and image handling techniques.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTabs DLL 6.5\Samples\MFC\Images\MainDlg.cpp or C:\Program Files\Softelvdm\SftTabs DLL 6.5\Samples\MFC\Images\MainDlg.cpp (on 32-bit Windows versions).
/****************************************************************************/ /* SftTabs/DLL 6.5 - Tab Control for C/C++ */ /* Copyright (C) 1994, 2017 Softel vdm, Inc. All Rights Reserved. */ /****************************************************************************/ #include "stdafx.h" #ifdef _DEBUG #undef THIS_FILE static char BASED_CODE THIS_FILE[] = __FILE__; #endif /*- Tab Control Initialization Data --------------------------------------------*/ static const SFTTABS_CONTROL CtlInit = { SFTTABSSTYLE_MODERN_I, /* tab style */ 1, /* number of rows */ 0, /* number of tabs per row (if fFixed) */ 0, /* width of left margin */ 0, /* width of right margin */ FALSE, /* same width for all tabs */ TRUE, /* Client area wanted */ FALSE, /* allow multiline label text */ TRUE, /* use with dialog */ FALSE, /* use specified background color only for text */ FALSE, /* scrollable tabs */ FALSE, /* hide scroll buttons */ TRUE, /* bold font for active tab wanted */ FALSE, /* fill rows completely */ NULL, /* scroll button bitmap */ NULL, /* Dialog data associated with active tab */ NULL, /* Dialog window handle associated with active tab */ NULL, /* Frame, used as client area */ TRUE, /* Tooltips wanted */ FALSE, /* drop text if it doesn't fit */ FALSE, /* conditional scroll buttons */ BMBUTTONSTYLE_THEME_SCROLL2, /* scroll button style */ TRUE, /* display ... if truncated */ TRUE, /* Flyby highlighting */ TRUE, /* use client area colors in partially obscured frames */ FALSE, /* scroll buttons on left side */ -1, /* row indentation */ FALSE, /* don't show truncated pattern for clipped tab */ FALSE, /* full size scroll buttons */ TRUE, /* use themes on Windows XP */ FALSE, /* use exact window region */ FALSE, /* always show prefix _ */ 0,0,0,0, /* animation values */ NULL, /* disabled button bitmap */ TRUE, /* focus rectangle if the control has i/p focus */ FALSE, /* TRUE if Close button wanted */ FALSE, /* TRUE if Close button disabled */ TRUE, /* TRUE if WM_CLOSE message wanted */ FALSE, /* TRUE if Minimize, Restore, Close buttons are full size */ SFTTABS_BUTTON_NEAR, /* scroll button alignment */ SFTTABS_BUTTON_NEAR, /* Minimize, Restore, Close button alignment */ FALSE, /* TRUE if Minimize button wanted */ FALSE, /* TRUE if Minimize button disabled */ FALSE, /* TRUE if Restore button wanted */ FALSE, /* TRUE if Restore button disabled */ NULL, /* Close, Minimize, Restore button bitmap */ NULL, /* Close, Minimize, Restore disabled button bitmap */ TEXT("Scroll Left/Up"), /* scroll left button tooltip */ TEXT("Scroll Right/Down"), /* scroll button tooltip */ TEXT("Close"), /* Close button tooltip */ TEXT("Minimize"), /* Minimize button tooltip */ TEXT("Restore"), /* Restore button tooltip */ 0, /* custom modifications */ 0, /* forced height/width depending on tab style - 0 to ignore */ FALSE, /* switch tabs on button release (or down if FALSE) */ FALSE, /* Rendering compatible with pre-6.0 */ FALSE, /* don't display clientarea border - select styles only */ SFTTABS_TABS_LEFT, /* alignment of tabs on all rows */ SFTTABS_LAYOUT_DISTRIBUTE, /* distribution of tabs on rows */ 0, 0, /* minimum and maximum number of rows for autoflow layout (none specified) */ FALSE, /* reorderable tabs */ FALSE, /* drag & drop */ }; static const SFTTABS_TAB Tab0 = { /*&{linksame "GDI+" g_gdiplus} Images */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color (when selected) */ { SFTTABS_GRAPH_LEFT, 0 }, /* location */ TRUE, /* enabled/disabled */ 0, /* userdata */ 0, /* reserved */ NULL, /* reserved */ SFTTABS_NOCOLOR, /* Flyby foreground color */ SFTTABS_NOCOLOR, /* Client area background color */ 0,0,0,0, /* animation values */ NULL, /* tab-specific ImageList handle*/ FALSE, /* hidden tab */ SFTTABS_NOCOLOR, /* gradient fill background color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill background color, active tab */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill client area color */ SFTTABS_NOCOLOR, 0,0,0, /* TabPicture, TabPictureDisabled and TabPictureHot */ FALSE, /* has tab close button */ 0,0,0,0,0, /* gap2, TabPicture2, TabPicture2Active, TabPicture2Disabled, TabPicture2Hot */ }; static const SFTTABS_TAB Tab1 = { /*Other &Images */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color (when selected) */ { SFTTABS_GRAPH_LEFT, 0 }, /* location */ TRUE, /* enabled/disabled */ 0, /* userdata */ 0, /* reserved */ NULL, /* reserved */ SFTTABS_NOCOLOR, /* Flyby foreground color */ SFTTABS_NOCOLOR, /* Client area background color */ 0,0,0,0, /* animation values */ NULL, /* tab-specific ImageList handle*/ FALSE, /* hidden tab */ SFTTABS_NOCOLOR, /* gradient fill background color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill background color, active tab */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill client area color */ SFTTABS_NOCOLOR, 0,0,0, /* TabPicture, TabPictureDisabled and TabPictureHot */ FALSE, /* has tab close button */ 0,0,0,0,0, /* gap2, TabPicture2, TabPicture2Active, TabPicture2Disabled, TabPicture2Hot */ }; static const SFTTABS_TAB Tab2 = { /*Other Tab &Styles */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* background, foreground color (when selected) */ { SFTTABS_GRAPH_NONE, 0 }, /* location */ TRUE, /* enabled/disabled */ 0, /* userdata */ 0, /* reserved */ NULL, /* reserved */ SFTTABS_NOCOLOR, /* Flyby foreground color */ SFTTABS_NOCOLOR, /* Client area background color */ 0,0,0,0, /* animation values */ NULL, /* tab-specific ImageList handle*/ FALSE, /* hidden tab */ SFTTABS_NOCOLOR, /* gradient fill background color */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill background color, active tab */ SFTTABS_NOCOLOR, SFTTABS_NOCOLOR, /* gradient fill client area color */ SFTTABS_NOCOLOR, 0,0,0, /* TabPicture, TabPictureDisabled and TabPictureHot */ FALSE, /* has tab close button */ 0,0,0,0,0, /* gap2, TabPicture2, TabPicture2Active, TabPicture2Disabled, TabPicture2Hot */ }; ///////////////////////////////////////////////////////////////////////////// // CMainDlg dialog CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/) : CSftTabsDialog(CMainDlg::IDD, pParent) { //{{AFX_DATA_INIT(CMainDlg) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT // Get the required bitmaps, icons m_SampleBitmap.LoadBitmap(IDB_SMILE);/* Load bitmap */ m_hIcon = AfxGetApp()->LoadIcon(1); m_hSampleIcon = AfxGetApp()->LoadIcon(IDI_ICON); m_ImgList.Create(IDB_TOOLBAR, 16, 0, RGB(255,0,0)); m_GDIPlusImage = (Gdiplus::Image*)SftTabs_LoadGDIPlusImageFromResource(AfxGetApp()->m_hInstance, TEXT("PNG"), MAKEINTRESOURCE(IDR_IMAGE)); m_GDIPlusImageHot = (Gdiplus::Image*)SftTabs_LoadGDIPlusImageFromResource(AfxGetApp()->m_hInstance, TEXT("PNG"), MAKEINTRESOURCE(IDR_IMAGE_HOT)); m_GDIPlusImageDisabled = (Gdiplus::Image*)SftTabs_LoadGDIPlusImageFromResource(AfxGetApp()->m_hInstance, TEXT("PNG"), MAKEINTRESOURCE(IDR_IMAGE_DISABLED)); } CMainDlg::~CMainDlg() { if (m_GDIPlusImage) delete m_GDIPlusImage; if (m_GDIPlusImageHot) delete m_GDIPlusImageHot; if (m_GDIPlusImageDisabled) delete m_GDIPlusImageDisabled; } void CMainDlg::DoDataExchange(CDataExchange* pDX) { CSftTabsDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMainDlg) DDX_Control(pDX, IDC_NEXT, m_CtlNext); DDX_Control(pDX, IDC_BACK, m_CtlBack); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CMainDlg, CSftTabsDialog) //{{AFX_MSG_MAP(CMainDlg) ON_BN_CLICKED(IDC_BACK, OnBack) ON_BN_CLICKED(IDC_NEXT, OnNext) //}}AFX_MSG_MAP ON_SFTTABSN_SWITCHED(IDC_TAB, OnTabSwitched) ON_SFTTABSN_LBUTTONDOWN_IMAGE(IDC_TAB, OnTabImageClicked) ON_SFTTABSN_LBUTTONDBLCLK_IMAGE(IDC_TAB, OnTabImageDblClicked) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMainDlg message handlers BOOL CMainDlg::OnInitDialog() { CSftTabsDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon int index; SFTTABS_TAB Tab; /* Associate the tab control created from the dialog */ /* resource with the C++ object. */ m_Tab.SubclassDlgItem(IDC_TAB, this /* parent window */); /* You could use DDX/DDV instead and add the following */ /* line to the DoDataExchange function of the tab */ /* control's parent window (remove the //). */ // DDX_Control(pDX, IDC_TAB, m_Tab); /* Initialization is faster if we set redraw off */ m_Tab.SetRedraw(FALSE); /* We are using new features */ m_Tab.SetVersion(SFTTABS_6_5); index = m_Tab.AddTab(_T("&GDI+ Images")); Tab = Tab0; Sft_SetPictureGDIPlusImage(&Tab.TabPicture, m_GDIPlusImage); Sft_SetPictureGDIPlusImage(&Tab.TabPictureHot, m_GDIPlusImageHot); Sft_SetPictureGDIPlusImage(&Tab.TabPictureDisabled, m_GDIPlusImageDisabled); m_Tab.SetTabInfo(index, &Tab); m_Tab.SetTabDialog(index, new CPage1(this)); /* tab page */ index = m_Tab.AddTab(_T("Other &Images")); Tab = Tab1; m_Tab.SetTabInfo(index, &Tab); m_Tab.SetTabDialog(index, new CPage2(this)); /* tab page */ index = m_Tab.AddTab(_T("Other Tab &Styles")); m_Tab.SetTabInfo(index, &Tab2); m_Tab.SetTabDialog(index, new CPage3(this)); /* tab page */ m_Tab.SetControlInfo(&CtlInit); // Make sure to turn redraw back on m_Tab.SetRedraw(TRUE); m_Tab.InvalidateRect(NULL, TRUE); // If you are not using the sheet/page classes, remove the call to InitializeTabControl. // Initialize tab control InitializeTabControl(0, &m_Tab, NULL); return FALSE; // if this is a dialog's OnInitDialog member function } void CMainDlg::OnTabSwitched( ) { int currTab; BOOL fNext = TRUE, fBack = TRUE; currTab = m_Tab.GetCurrentTab(); if (currTab == 0) fBack = FALSE; else if (currTab >= m_Tab.GetCount()-1) fNext = FALSE; m_CtlBack.EnableWindow(fBack); m_CtlNext.EnableWindow(fNext); } void CMainDlg::OnTabImageDblClicked( ) { OnTabImageClicked(); } void CMainDlg::OnTabImageClicked() { int iTab = m_Tab.GetNextTab(); SFTTABS_TAB Tab; m_Tab.GetTabInfo(iTab, &Tab); // retrieve tab information if (Sft_IsPictureCheckBox(&Tab.TabPicture)) { BOOL fChecked; // it's a checkbox, so make sure to cancel this event so we don't switch tabs. m_Tab.SendMessage(WM_CANCELMODE); // change the checkbox state fChecked = Tab.TabPicture.Picture.CheckBox.state; fChecked = !fChecked; Sft_SetPictureCheckBox(&Tab.TabPicture, fChecked, 16, 16, TRUE); m_Tab.SetTabInfo(iTab, &Tab); // save the new tab settings } } void CMainDlg::OnBack() { m_Tab.SwitchTab(FALSE); } void CMainDlg::OnNext() { m_Tab.SwitchTab(TRUE); }