Using C++ Class Library DigitalPaint Tools

To start a project and add code that creates a new paint window:

Step 1

  1. Start Visual Studio.
  2. Select the File->New menu option, click the "projects" tab.
  3. From Project Types click on Visual C++ to expand it, then select MFC. From the right window select MFC Application.
  4. In the Project Name dialog box, enter "Tutorial".
  5. In the Location dialog box, use the <LEADTOOLS_INSTALLDIR>\Examples\Main\ClassLibrary directory of your LEAD installation. Click OK. Then click Next
  6. Choose Multiple Document and click "Next".
  7. The "MFC AppWizard step 3 of 8", appears. Keep the default settings and press the "Next" Button.
  8. The "MFC AppWizard step 4 of 8", appears. Keep the default settings and press the "Next" Button.
  9. The "MFC AppWizard step 5 of 8", appears. Keep the default settings and press the "Next" Button.
  10. The "MFC AppWizard step 6 of 8", appears. Check "None" radio button under "Toolbars" and press the "Next" Button.
  11. The "MFC AppWizard step 7 of 8", appears. Uncheck the "Printing and print preview" combo box and press the "Finish" Button.

Step 2

In stdafx.h add the following headers: (keep in mind, you may have to change the path to where the header files reside):

#include "..\..\..\..\..\include\ClassLib\ltWrappr.h" 

Step 3

  1. Click on the "Class View" tab.
  2. Click to open the Tutorial Classes branch.
  3. Click "CTutorialApp", and then double click the CTutorialApp() constructor.
  4. Add the following lines after //TODO: add construction code here:

    L_TCHAR * pszLicenseFile = L"Replace this with the path to the LEADTOOLS license file";   
    L_TCHAR * pszDeveloperKey = L"Replace this with your developer key"; 
    LSettings::SetLicenseFile(pszLicenseFile, pszDeveloperKey); 
    LBase::LoadLibraries(LT_PDG|LT_KRN|LT_FIL|LT_DLG|LT_AUT|LT_CON|LT_TLB|LT_DIS); 
    LDialogBase::Initialize(DLG_INIT_COLOR); 

  5. Click on the "Class View" tab.

  6. Click to open the Tutorial Classes branch.
  7. Right click on "CTutorialApp", and select "Add Function
  8. In the Add Member Function Dialog, enter "~CTutorialApp" for the Function name and enter void for the return type and then press Finish.
  9. Add the following lines inside the generated function":
    LDialogBase::Free(); 
    LBase::UnloadLibraries(LT_PDG|LT_KRN|LT_FIL|LT_DLG|LT_AUT|LT_CON|LT_TLB|LT_DIS); 

Step 4

  1. Click on the "Class View" tab.
  2. Click to open the Tutorial Classes branch.
  3. Click "CTutorialApp", and then double click the InitInstance() function.
  4. Add the following lines after the call to the ParseCommandLine function:
    //Hide the Auto appearance window (View)   
    cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; 

Step 5

Create a new file called Imports.cpp in place it beside your project files:

  1. In the Project Workspace, click the Solution Explorer tab.
  2. Double-click the Automated folder to open it.
  3. Right-click the Source files folder and select Add New item.
  4. Right-click on the Source file.
  5. Expand Visual C++ tree, if it is not already expanded.
  6. Select Code from the sub tree.
  7. Select C++ File (.cpp) from the right window.
  8. In the name text box, specify Imports.
  9. Click the OK button.
  10. Double-click the Imports.cpp file in the solution Explorer and add the following lines:
    #include "StdAfx.h"   
    #if defined(WIN64)   
       #pragma comment(lib, "..\\..\\..\\..\\..\\Lib\\CDLL\\x64\\Ltwvc_x.lib")   
    #else   
       #pragma comment(lib, "..\\..\\..\\..\\..\\Lib\\CDLL\\Win32\\Ltwvc_u.lib")   
    #endif // #if defined(WIN64) 

Step 6

  1. Click on the "Class View" tab.
  2. Double click on "CTutorialView"
  3. Add the following public variables:
    LRasterPaintWindow m_RasterPntWnd;   
    LRasterDialog m_PaintDialog; 

Step 7

  1. Go to TutorialView.h file then add the following function declaration:
    public:   
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 
  2. Go to TutorialView.cpp file then add the following line between the BEGIN_MESSAGE_MAP and END_MESSAGE_MAP:
    ON_WM_CREATE() 
  3. Add the following function:
    int CTutorialView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    { 
       if(CView::OnCreate(lpCreateStruct) == -1) 
          return -1; 
       m_RasterPntWnd.SetWndHandle(m_hWnd); 
       return 1; 
    } 

Step 8

  1. Click on the "Class View" tab.
  2. Right click "CMainFrame" and select "Add Variable..."
  3. Add the following variable:
    protected:   
       LToolbar m_LToolbar; 

Step 9

  1. Click on the "Class View" tab.
  2. Click to open the Tutorial Classes branch.
  3. Click "CMainFrame", and then double click the "OnCreate" function.
  4. Add the following lines before the last "return 0;" line:
    LRasterPaintWindow::Initialize(); 
    LRasterPaintWindow::CreateToolbar(&m_LToolbar, m_hWnd, TEXT("Test Toolbar")); 
    LRasterPaintWindow::SetToolbar(&m_LToolbar); 
    POINT ptPos = {0, 0}; 
    RECT  rcClient; 
    CMainFrame::GetClientRect(&rcClient); 
    ptPos.x = rcClient.left + 2; 
    ptPos.y = rcClient.top + 2; 
    CMainFrame::ClientToScreen(&ptPos); 
    LRasterPaintWindow::SetToolbarPosition(&ptPos); 
    LRasterPaintWindow::ShowToolbar(TRUE); 

Step 10

  1. Go to MainFrm.h file then add the following function declaration:
    afx_msg void OnClose(); 
  2. Go to MainFrm.cpp file then add the following line between the BEGIN_MESSAGE_MAP and END_MESSAGE_MAP:
    ON_WM_CLOSE() 
  3. Add the following function:
    void CMainFrame::OnClose() 
    { 
       LRasterPaintWindow::FreeToolbar(&m_LToolbar); 
       LRasterPaintWindow::Free(); 
        
       CMDIFrameWnd::OnClose(); 
    } 

Step 11

Handle Save & Update UI for it

  1. Click on the "Resource View" tab.
  2. Click on the Menu folder to expand it. Then double click IDR_TutorialTYPE to edit the menu.
  3. Click on the File menu, then right click on the Save item and click "Add event handler"
  4. From Class list select CTutorialDoc and make sure that the "COMMAND" is selected on the Message Type window, then click the "Add and Edit" button. Add the following lines of code after the // TODO" comment line:
    POSITION        pos   =   GetFirstViewPosition();   
    CTutorialView*   pView = (CTutorialView*) GetNextView(pos);   
    LBitmapBase* pLBtmpbase = pView->m_RasterPntWnd.GetBitmap();   
    BOOL bFlag = AfxGetMainWnd()->EnableWindow(FALSE);   
    SAVEDLGPARAMS SaveParms;   
    OPENFILENAME  OpenFileName;   
    memset(&SaveParms, 0, sizeof(SAVEDLGPARAMS));   
    memset(&OpenFileName, 0, sizeof(OPENFILENAME));   
    OpenFileName.lStructSize     = sizeof(OPENFILENAME);   
    OpenFileName.lpstrInitialDir = NULL;   
    OpenFileName.lpstrTitle      = _T("Save a File");   
    OpenFileName.nFilterIndex    = 0;   
    SaveParms.uStructSize       = sizeof(SAVEDLGPARAMS);   
    SaveParms.nQFactor    = 2;   
    SaveParms.nPageNumber = 1;   
    SaveParms.nStampBits    = 24;   
    SaveParms.nStampWidth   = 120;   
    SaveParms.nStampHeight  = 120;   
    SaveParms.nBitsPerPixel = 24;   
    SaveParms.nFormat       = FILE_BMP;   
    SaveParms.uSaveMulti  = MULTIPAGE_OPERATION_REPLACE;   
    SaveParms.uDlgFlags   = DLG_SAVE_SHOW_FILEOPTIONS_PROGRESSIVE        |   
                               DLG_SAVE_SHOW_FILEOPTIONS_MULTIPAGE       |   
                               DLG_SAVE_SHOW_FILEOPTIONS_STAMP           |   
                               DLG_SAVE_SHOW_FILEOPTIONS_QFACTOR         |   
                               DLG_SAVE_SHOW_FILEOPTIONS_J2KOPTIONS      |   
                               DLG_SAVE_SHOW_FILEOPTIONS_BASICJ2KOPTIONS;   
    pLBtmpbase->DialogFile()->SetSaveParams(&SaveParms);   
    pLBtmpbase->DialogFile()->SetOpenFile(&OpenFileName);   
    pLBtmpbase->DialogFile()->EnableAutoProcess(TRUE);   
    L_INT nRetCode = pLBtmpbase->DialogFile()->DoModalSave(pView->m_hWnd);   
    if(nRetCode!=SUCCESS_DLG_OK && nRetCode!=SUCCESS_DLG_CANCEL)   
       pView->MessageBox(_T("Can't Save to file, check if file is read only."), _T("File Save Error"), MB_ICONWARNING | MB_OK);   
    bFlag = AfxGetMainWnd()->EnableWindow(TRUE);   
    AfxGetMainWnd()->SetActiveWindow(); 

Step 12

  1. Click on the "Resource View" tab.
  2. Click on the Menu folder to expand it. Then double click IDR_TutorialTYPE to show the menu on the right window.
  3. Click on the File menu, then right click on the Save item and click "Add event handler"
  4. From Message Type select "UPDATE_COMMAND_UI ", and from Class list select CTutorialDoc. Then click the "Add and Edit" button.
  5. Add the following lines of code after the // TODO" comment line:
    pCmdUI->Enable(m_RasterPntWnd.GetBitmap()->IsAllocated()); 

Step 13

Handle Open & Update UI

  1. Click on the "Resource View" tab.
  2. Click on the Menu folder to expand it. Then double click IDR_MAINFRAME to show the menu on the right window.
  3. Click on the File menu, then right click on the Open item and click Properties. In ID field, set the ID to IDM_FILE_OPEN.
  4. Click on the File menu, then right click on the Open item and click "Add event handler"
  5. From Class list select CTutorialApp and make sure that the "COMMAND" is selected on the Message Type window, then click the "Add and Edit" button.
  6. Add the following lines of code after the // TODO comment line:

    OPENDLGPARAMS FOParm; 
    OPENFILENAME  OpenFileName; 
    memset(&FOParm, 0, sizeof(OPENDLGPARAMS)); 
    memset(&OpenFileName, 0, sizeof(OPENFILENAME)); 
    OpenFileName.lStructSize       = sizeof(OPENFILENAME); 
    OpenFileName.lpstrInitialDir   = NULL; 
    OpenFileName.Flags             = OFN_EXPLORER; 
    FOParm.uStructSize      = sizeof(OPENDLGPARAMS); 
    FOParm.uDlgFlags        = DLG_OPEN_ENABLESIZING | 
    DLG_OPEN_SHOW_PROGRESSIVE    | 
    DLG_OPEN_USEFILESTAMP        | 
    DLG_OPEN_SHOW_MULTIPAGE      | 
    DLG_OPEN_SHOW_LOADROTATED    | 
    DLG_OPEN_SHOW_LOADCOMPRESSED | 
    DLG_OPEN_SHOW_DELPAGE        | 
    DLG_OPEN_SHOW_LOADOPTIONS    | 
    DLG_OPEN_SHOW_FILEINFO       | 
    DLG_OPEN_SHOW_PDFOPTIONS     | 
    DLG_OPEN_SHOW_RASTEROPTIONS  | 
    DLG_OPEN_SHOW_VECTOROPTIONS  | 
    DLG_OPEN_VIEWTOTALPAGES; 
    FOParm.bPreviewEnabled = TRUE; 
    m_LBitmap.DialogFile()->SetOpenParams(&FOParm); 
    m_LBitmap.DialogFile()->EnablePreview(TRUE); 
    m_LBitmap.DialogFile()->SetOpenParams(&OpenFileName); 
    m_LBitmap.DialogFile()->EnableCallBack(FALSE); 
    L_INT nRetCode = m_LBitmap.DialogFile()->DoModalOpen(m_pMainWnd->m_hWnd); 
    if(nRetCode==SUCCESS_DLG_OK) 
    { 
       L_TCHAR szFileName[256]; 
       memset(szFileName,0,sizeof(szFileName)); 
       L_UINT uSize=sizeof(szFileName); 
       m_LBitmap.GetFileName(szFileName,&uSize); 
       m_LBitmap.DialogFile()->GetOpenParams(&FOParm,sizeof(FOParm)); 
       POSITION pos = GetFirstDocTemplatePosition(); 
       CDocTemplate* pDocTemplate = GetNextDocTemplate(pos); 
       pDocTemplate->OpenDocumentFile(szFileName); 
    } 

  7. Click on the "Class View" tab.

  8. Double click on "CTutorialApp"
  9. Add the following public variables:
    public:   
    LBitmapBase m_LBitmap; 

Step 14

  1. Click on the "Class View" tab.
  2. Click to open the "Tutorial Classes" branch.
  3. Right click on the "CTutorialDoc" to choose Properties
  4. From the "Properties" window toolbar, click on the overrides icon. Then click on the empty area beside the item "OnOpenDocument" and choose OnOpenDocument.
  5. Replace return statement with the following code:

    CTutorialApp*  pTheApp =  (CTutorialApp*)  AfxGetApp(); 
    POSITION      pos = GetFirstViewPosition(); 
    CTutorialView* pView = (CTutorialView*)GetNextView(pos); 
    FILEINFO          fInfo; 
    OPENDLGPARAMS     FOParm; 
    memset(&FOParm, 0, sizeof(OPENDLGPARAMS)); 
    memset(&fInfo, 0, sizeof(FILEINFO)); 
    fInfo.uStructSize =  sizeof(FILEINFO); 
    LBitmapBase LBtmpbase; 
    pTheApp->m_LBitmap.DialogFile()->GetOpenParams(&FOParm, sizeof(OPENDLGPARAMS)); 
    LBtmpbase.SetFileName((L_TCHAR *)lpszPathName); 
    LBtmpbase.File()->GetInfo(&fInfo, sizeof(FILEINFO), FILEINFO_TOTALPAGES, NULL); 
    L_INT nBitsPerPixel = fInfo.BitsPerPixel; 
    if(nBitsPerPixel != 1 && nBitsPerPixel != 4 && nBitsPerPixel != 8 && nBitsPerPixel != 16 && nBitsPerPixel != 24) 
    { 
       pView->MessageBox(_T("Your image format is not either 1,4,8,16 or 24 bits per pixel"), _T("Error Opening Image"), MB_ICONWARNING | MB_OK); 
       return FALSE; 
    } 
    L_INT nRetCode = LBtmpbase.Load(fInfo.BitsPerPixel, ORDER_BGRORGRAY, (FOParm.pFileData)? FOParm.pFileData[0].nPageNumber : 1); 
    if(nRetCode!=SUCCESS) 
       LBase::DisplayError(NULL, nRetCode); 
    else 
       pView->m_RasterPntWnd.SetBitmap(&LBtmpbase); 
    return((nRetCode == SUCCESS) ? TRUE : FALSE); 

  6. Open the "TutorialDoc.cpp" file from the "File View" tab.

  7. Add this include statement after the #include "TutorialDoc.h"
    #include "TutorialView.h" 

Step 15

Delete Save As menu Item
Delete New Menu Item
Delete Resent Files Menu Item

  1. Move to the "Resource View" tab.
  2. Double click the "Tutorial resources" to expand the branch.
  3. Double click the "Menu" item from the tree to show the available menus.
  4. Double click on the "IDR_MAINFRAME" item to view the menu.
  5. Select "File"New" form the displayed menu bar and press the "Del" key to delete this menu item.
  6. Do the same with the "Recent File" and the Separator menu items.
  7. Now double click on the "IDR_TutorialTYPE" item from the "Resource View" tab to view this menu.
  8. Delete the New, "Save As", "Recent File" and the Separator menu items from the "File" menu as we did in step (5).

Step 16

Handling Palette Changes

  1. Open the "Tutorial.h" file from the "File View" tab.
  2. Add this define statement after the #include "resource.h" // main symbols statement

    #define WM_HANDLEPALETTE WM_APP + 0 

  3. Click on the "Class View" tab.

  4. Right-click on the "CMainFrame" and select "Properties".
  5. From the "Properties" window toolbar, click on the Message icon. Then click on the empty area beside the item "WM_PALETTECHANGED" and choose OnPaletteChanged
  6. Add the following lines of code after the " void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) line:

    if(pFocusWnd!=NULL)   
       SendMessageToDescendants(WM_HANDLEPALETTE,(WPARAM)pFocusWnd ->m_hWnd, TRUE);   
      

  7. Right click "CMainFrame" and select "Properties".

  8. From the "Properties" window toolbar, click on the Message icon. Then click on the empty area beside the item " WM_QUERYNEWPALETTE" and choose OnQueryNewPalette
  9. Replace the "return CMDIFrameWnd::OnQueryNewPalette();" statement with the following lines of code:

    CMDIChildWnd* pMDIChildWnd = MDIGetActive(); 
    if(pMDIChildWnd!=NULL) 
    { 
       CView* pView = pMDIChildWnd->GetActiveView(); 
       if(pView!=NULL) 
       { 
          pView->SendMessage(WM_HANDLEPALETTE,0,FALSE); 
          return TRUE; 
       } 
    } 
    return FALSE; 

  10. Right click "CMainFrame" and select "Properties".

  11. From the "Properties" window toolbar, click on the Message icon. Then click on the empty area beside the item " WM_SYSCOLORCHANGE" and choose OnSysColorChange
  12. Replace the "CMDIFrameWnd::OnSysColorChange();" statement with the following line of code which actually calls the OnQueryNewPalette() function:

    OnQueryNewPalette(); 

  13. Right click " CTutorialView" and select "Properties".

  14. From the "Properties" window toolbar, click on the overrides icon. Then click on the empty area beside the item "OnActivateView" and choose OnActivateView
  15. Write the following lines of code after the // TODO: Add your specialized code here and/or call the base class statement:

    if(bActivate==TRUE&&pActivateView==this)   
       m_RasterPntWnd.HandlePalette(WM_QUERYNEWPALETTE,0,0); 

  16. Open the "TutorialView.h" file from the "Soluation Explorer" tab and add the following line before the DECLARE_MESSAGE_MAP() statement:

    afx_msg LRESULT OnHandlePalette(WPARAM wParam, LPARAM lParam); 

  17. Open the "TutorialView.cpp" file from the "File View" tab and add the following line before the END_MESSAGE_MAP() statement:
    ON_MESSAGE(WM_HANDLEPALETTE,OnHandlePalette) 
  18. Now add the following lines of code to the end of the "TutorialView.cpp" file:
    LRESULT CTutorialView::OnHandlePalette(WPARAM wParam, LPARAM lParam) 
    { 
       if(lParam==TRUE) 
       { 
          if(m_RasterPntWnd.HandlePalette(WM_PALETTECHANGED, wParam, 0)==FALSE) 
             m_RasterPntWnd.Repaint(); 
       } 
       else 
       { 
          if(m_RasterPntWnd.HandlePalette(WM_QUERYNEWPALETTE, 0, 0)==FALSE) 
             m_RasterPntWnd.Repaint(); 
       } 
       return TRUE; 
    } 

Step 17

Show / Hide the Tool bar

  1. Move to the "Resource View" tab.
  2. Double click the "Tutorial" to expand the branch.
  3. Double click the "Menu" item from the tree to show the available menus.
  4. Double click on the "IDR_MAINFRAME" item to view the menu.
  5. Click on the "View" menu to view the menu items.
  6. Add a new menu item "&Toolbar" to the menu.
  7. Now do the same with the "IDR_TutorialTYPE" menu.
  8. Right-click on the "Toolbar" menu item and choose "Add Event Handler&"
  9. Select "Message Maps" tab and select " CMainFrame " as the Class name
  10. Select "COMMAND" from the Messages list box.
  11. Click the "Add and Edit" button.
  12. Add the following line of code inside the generated function body:

    LRasterPaintWindow::ShowToolbar(!m_LToolbar.IsVisible()); 

  13. Right-click again on the "Toolbar" menu item and choose "Add Event Handler&"

  14. Select "Message Maps" tab and select " CMainFrame " as the Class name
  15. Select "UPDATE_COMMAND_UI" from the Messages list box.
  16. Click the "Add and Edit" button.
  17. Add the following line of code inside the generated function body:
    pCmdUI->SetCheck(m_LToolbar.IsVisible()); 

Step 18

Here we will be dealing with one of the paint dialogs, which is the "Brush" dialog:

  1. Move to the "Resource View" tab.
  2. Double click the "Tutorial" to expand the branch.
  3. Double click the "Menu" item from the tree to show the available menus.
  4. Double click on the "IDR_TutorialTYPE" item to view the menu.
  5. Click on the empty menu and then type "&Properties"
  6. Drag the new menu next to the "Help" menu and drop it before the "Help" menu.
  7. A new menu item will appear within the created menu "Properties".
  8. Click on the empty menu item and enter "&Brush"
  9. Right-click on "&Brush" menu item and select "Add Event Handler&"
  10. Select "Message Maps" tab and select " CTutorialView" as the Class name.
  11. Select "COMMAND" from the Messages list box.
  12. Click the "Add and Edit" button.
  13. Add the following line of code inside the generated function body:

    CTutorialApp*   pTheApp = (CTutorialApp*)AfxGetApp(); 
    PAINTDLGBRUSHINFO   BrushDlgInfo; 
    PAINTBRUSH*   pPaintBrush = m_RasterPntWnd.GetPaintBrush(); 
    L_INT      nRetCode; 
    L_TCHAR*      TouchBitmap [ ] = { TEXT("Leaf") }; 
    L_TCHAR*      TextureBitmap [ ] = { TEXT("Texture-00") }; 
    BrushDlgInfo.dwFlags                 = PAINT_DLG_BRUSH_SHOWALL; 
    BrushDlgInfo.pszTitle                = TEXT("Paintbrush Properties"); 
    BrushDlgInfo.nContentsType           = pPaintBrush->Touch.nContentsType; 
    BrushDlgInfo.crColor                 = pPaintBrush->Touch.crColor; 
    BrushDlgInfo.ppszTouchImage          = TouchBitmap; 
    BrushDlgInfo.uTouchImageCount        = 1; 
    BrushDlgInfo.nActiveTouchImageItem   = 0; 
    BrushDlgInfo.nDiameter               = pPaintBrush->nDiameter; 
    BrushDlgInfo.nHardnessValue          = pPaintBrush->Hardness.nValue; 
    BrushDlgInfo.nSpacing                = pPaintBrush->nSpacing; 
    BrushDlgInfo.nDensity                = pPaintBrush->nDensity; 
    BrushDlgInfo.nOpacity                = pPaintBrush->nOpacity; 
    BrushDlgInfo.nFadeOutRate            = pPaintBrush->nFadeOutRate; 
    BrushDlgInfo.ppszPaperTexture        = TextureBitmap; 
    BrushDlgInfo.uPaperTextureCount      = 1; 
    BrushDlgInfo.nActivePaperTextureItem = ((pPaintBrush->pTexture != NULL) ? 0 : -1); 
    nRetCode = m_PaintDialog.DoModalBrush(m_hWnd, &BrushDlgInfo); 
    if(nRetCode == SUCCESS) 
    { 
       pPaintBrush->nSize                      = sizeof(PAINTBRUSH); 
       pPaintBrush->dwMask                     = PBF_ALL; 
       pPaintBrush->Touch.nContentsType        = BrushDlgInfo.nContentsType; 
       pPaintBrush->Touch.crColor              = BrushDlgInfo.crColor; 
       pPaintBrush->Touch.nShape               = PAINT_TOUCH_SHAPE_CIRCLE; 
       pPaintBrush->Touch.pBitmap              = ((BrushDlgInfo.nActiveTouchImageItem != -1) ? pTheApp->m_LBtmpBrush.GetHandle() : NULL); 
       pPaintBrush->Touch.crTransparentColor   = RGB(0, 0, 0); 
       pPaintBrush->nDiameter                  = BrushDlgInfo.nDiameter; 
       pPaintBrush->Hardness.nDistributionType = PAINT_HARDNESS_DISTRB_TYPE_0; 
       pPaintBrush->Hardness.nValue        = BrushDlgInfo.nHardnessValue; 
       pPaintBrush->nSpacing                    = BrushDlgInfo.nSpacing; 
       pPaintBrush->nDensity                    = BrushDlgInfo.nDensity; 
       pPaintBrush->nOpacity                    = BrushDlgInfo.nOpacity; 
       pPaintBrush->nFadeOutRate           = BrushDlgInfo.nFadeOutRate; 
       pPaintBrush->pTexture                    = ((BrushDlgInfo.nActivePaperTextureItem != -1) ? pTheApp->m_LBtmpPaperTexture.GetHandle(): NULL); 
       m_RasterPntWnd.SetPaintBrush(pPaintBrush); 
    } 

  14. Click on the "Class View" tab.

  15. Double click on "CTutorialApp"
  16. Add the following public variables:

    LBitmapBase m_LBtmpBrush;   
    LBitmapBase m_LBtmpPaperTexture; 

  17. Copy the bitmaps you want to use in the dialog to the "Res" folder in your current directory.

  18. Now move to the "Resource View" tab.
  19. Right click on the "Tutorial.rc and select Add resource. In Add Resource dialog click Import
  20. In the "Import Resource" dialog browse to the LEADTOOLS "Images" directory (C:\LEADTOOLS22\Resources\Images), and select one of the bitmap files (ex. ULAY1.BMP) then click Open.
  21. Right click on the new added bitmap and select "Properties".
  22. Change the "ID" edit box to "IDB_BITMAP_BRUSH" and close the dialog.
  23. Repeat steps (29-32) to load a second bitmap (ex. ULAY2.BMP) and give it the following ID "IDB_PAPER_TEXTURE"
  24. Move to the "Class View" tab.
  25. Right click on the "CTutorialApp" class and select Add Add Function.
  26. Enter "void" in the "Return Type" edit box and enter "LoadImages" statement in the "Function name" edit box "Press "Finish".
  27. Add the following lines of code to the function body:

    DIBSECTION dibsc;   
    BITMAPHANDLE TempBtmapHandle;   
    // load paper texture image.   
    HANDLE hBitmap = LoadImage(AfxGetInstanceHandle(),   
       MAKEINTRESOURCE(IDB_PAPER_TEXTURE), IMAGE_BITMAP, 0, 0,   
       LR_CREATEDIBSECTION | LR_DEFAULTSIZE);   
    GetObject(hBitmap , sizeof(DIBSECTION), &dibsc);   
    m_LBtmpPaperTexture.SetHandle(&TempBtmapHandle);   
    m_LBtmpPaperTexture.ConvertFromDIB((LPBITMAPINFO) &dibsc.dsBmih, (L_UCHAR*)dibsc.dsBm.bmBits);   
    m_LBtmpPaperTexture.ChangeViewPerspective(TOP_LEFT);   
    DeleteObject((HBITMAP) hBitmap);   
    // load the brush image.   
    hBitmap = LoadImage(AfxGetInstanceHandle(),   
             MAKEINTRESOURCE(IDB_BITMAP_BRUSH), IMAGE_BITMAP, 0, 0,   
       LR_CREATEDIBSECTION | LR_DEFAULTSIZE);   
    GetObject(hBitmap , sizeof (DIBSECTION), &dibsc);   
    m_LBtmpBrush.SetHandle(&TempBtmapHandle);   
    m_LBtmpBrush.ConvertFromDIB((LPBITMAPINFO) &dibsc.dsBmih, (L_UCHAR *)dibsc.dsBm.bmBits);   
    m_LBtmpBrush.ChangeViewPerspective(TOP_LEFT);   
    DeleteObject((HBITMAP) hBitmap); 

  28. Right click on the "CTutorialApp" class and select Add Add Function.

  29. Enter "void" in the "Return Type" edit box and enter "FreeImages" statement in the "Function Name" edit box "Press "Finish".
  30. Add the following lines of code to the function body:
    m_LBtmpBrush.Free();   
    m_LBtmpPaperTexture.Free(); 
  31. Add the following statement to the "InitInstance()" function in the "Tutorial.cpp" file before the "return TRUE" statement:
    LoadImages(); 
  32. Add the following statement at the end of the "~CTutorialApp()" function in the "Tutorial.cpp" file.
    FreeImages(); 
Help Version 22.0.2021.8.20
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.

LEADTOOLS DigitalPaint C++ Class Library Help
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2021 LEAD Technologies, Inc. All Rights Reserved.