home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / Chapt_10 / Bitmaps / Bitmaps.cpp next >
C/C++ Source or Header  |  2000-05-25  |  31KB  |  1,247 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : bitmaps.cpp                                                         //
  10. //  Description: Basic bitmap demo program, Chapter 10                               //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define _WIN32_WINNT 0x0500
  16. #define NOCRYPT
  17. #define OEMRESOURCE
  18.  
  19. #include <windows.h>
  20. #include <assert.h>
  21. #include <tchar.h>
  22. #include <math.h>
  23.  
  24. #include "..\..\include\wingraph.h"
  25. #include "..\..\include\CheckMark.h"
  26. #include "..\..\include\BitmapMenu.h"
  27. #include "..\..\include\EditView.h"
  28. #include "..\..\include\Background.h"
  29.  
  30. #include "Resource.h"
  31.  
  32. BOOL SaveWindow(HWND hWnd, bool bClient, int nFrame, COLORREF crFrame);
  33.  
  34. class KDIBView : public KScrollCanvas
  35. {
  36.     typedef enum { GAP = 16 };
  37.  
  38.     virtual void    OnDraw(HDC hDC, const RECT * rcPaint);
  39.     virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  40.     void            GetWndClassEx(WNDCLASSEX & wc);
  41.     
  42.     HMENU            m_hViewMenu;
  43.     int                m_nViewOpt;
  44.  
  45. public:
  46.  
  47.     HINSTANCE        m_hInst;
  48.     KDIB            m_DIB;
  49.  
  50.     KDIBView(void)
  51.     {
  52.         m_hViewMenu = NULL;
  53.         m_nViewOpt  = IDM_VIEW_STRETCHDIBITS;
  54.     }
  55.  
  56.     bool Initialize(const TCHAR * pFileName, HINSTANCE hInstance, KStatusWindow * pStatus)
  57.     {
  58.         if ( m_DIB.LoadFile(pFileName) )
  59.         {
  60.             SetSize(m_DIB.GetWidth()  + GAP*2,
  61.                     m_DIB.GetHeight() + GAP*2, 5, 5);
  62.  
  63.             m_hInst   = hInstance;
  64.             m_pStatus = pStatus;
  65.  
  66.             RegisterClass(_T("DIBView"), hInstance);
  67.             
  68.             return true;
  69.         }
  70.         else
  71.             return false;
  72.     }
  73.  
  74.     bool GetTitle(const TCHAR * pFileName, TCHAR * pTitle)
  75.     {
  76.         if ( pFileName )
  77.         {
  78.             wsprintf(pTitle, "%s, %d x %d pixel, %d bits", pFileName,
  79.                 m_DIB.GetWidth(), m_DIB.GetHeight(), m_DIB.GetDepth());
  80.  
  81.             return true;
  82.         }
  83.         else
  84.             return false;
  85.     }
  86. };
  87.  
  88.  
  89. void KDIBView::GetWndClassEx(WNDCLASSEX & wc)
  90. {
  91.     memset(& wc, 0, sizeof(wc));
  92.  
  93.     wc.cbSize         = sizeof(WNDCLASSEX);
  94.     wc.style          = CS_HREDRAW | CS_VREDRAW;
  95.     wc.lpfnWndProc    = WindowProc;
  96.     wc.cbClsExtra     = 0;
  97.     wc.cbWndExtra     = 0;       
  98.     wc.hInstance      = NULL;
  99.     wc.hIcon          = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
  100.     wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
  101.     wc.hbrBackground  = (HBRUSH) (COLOR_GRAYTEXT + 1);
  102.     wc.lpszMenuName   = NULL;
  103.     wc.lpszClassName  = NULL;
  104.     wc.hIconSm        = NULL;
  105. }
  106.  
  107.  
  108. LRESULT KDIBView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  109. {
  110.     switch( uMsg )
  111.     {
  112.         case WM_CREATE:
  113.             m_hWnd        = hWnd;
  114.             m_hViewMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_DIBVIEW));
  115.             return 0;
  116.  
  117.         case WM_PAINT:
  118.             return KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  119.  
  120.         case WM_SIZE:
  121.         case WM_HSCROLL:
  122.         case WM_VSCROLL:
  123.         {
  124.             LRESULT lr = KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  125.  
  126.             int nMin, nMax, nPos;
  127.  
  128.             GetScrollRange(m_hWnd, SB_VERT, &nMin, &nMax);
  129.  
  130.             nPos = GetScrollPos(m_hWnd, SB_VERT);
  131.  
  132.             TCHAR mess[32];
  133.             wsprintf(mess, "%d %d %d", nMin, nPos, nMax);
  134.             m_pStatus->SetText(0, mess);
  135.  
  136.             return lr;
  137.         }
  138.  
  139.         case WM_COMMAND:
  140.             switch ( LOWORD(wParam) )
  141.             {
  142.                 case IDM_VIEW_STRETCHDIBITS:
  143.                 case IDM_VIEW_STRETCHDIBITS4:
  144.                 case IDM_VIEW_SETDIBITSTODEVICE:
  145.                 case IDM_VIEW_FITWINDOW:
  146.                     if ( LOWORD(wParam)!= m_nViewOpt )
  147.                     {
  148.                         m_nViewOpt = LOWORD(wParam);
  149.  
  150.                         switch ( LOWORD(wParam) )
  151.                         {
  152.                             case IDM_VIEW_STRETCHDIBITS:
  153.                             case IDM_VIEW_SETDIBITSTODEVICE:
  154.                                 SetSize(m_DIB.GetWidth() + GAP*2, m_DIB.GetHeight() + GAP*2, 5, 5, true);
  155.                                 break;
  156.  
  157.                             case IDM_VIEW_STRETCHDIBITS4:
  158.                                 SetSize(m_DIB.GetWidth()*2 + GAP*3, m_DIB.GetHeight()*2 + GAP*3, 5, 5, true);
  159.                         }
  160.  
  161.                         InvalidateRect(hWnd, NULL, TRUE);
  162.                     }
  163.                     return 0;
  164.  
  165.                 case IDM_FILE_SAVEDIB1BPP:    SaveWindowToDIB(hWnd,  1, BI_RGB); return 0;
  166.                 case IDM_FILE_SAVEDIB4BPP:    SaveWindowToDIB(hWnd,  4, BI_RGB); return 0;
  167.                 case IDM_FILE_SAVEDIB4RLE:    SaveWindowToDIB(hWnd,  4, BI_RLE4); return 0;
  168.                 case IDM_FILE_SAVEDIB8BPP:    SaveWindowToDIB(hWnd,  8, BI_RGB); return 0;
  169.                 case IDM_FILE_SAVEDIB8RLE:    SaveWindowToDIB(hWnd,  8, BI_RLE8); return 0;
  170.                 case IDM_FILE_SAVEDIB16BPP: SaveWindowToDIB(hWnd, 16, BI_RGB); return 0;
  171.           case IDM_FILE_SAVEDIB16BITFIELDS: SaveWindowToDIB(hWnd, 16, BI_BITFIELDS); return 0;
  172.                 case IDM_FILE_SAVEDIB24BPP: SaveWindowToDIB(hWnd, 24, BI_RGB); return 0;
  173.                 case IDM_FILE_SAVEDIB32BPP: SaveWindowToDIB(hWnd, 32, BI_RGB); return 0;
  174.           case IDM_FILE_SAVEDIB32BITFIELDS: SaveWindowToDIB(hWnd, 32, BI_BITFIELDS); return 0;
  175.  
  176.             case IDM_FILE_SAVEDIBSECTION:  SaveWindow(hWnd, true, 25, RGB(209, 177, 80)); return 0;
  177.  
  178.                 case IDM_VIEW_DIBHEXDUMP:
  179.                     SendMessage(GetParent(GetParent(hWnd)), WM_USER+1, (WPARAM) & m_DIB, 0);    
  180.             }
  181.             return 0;
  182.  
  183.         default:
  184.             return CommonMDIChildProc(hWnd, uMsg, wParam, lParam, m_hViewMenu, 3);
  185.     }
  186. }
  187.  
  188. void KDIBView::OnDraw(HDC hDC, const RECT * rcPaint)
  189. {
  190. //    HDC        hMemDC  = CreateCompatibleDC(hDC);
  191. //    HBITMAP hBitmap = CreateBitmap(m_DIB.GetWidth(), m_DIB.GetHeight(), 1, 1, NULL);
  192. //    HGDIOBJ hOld    = SelectObject(hMemDC, hBitmap);
  193. //
  194. //    SetBkColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
  195. //    SetTextColor(hMemDC, RGB(0xFF, 0xFF, 0xFF));
  196. //    SetStretchBltMode(hMemDC, STRETCH_DELETESCANS);
  197. //    m_DIB.StretchDIBits(hMemDC, 0, 0, SRCCOPY);
  198.  
  199. //    BitBlt(hDC, GAP, GAP, m_DIB.GetWidth(), m_DIB.GetHeight(), 
  200. //                hMemDC, 0, 0, SRCCOPY);
  201.  
  202. //    SelectObject(hMemDC, hOld);
  203. //    DeleteObject(hBitmap);
  204. //    DeleteObject(hMemDC);
  205.  
  206.     SaveDC(hDC);
  207. //    CAffine affine;
  208. //    affine.Rotate(5);
  209. //    affine.Translate(20, 20);
  210. //    SetGraphicsMode(hDC, GM_ADVANCED);
  211. //    SetWorldTransform(hDC, & affine.m_xm);
  212.  
  213.     int w = m_DIB.GetWidth();
  214.     int h = m_DIB.GetHeight();
  215.  
  216.     switch ( m_nViewOpt )
  217.     {
  218.         case IDM_VIEW_FITWINDOW:
  219.             {
  220.                 RECT rect;
  221.  
  222.                 GetClientRect(m_hWnd, & rect);
  223.                 m_DIB.DrawDIB(hDC, 0, 0, rect.right, rect.bottom, 0, 0, w, h, SRCCOPY);
  224.             }
  225.             break;
  226.  
  227.         case IDM_VIEW_STRETCHDIBITS:
  228.             m_DIB.DrawDIB(hDC, GAP,   GAP,    w, h, 0, 0,  w,  h, SRCCOPY);
  229.             break;
  230.  
  231.         case IDM_VIEW_STRETCHDIBITS4:
  232.             m_DIB.DrawDIB(hDC, GAP,     GAP,     w, h, 0, 0,  w,  h, SRCCOPY);
  233.             m_DIB.DrawDIB(hDC, GAP*2+w, GAP,     w, h, w, 0, -w,  h, SRCCOPY);
  234.             m_DIB.DrawDIB(hDC, GAP,     GAP*2+h, w, h, 0, h,  w, -h, SRCCOPY);
  235.             m_DIB.DrawDIB(hDC, GAP*2+w, GAP*2+h, w, h, w, h, -w, -h, SRCCOPY);
  236.             break;
  237.  
  238.         case IDM_VIEW_SETDIBITSTODEVICE:
  239.             if ( ! m_DIB.IsCompressed() )
  240.             {
  241.                 int  bps      = m_DIB.GetBPS();
  242.                 BYTE * buffer = new BYTE[bps];
  243.  
  244.                 for (int i=0; i<m_DIB.GetHeight(); i++)
  245.                 {
  246.                     memcpy(buffer, m_DIB.GetBits() + bps*i, bps);
  247.  
  248.                     for (int j=0; j<bps; j++)
  249.                         buffer[j] = ~ buffer[j];
  250.  
  251.                     m_DIB.SetDIB(hDC, GAP, GAP, i, 1, buffer);
  252.                 }
  253.                 delete [] buffer;
  254.             }
  255.             break;
  256.     }
  257.  
  258.     RestoreDC(hDC, -1);
  259. }
  260.  
  261.  
  262.  
  263. //////////////////////
  264.  
  265. const int TextureID[] = 
  266.     IDB_BRICK01, 
  267.     IDB_BRICK02, 
  268.     IDB_WOOD01, 
  269.     IDB_WOOD02, 
  270.     IDB_ROCK01, 
  271.     IDB_MARBLE01, 
  272.     IDB_PAPER01 
  273. };
  274.  
  275. class KDDBView : public KScrollCanvas
  276. {
  277.     typedef enum { GAP = 16 };
  278.  
  279.     virtual void    OnDraw(HDC hDC, const RECT * rcPaint);
  280.     virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  281.     void            GetWndClassEx(WNDCLASSEX & wc);
  282.     
  283.     HMENU            m_hViewMenu;
  284.     int                m_nViewOpt;
  285.  
  286.     void            TouchMenu(HMENU hMenu);
  287.     KCheckMark        m_uibmp;
  288.     KBitmapMenu     m_texture;
  289.  
  290. public:
  291.  
  292.     KDDBView(void)
  293.     {
  294.         m_hViewMenu = NULL;
  295.         m_nViewOpt  = IDM_VIEW_CREATEBITMAP;
  296.     }
  297.  
  298.     bool Initialize(HINSTANCE hInstance, KStatusWindow * pStatus)
  299.     {
  300.         // SetSize(m_DIB.GetWidth()  + GAP*2,    m_DIB.GetHeight() + GAP*2, 5, 5);
  301.  
  302.         m_hInst   = hInstance;
  303.         m_pStatus = pStatus;
  304.  
  305.         RegisterClass(_T("DDBView"), hInstance);
  306.             
  307.         return true;
  308.     }
  309.  
  310.     void Test_CreateBitmap(HDC hDC, const RECT * rcPaint);
  311.     void Test_LargestDDB(HDC hDC, const RECT * rcPaint);
  312.     void Test_LoadBitmap(HDC hDC, const RECT * rcPaint);
  313.     void Test_Blt(HDC hDC, const RECT * rcPaint);
  314.     void Test_Blt_Color(HDC hDC, const RECT * rcPaint);
  315.     void Test_Blt_GenMask(HDC hDC, const RECT * rcPaint);
  316. };
  317.  
  318.  
  319. void KDDBView::TouchMenu(HMENU hMainMenu)
  320. {
  321.     HMENU hMenu = GetSubMenu(hMainMenu, 3);
  322.  
  323.     m_uibmp.LoadToolbar(m_hInst, IDB_LICON, true);
  324.  
  325.     for (int i=0; i<20; i++)
  326.         m_uibmp.SetCheckMarks(hMenu, i, MF_BYPOSITION, i, -1);
  327.  
  328.     m_texture.AddToMenu(GetSubMenu(hMainMenu, 4), 7, m_hInst, TextureID, 10);
  329. }
  330.  
  331.  
  332. void KDDBView::GetWndClassEx(WNDCLASSEX & wc)
  333. {
  334.     memset(& wc, 0, sizeof(wc));
  335.  
  336.     wc.cbSize         = sizeof(WNDCLASSEX);
  337.     wc.style          = CS_HREDRAW | CS_VREDRAW;
  338.     wc.lpfnWndProc    = WindowProc;
  339.     wc.cbClsExtra     = 0;
  340.     wc.cbWndExtra     = 0;       
  341.     wc.hInstance      = NULL;
  342.     wc.hIcon          = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
  343.     wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
  344.     wc.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
  345.     wc.lpszMenuName   = NULL;
  346.     wc.lpszClassName  = NULL;
  347.     wc.hIconSm        = NULL;
  348. }
  349.  
  350.  
  351. LRESULT KDDBView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  352. {
  353.     switch( uMsg )
  354.     {
  355.         case WM_CREATE:
  356.             m_hWnd        = hWnd;
  357.             m_hViewMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_DDBVIEW));
  358.             TouchMenu(m_hViewMenu);
  359.             return 0;
  360.  
  361.         case WM_PAINT:
  362.             return KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  363.  
  364.         case WM_SIZE:
  365.         case WM_HSCROLL:
  366.         case WM_VSCROLL:
  367.         {
  368.             LRESULT lr = KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  369.  
  370.             int nMin, nMax, nPos;
  371.  
  372.             GetScrollRange(m_hWnd, SB_VERT, &nMin, &nMax);
  373.  
  374.             nPos = GetScrollPos(m_hWnd, SB_VERT);
  375.  
  376.             TCHAR mess[32];
  377.             wsprintf(mess, "%d %d %d", nMin, nPos, nMax);
  378.             m_pStatus->SetText(0, mess);
  379.  
  380.             return lr;
  381.         }
  382.  
  383.         case WM_COMMAND:
  384.             switch ( LOWORD(wParam) )
  385.             {
  386.                 case IDM_VIEW_CREATEBITMAP:
  387.                 case IDM_VIEW_LARGESTDDB:
  388.                 case IDM_VIEW_LOADBITMAP:
  389.                 case IDM_VIEW_LOADBITMAPHEX:
  390.                 case IDM_VIEW_CREATEDIBITMAP:
  391.                 case IDM_VIEW_CREATEDIBITMAPHEX:
  392.  
  393.                 case IDM_VIEW_BLT_NORMAL:
  394.                 case IDM_VIEW_BLT_CENTER:
  395.                 case IDM_VIEW_BLT_STRETCH:
  396.                 case IDM_VIEW_BLT_TILE:
  397.                 case IDM_VIEW_BLT_STRETCHPROP:
  398.                 case IDM_VIEW_BITBLT_COLOR:
  399.                 case IDM_VIEW_GENMASK:
  400.                     if ( LOWORD(wParam)!= m_nViewOpt )
  401.                     {
  402.                         m_nViewOpt = LOWORD(wParam);
  403.  
  404.                         InvalidateRect(hWnd, NULL, TRUE);
  405.                     }
  406.                     return 0;
  407.                 
  408.                 default:
  409.                     switch ( m_texture.OnCommand(LOWORD(wParam)) )
  410.                     {
  411.                         case 1: return 0;
  412.                         case 2: InvalidateRect(hWnd, NULL, TRUE); return 0;
  413.                     }
  414.                     break;
  415.             }
  416.     }
  417.  
  418.     return CommonMDIChildProc(hWnd, uMsg, wParam, lParam, m_hViewMenu, 3);
  419. }
  420.  
  421.  
  422.  
  423. // special routine to display a 8x8 DDB as 32x32
  424. void TestDDB88(HDC hDC, int x, int y, HBITMAP hBmp, const TCHAR * desp)
  425. {
  426.     HDC hMemDC = CreateCompatibleDC(hDC);
  427.     SelectObject(hMemDC, hBmp);
  428.  
  429.     StretchBlt(hDC, x, y, 32, 32, hMemDC, 0, 0, 8, 8, SRCCOPY);
  430.     
  431.     TCHAR mess[64];
  432.  
  433.     TextOut(hDC, x+50, y, desp, _tcslen(desp));
  434.         
  435.     DecodeDDB(hBmp, mess);
  436.     TextOut(hDC, x+50, y+20, mess, _tcslen(mess));
  437.  
  438.     DeleteObject(hMemDC);
  439.     DeleteObject(hBmp);
  440. }
  441.  
  442.  
  443. void KDDBView::Test_CreateBitmap(HDC hDC, const RECT * rcPaint)
  444. {
  445.     // Test supported DDB format    
  446.     const SIZE format[] = { 
  447.             { 1, 0 }, { 1, 1 }, { 1, 2 }, { 1, 4 }, { 1, 8 }, 
  448.             { 1, 15 }, { 1, 16}, { 1, 24 }, { 1, 32 }, { 1, 48 },
  449.             { 2, 2 }, { 3, 3 }, { 4, 4 }, { 5, 5 }, { 6, 6 } };
  450.  
  451.     TextOut(hDC, 100, 10, "Supported DDB Formats", 21);
  452.  
  453.     for (int i=0; i<sizeof(format)/sizeof(format[0]); i++)
  454.     {
  455.         TCHAR mess[128];
  456.     
  457.         HBITMAP hBmp = CreateBitmap(16, 16, format[i].cx, format[i].cy, NULL);
  458.  
  459.         wsprintf(mess, "CreateBitmap(16, 16, %d, %d, NULL) ", format[i].cx, format[i].cy);
  460.         TextOut(hDC, 10, 30+i*17, mess, _tcslen(mess));
  461.  
  462.         DecodeDDB(hBmp, mess);
  463.         TextOut(hDC, 250, 30+i*17, mess, _tcslen(mess));
  464.         DeleteObject(hBmp);
  465.     }
  466.  
  467.     
  468.     SetViewportOrgEx(hDC, 150, 0, NULL);
  469.  
  470.     // Initialized 1 bpp
  471.     const WORD Chess44_WORD [] = { 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33 };
  472.     
  473.     TestDDB88(hDC, 300, 20, CreateBitmap(8, 8, 1, 1, Chess44_WORD), _T("CreateBitmap(8, 8, 1, 1, Chess44_WORD)"));
  474.  
  475.     // Uninitialized 1 bpp
  476.     TestDDB88(hDC, 300, 70, CreateBitmap(8, 8, 1, 1, NULL), _T("CreateBitmap(8, 8, 1, 1, NULL)"));
  477.  
  478.     // CreateBitmapIndirect, 1 bpp, DWORD aligned pixel array
  479.     DWORD Chess44_DWORD [] = { 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0x33, 0x33 };
  480.     
  481.     BITMAP bbp = { 0, 8, 8, sizeof(DWORD), 1, 1, Chess44_DWORD };
  482.  
  483.     TestDDB88(hDC, 300, 120, CreateBitmapIndirect(&bbp), _T("CreateBitmapIndirect({0,8,8,sizeof(DWORD),1,1,Chess44_DWORD})"));
  484.  
  485.     // CreateCompatibleBitmap: Mem DC
  486.     HDC hMemDC = CreateCompatibleDC(hDC);
  487.     TestDDB88(hDC, 300, 170, CreateCompatibleBitmap(hMemDC, 8, 8), _T("CreateCompatibleBitmap(hMemDC, 8, 8)"));
  488.     DeleteObject(hMemDC);
  489.  
  490.     SetViewportOrgEx(hDC, 0, 0, NULL);
  491. }
  492.     
  493.  
  494. void KDDBView::Test_LargestDDB(HDC hDC, const RECT * rcPaint)
  495. {
  496.     HDC hMemDC = CreateCompatibleDC(hDC);
  497.         
  498.     // Calculate largest DDB size
  499.     TCHAR mess[128];
  500.     HDC DC[2] = { hMemDC, hDC };
  501.  
  502.     for (int y=0; y<2; y++)
  503.     {
  504.         const TCHAR * desp[] = { "Largest monochrome",
  505.         "Largest screen compatible bitmap" };
  506.  
  507.         HBITMAP hBmp = LargestDDB(DC[y]);
  508.  
  509.         TextOut(hDC, 20, 10+y*20, desp[y], _tcslen(desp[y]));
  510.  
  511.         DecodeDDB(hBmp, mess);
  512.         TextOut(hDC, 280, 10+y*20, mess, _tcslen(mess));
  513.  
  514.         DeleteObject(hBmp);
  515.     }
  516.  
  517.     // test maximum number of DDB that can be created
  518.     for (y=0; y<2; y++)
  519.     {
  520.         HBITMAP hBmp[1024];
  521.  
  522.         for (int x=0; x<1024; x++)
  523.         {
  524.             hBmp[x] = CreateCompatibleBitmap(DC[y], GetSystemMetrics(SM_CXSCREEN), 
  525.                 GetSystemMetrics(SM_CYSCREEN));
  526.             if ( hBmp[x]==NULL )
  527.                 break;
  528.         }
  529.  
  530.         wsprintf(mess, "Maximum number of DDB: %d, each of them is ", x);
  531.         TextOut(hDC,  20, 60 + y*20, mess, _tcslen(mess));
  532.  
  533.         DecodeDDB(hBmp[0], mess);
  534.         TextOut(hDC, 340, 60 + y*20, mess, _tcslen(mess));
  535.  
  536.         x--;
  537.         while ( x>=0 )
  538.         {
  539.             DeleteObject(hBmp[x]);
  540.             x --;
  541.         }
  542.     }
  543.  
  544.     DeleteObject(hMemDC);
  545. }
  546.  
  547.  
  548. void KDDBView::Test_LoadBitmap(HDC hDC, const RECT * rcPaint)
  549. {
  550.     TCHAR mess[128];
  551.  
  552.     HDC hMemDC = CreateCompatibleDC(hDC);
  553.  
  554.     // load difference BITMAP as resource
  555.     HPALETTE hPal = CreateHalftonePalette(hDC);
  556.     HPALETTE hOld = SelectPalette(hDC, hPal, FALSE);
  557.     RealizePalette(hDC);
  558.  
  559.     for (int i=0; i<6; i++)
  560.     {
  561.         int x = 10 + (i%3) * 320;
  562.         int y = 10 + (i/3) * 320;
  563.  
  564.         KDIB dib;
  565.  
  566.         dib.LoadBitmap(m_hInst, MAKEINTRESOURCE(i+IDB_BITMAP1));
  567.  
  568.         HBITMAP hBmp;
  569.  
  570.         if ( (m_nViewOpt==IDM_VIEW_LOADBITMAP) || (m_nViewOpt==IDM_VIEW_LOADBITMAPHEX) )
  571.             hBmp = LoadBitmap(m_hInst, MAKEINTRESOURCE(i+IDB_BITMAP1));
  572.         else
  573.             hBmp = dib.ConvertToDDB(hDC);
  574.  
  575.         KGDIObject bmp(hMemDC, hBmp);
  576.  
  577.         if ( hBmp==NULL ) break;
  578.  
  579.         BITMAP info;
  580.         GetObject(hBmp, sizeof(BITMAP), & info);
  581.  
  582.         BitBlt(hDC, x, y, info.bmWidth, info.bmHeight, hMemDC, 0, 0, SRCCOPY);
  583.  
  584.         dib.DecodeDIBFormat(mess);
  585.         TextOut(hDC, x, y + info.bmHeight+20, mess, _tcslen(mess));
  586.         
  587.         DecodeDDB(bmp.m_hObj, mess);
  588.         TextOut(hDC, x, y + info.bmHeight+40, mess, _tcslen(mess));
  589.  
  590.         int size = GetBitmapBits(hBmp, 0, NULL);
  591.         wsprintf(mess, "DDB %d bytes", size);
  592.         TextOut(hDC, x, y+ info.bmHeight+60, mess, _tcslen(mess));
  593.  
  594.         if ( (m_nViewOpt==IDM_VIEW_LOADBITMAPHEX) || (m_nViewOpt==IDM_VIEW_CREATEDIBITMAPHEX) )
  595.             SendMessage(GetParent(GetParent(m_hWnd)), WM_USER+1, (WPARAM) hBmp, 1);
  596.     }
  597.     SelectPalette(hDC, hOld, FALSE);
  598.     RealizePalette(hDC);
  599.     DeleteObject(hPal);
  600.  
  601.     DeleteObject(hMemDC);
  602. }
  603.  
  604.  
  605. void KDDBView::Test_Blt(HDC hDC, const RECT * rcPaint)
  606. {
  607.     KDDB ddb;
  608.  
  609.     int nSeq;
  610.  
  611.     m_texture.GetChecked(nSeq);
  612.  
  613.     ddb.LoadBitmap(m_hInst, TextureID[nSeq]);
  614.  
  615.     RECT rect;
  616.  
  617.     GetClientRect(m_hWnd, & rect);
  618.     int cwidth = rect.right;
  619.     int cheight = rect.bottom;
  620.  
  621.     switch ( m_nViewOpt )
  622.     {
  623.         case IDM_VIEW_BLT_NORMAL:
  624.             ddb.Draw(hDC, 0, 0, cwidth, cheight, SRCCOPY, KDDB::draw_normal);
  625.             break;
  626.  
  627.         case IDM_VIEW_BLT_CENTER:
  628.             ddb.Draw(hDC, 0, 0, cwidth, cheight, SRCCOPY, KDDB::draw_center);
  629.             break;
  630.  
  631.         case IDM_VIEW_BLT_STRETCH:
  632.             ddb.Draw(hDC, 0, 0, cwidth, cheight, SRCCOPY, KDDB::draw_stretch);
  633.             break;
  634.  
  635.         case IDM_VIEW_BLT_TILE:
  636.             ddb.Draw(hDC, 0, 0, cwidth, cheight, SRCCOPY, KDDB::draw_tile);
  637.             break;
  638.  
  639.         case IDM_VIEW_BLT_STRETCHPROP:
  640.             ddb.Draw(hDC, 0, 0, cwidth, cheight, SRCCOPY, KDDB::draw_stretchprop);
  641.     }
  642. }
  643.  
  644.  
  645. void KDDBView::Test_Blt_Color(HDC hDC, const RECT * rcPaint)
  646. {
  647.     KDDB ddb;
  648.  
  649.     ddb.LoadBitmap(m_hInst, IDB_LION);
  650.     RECT rect;
  651.  
  652.     GetClientRect(m_hWnd, & rect);
  653.     int cwidth = rect.right;
  654.     int cheight = rect.bottom;
  655.  
  656.     BITMAP bmp;
  657.     GetObject(ddb.GetBitmap(), sizeof(bmp), & bmp);
  658.     
  659.     HDC hMemDC = CreateCompatibleDC(hDC);
  660.     SelectObject(hMemDC, ddb.GetBitmap());
  661.  
  662.     COLORREF ColorTable[] = { 
  663.         RGB(0xFF, 0, 0),    RGB(0, 0xFF, 0),    RGB(0, 0, 0xFF),
  664.         RGB(0xFF, 0xFF, 0), RGB(0, 0xFF, 0xFF), RGB(0xFF, 0, 0xFF) 
  665.     };
  666.  
  667.     for (int j=0; j<cheight; j+= bmp.bmHeight )
  668.     for (int i=0; i<cwidth;  i+= bmp.bmWidth  )
  669.     {
  670.         SetTextColor(hDC, ColorTable[j/bmp.bmHeight]);
  671.         SetBkColor(hDC,   ColorTable[i/bmp.bmWidth] | RGB(0xC0, 0xC0, 0xC0));
  672.  
  673.         BitBlt(hDC, i, j, bmp.bmWidth, bmp.bmHeight, hMemDC, 0, 0, SRCCOPY);
  674.     }
  675.  
  676.     DeleteObject(hMemDC);
  677. }
  678.  
  679.  
  680. void KDDBView::Test_Blt_GenMask(HDC hDC, const RECT * rcPaint)
  681. {
  682.     KDDB ddb;
  683.  
  684.     KGDIObject brush(hDC, CreateSolidBrush(RGB(0xFF, 0xFF, 0)));
  685.  
  686.     
  687.     ddb.LoadBitmap(m_hInst, IDB_CUBE);
  688.     BITMAP bmp;
  689.     GetObject(ddb.GetBitmap(), sizeof(bmp), & bmp); 
  690.  
  691.     PatBlt(hDC, 0, 0, bmp.bmWidth * 5 + 70, bmp.bmHeight * 2 + 30, PATCOPY);
  692.  
  693.     ddb.Draw(hDC, 10, 10, 0, 0, SRCCOPY, KDDB::draw_normal);
  694.  
  695.     COLORREF ct[] = {
  696.         RGB(128, 128, 128), RGB(192, 192, 192), RGB(255, 255, 255),
  697.         RGB(255, 0, 0), RGB(0, 255, 0), RGB(0, 0, 255),
  698.         RGB(255, 255, 0), RGB(0, 255, 255), RGB(255, 0, 255)
  699.     };
  700.  
  701.     HDC hMemDC = CreateCompatibleDC(hDC);
  702.  
  703.     for (int i=0; i<sizeof(ct)/sizeof(COLORREF); i++)
  704.     {
  705.         HBITMAP hOld = ddb.CreateMask(ct[i], hMemDC);
  706.  
  707.         SetBkColor(hDC, RGB(0xFF, 0xFF, 0xFF));
  708.         SetTextColor(hDC, RGB(0, 0, 0));
  709.  
  710.         BitBlt(hDC, ((i+1)%5)* (bmp.bmWidth+10)+10, ((i+1)/5)* (bmp.bmHeight+10)+10, bmp.bmWidth, bmp.bmHeight,
  711.             hMemDC, 0, 0, SRCCOPY);
  712.  
  713.         DeleteObject(SelectObject(hMemDC, hOld));
  714.     }
  715.  
  716.     DeleteObject(hMemDC);
  717. }
  718.  
  719.  
  720. void KDDBView::OnDraw(HDC hDC, const RECT * rcPaint)
  721. {
  722.     switch ( m_nViewOpt )
  723.     {
  724.         case IDM_VIEW_CREATEBITMAP:
  725.             Test_CreateBitmap(hDC, rcPaint);
  726.             break;
  727.  
  728.         case IDM_VIEW_LARGESTDDB:
  729.             Test_LargestDDB(hDC, rcPaint);
  730.             break;
  731.  
  732.         case IDM_VIEW_LOADBITMAP:
  733.         case IDM_VIEW_CREATEDIBITMAP:
  734.             Test_LoadBitmap(hDC, rcPaint);
  735.             break;
  736.  
  737.         case IDM_VIEW_LOADBITMAPHEX:
  738.             Test_LoadBitmap(hDC, rcPaint);
  739.             m_nViewOpt = IDM_VIEW_LOADBITMAP;
  740.             break;
  741.  
  742.         case IDM_VIEW_CREATEDIBITMAPHEX:
  743.             Test_LoadBitmap(hDC, rcPaint);
  744.             m_nViewOpt = IDM_VIEW_CREATEDIBITMAP;
  745.             break;
  746.  
  747.         case IDM_VIEW_BLT_NORMAL:
  748.         case IDM_VIEW_BLT_CENTER:
  749.         case IDM_VIEW_BLT_STRETCH:
  750.         case IDM_VIEW_BLT_TILE:
  751.         case IDM_VIEW_BLT_STRETCHPROP:
  752.             Test_Blt(hDC, rcPaint);
  753.             break;
  754.  
  755.         case IDM_VIEW_BITBLT_COLOR:
  756.             Test_Blt_Color(hDC, rcPaint);
  757.             break;
  758.  
  759.         case IDM_VIEW_GENMASK:
  760.             Test_Blt_GenMask(hDC, rcPaint);
  761.             break;
  762.     }
  763. }
  764.  
  765. //////////////////////
  766. //    DIB Section   //
  767. //////////////////////
  768.  
  769. class KDIBSectionView : public KScrollCanvas
  770. {
  771.     typedef enum { GAP = 16 };
  772.  
  773.     virtual void    OnDraw(HDC hDC, const RECT * rcPaint);
  774.     virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  775.     void            GetWndClassEx(WNDCLASSEX & wc);
  776.     
  777.     HMENU            m_hViewMenu;
  778.     int                m_nViewOpt;
  779.  
  780. public:
  781.  
  782.     KDIBSectionView(void)
  783.     {
  784.         m_hViewMenu = NULL;
  785.         m_nViewOpt  = IDM_VIEW_CREATEBITMAP;
  786.     }
  787.  
  788.     bool Initialize(HINSTANCE hInstance, KStatusWindow * pStatus)
  789.     {
  790.         m_hInst   = hInstance;
  791.         m_pStatus = pStatus;
  792.  
  793.         RegisterClass(_T("DIBSectionView"), hInstance);
  794.             
  795.         return true;
  796.     }
  797.  
  798.     void Test_CreateDIBSection(HDC hDC, const RECT * rcPaint);
  799. };
  800.  
  801.  
  802. void KDIBSectionView::Test_CreateDIBSection(HDC hDC, const RECT * rcPaint)
  803. {
  804.     TextOut(hDC, 10, 10, "CreateDIBSection", 10);
  805.  
  806.     TCHAR temp[128];
  807.     KDIBSection dibsection[11];
  808.  
  809.     for (int i=0; i<11; i++)
  810.     {
  811.         const int static bitcount   [] = { 0,      1,      4,       4,      8,       8,      16,     16,           24,     32    , 32};
  812.         const int static compression[] = { BI_PNG, BI_RGB, BI_RLE4, BI_RGB, BI_RLE8, BI_RGB, BI_RGB, BI_BITFIELDS, BI_RGB, BI_RGB, BI_BITFIELDS };
  813.  
  814.         KBitmapInfo bmi;
  815.  
  816.         bmi.SetFormat(125, 125, bitcount[i], compression[i]);
  817.  
  818.         dibsection[i].CreateDIBSection(hDC, bmi.GetBMI(), DIB_RGB_COLORS, NULL, NULL);
  819.         
  820.         dibsection[i].DecodeDIBSectionFormat(temp);
  821.         TextOut(hDC, 20, 40 + i*20, temp, _tcslen(temp));
  822.  
  823.         if ( dibsection[i].GetBitmap() )
  824.         {
  825.             HBITMAP hBig = LargestDIBSection(bmi.GetBMI());
  826.  
  827.             DecodeDDB(hBig, temp);
  828.             TextOut(hDC, 720, 40 + i*20, temp, _tcslen(temp));
  829.  
  830.             DeleteObject(hBig);
  831.         }
  832.     }
  833. }
  834.  
  835.  
  836. class KRipDialog : public KDialog
  837. {
  838.     int m_width;
  839.     int m_height;
  840.  
  841.     virtual BOOL DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  842.     {
  843.         switch (uMsg)
  844.         {
  845.             case WM_INITDIALOG:
  846.                 {
  847.                     for (int i=1; i<10; i++)
  848.                     {
  849.                         TCHAR mess[64];
  850.  
  851.                         wsprintf(mess, "%d%c % %d x %d pixels, %d Kb", i*100, '%', i*m_width, i*m_height,
  852.                             (m_width*i*3+3)/4*4*m_height*i/1024);
  853.                         SendDlgItemMessage(hWnd, IDC_LIST, LB_ADDSTRING, 0, (LPARAM) mess);
  854.                         SendDlgItemMessage(hWnd, IDC_LIST, LB_SETCURSEL, 0, 0);
  855.                     }
  856.                 }
  857.                 return TRUE;
  858.     
  859.             case WM_COMMAND:
  860.                 if ( LOWORD(wParam)==IDOK )
  861.                 {
  862.                     EndDialog(hWnd, 1 + SendDlgItemMessage(hWnd, IDC_LIST, LB_GETCURSEL, 0, 0));
  863.                     return TRUE;
  864.                 }
  865.                 else if ( LOWORD(wParam)==IDCANCEL )
  866.                 {
  867.                     EndDialog(hWnd, 0);
  868.                     return TRUE;
  869.                 }
  870.         }
  871.  
  872.         return FALSE;
  873.     }
  874.  
  875. public:
  876.     KRipDialog(int width, int height)
  877.     {
  878.         m_width  = width;
  879.         m_height = height;
  880.     }
  881. };
  882.  
  883.  
  884. BOOL RenderEMF(HINSTANCE hInstance)
  885. {
  886.     KFileDialog fd;
  887.  
  888.     if ( ! fd.GetOpenFileName(NULL, "emf", "Enhanced Metafiles") )
  889.         return FALSE;
  890.  
  891.     HENHMETAFILE hemf = GetEnhMetaFile(fd.m_TitleName);
  892.  
  893.     if ( hemf==NULL )
  894.         return FALSE;
  895.  
  896.     if ( ! fd.GetSaveFileName(NULL, "tga", "Targa 24 bit Image") )
  897.     {
  898.         DeleteEnhMetaFile(hemf);
  899.         return FALSE;
  900.     }
  901.  
  902.     ENHMETAHEADER emfheader;
  903.  
  904.     GetEnhMetaFileHeader(hemf, sizeof(ENHMETAHEADER), & emfheader);
  905.  
  906.     int width  = emfheader.rclBounds.right  - emfheader.rclBounds.left;
  907.     int height = emfheader.rclBounds.bottom - emfheader.rclBounds.top;
  908.  
  909.     KRipDialog sizedialog(width, height);
  910.  
  911.     int scale = sizedialog.Dialogbox(hInstance, MAKEINTRESOURCE(IDD_RIP), NULL);
  912.     BOOL rslt;
  913.  
  914.     if ( scale )
  915.         rslt = RenderEMF(hemf, width * scale, height * scale, fd.m_TitleName);
  916.     else
  917.         rslt = FALSE;
  918.  
  919.     DeleteEnhMetaFile(hemf);
  920.  
  921.     return rslt;
  922. }
  923.  
  924.  
  925. void KDIBSectionView::GetWndClassEx(WNDCLASSEX & wc)
  926. {
  927.     memset(& wc, 0, sizeof(wc));
  928.  
  929.     wc.cbSize         = sizeof(WNDCLASSEX);
  930.     wc.style          = CS_HREDRAW | CS_VREDRAW;
  931.     wc.lpfnWndProc    = WindowProc;
  932.     wc.cbClsExtra     = 0;
  933.     wc.cbWndExtra     = 0;       
  934.     wc.hInstance      = NULL;
  935.     wc.hIcon          = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
  936.     wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
  937.     wc.hbrBackground  = (HBRUSH) GetStockObject(WHITE_BRUSH);
  938.     wc.lpszMenuName   = NULL;
  939.     wc.lpszClassName  = NULL;
  940.     wc.hIconSm        = NULL;
  941. }
  942.  
  943.  
  944. LRESULT KDIBSectionView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  945. {
  946.     switch( uMsg )
  947.     {
  948.         case WM_CREATE:
  949.             m_hWnd        = hWnd;
  950.             m_hViewMenu = LoadMenu(m_hInst, MAKEINTRESOURCE(IDR_DIBSECTIONVIEW));
  951.             return 0;
  952.  
  953.         case WM_PAINT:
  954.             return KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  955.  
  956.         case WM_SIZE:
  957.         case WM_HSCROLL:
  958.         case WM_VSCROLL:
  959.         {
  960.             LRESULT lr = KScrollCanvas::WndProc(hWnd, uMsg, wParam, lParam);
  961.  
  962.             int nMin, nMax, nPos;
  963.  
  964.             GetScrollRange(m_hWnd, SB_VERT, &nMin, &nMax);
  965.  
  966.             nPos = GetScrollPos(m_hWnd, SB_VERT);
  967.  
  968.             TCHAR mess[32];
  969.             wsprintf(mess, "%d %d %d", nMin, nPos, nMax);
  970.             m_pStatus->SetText(0, mess);
  971.  
  972.             return lr;
  973.         }
  974.  
  975.         case WM_COMMAND:
  976.             switch ( LOWORD(wParam) )
  977.             {
  978.                 case IDM_VIEW_CREATEDIBSECTION:
  979.                     if ( LOWORD(wParam)!= m_nViewOpt )
  980.                     {
  981.                         m_nViewOpt = LOWORD(wParam);
  982.  
  983.                         InvalidateRect(hWnd, NULL, TRUE);
  984.                     }
  985.                     return 0;
  986.  
  987.                 case IDM_VIEW_RIP:
  988.                     RenderEMF(m_hInst);
  989.                     return 0;
  990.             }
  991.     }
  992.  
  993.     return CommonMDIChildProc(hWnd, uMsg, wParam, lParam, m_hViewMenu, 3);
  994. }
  995.  
  996.  
  997. void KDIBSectionView::OnDraw(HDC hDC, const RECT * rcPaint)
  998. {
  999.     switch ( m_nViewOpt )
  1000.     {
  1001.         case IDM_VIEW_CREATEBITMAP:
  1002.             Test_CreateDIBSection(hDC, rcPaint);
  1003.             break;
  1004.     }
  1005. }
  1006.  
  1007.  
  1008. const int Translate[] =
  1009. {
  1010.     IDM_FILE_CLOSE,
  1011.     IDM_FILE_EXIT,
  1012.     IDM_WINDOW_TILE,
  1013.     IDM_WINDOW_CASCADE,
  1014.     IDM_WINDOW_ARRANGE,
  1015.     IDM_WINDOW_CLOSEALL
  1016. };
  1017.  
  1018.  
  1019. class KMyMDIFRame : public KMDIFrame
  1020. {
  1021.     int                m_nCount;
  1022.     KDDBBackground  m_background;
  1023.  
  1024.     void CreateMDIChild(KScrollCanvas * canvas, const TCHAR * klass, const TCHAR * filename, const TCHAR * title)
  1025.     {
  1026.         MDICREATESTRUCT mdic;
  1027.  
  1028.         TCHAR Temp[MAX_PATH];
  1029.  
  1030.         if ( ! canvas->GetTitle(filename, Temp) )
  1031.         {
  1032.             m_nCount ++;
  1033.             wsprintf(Temp, title, m_nCount);
  1034.         }
  1035.  
  1036.         mdic.szClass = klass;
  1037.         mdic.szTitle = Temp;
  1038.         mdic.hOwner  = m_hInst;
  1039.         mdic.x       = CW_USEDEFAULT;
  1040.         mdic.y       = CW_USEDEFAULT;
  1041.         mdic.cx      = CW_USEDEFAULT;
  1042.         mdic.cy      = CW_USEDEFAULT;
  1043.         mdic.style   = WS_VISIBLE | WS_BORDER;
  1044.         mdic.lParam  = (LPARAM) canvas;
  1045.  
  1046.         SendMessage(m_hMDIClient, WM_MDICREATE, 0, (LPARAM) & mdic);
  1047.     }
  1048.  
  1049.     void CreateDIBView(const TCHAR * pFileName)
  1050.     {
  1051.         KDIBView * pDIBView = new KDIBView();
  1052.  
  1053.         if ( pDIBView )
  1054.             if ( pDIBView->Initialize(pFileName, m_hInst, m_pStatus) )
  1055.                 CreateMDIChild(pDIBView, _T("DIBView"), pFileName, _T("DIB %d"));
  1056.             else
  1057.                 delete pDIBView;
  1058.     }
  1059.     
  1060.     void CreateDDBView(void)
  1061.     {
  1062.         KDDBView * pDDBView = new KDDBView();
  1063.  
  1064.         if ( pDDBView )
  1065.             if ( pDDBView->Initialize(m_hInst, m_pStatus) )
  1066.                 CreateMDIChild(pDDBView, _T("DDBView"), NULL, _T("DDB %d"));
  1067.             else
  1068.                 delete pDDBView;
  1069.     }
  1070.  
  1071.     void CreateDIBSectionView(void)
  1072.     {
  1073.         KDIBSectionView * pDIBSectionView = new KDIBSectionView();
  1074.  
  1075.         if ( pDIBSectionView )
  1076.             if ( pDIBSectionView->Initialize(m_hInst, m_pStatus) )
  1077.                 CreateMDIChild(pDIBSectionView, _T("DIBSectionView"), NULL, _T("DIBSection %d"));
  1078.             else
  1079.                 delete pDIBSectionView;
  1080.     }
  1081.  
  1082.     void CreateHexView(WPARAM wParam, LPARAM lParam)
  1083.     {
  1084.         KEditView * pEditView = new KEditView();
  1085.  
  1086.         if ( pEditView )
  1087.             if ( pEditView->Initialize(m_hInst) )
  1088.             {
  1089.                 CreateMDIChild(pEditView, _T("EditView"), NULL, _T("Hex Dump %d"));
  1090.                 pEditView->Decode(wParam, lParam);
  1091.             }
  1092.             else
  1093.                 delete pEditView;
  1094.     }
  1095.  
  1096.     virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam)
  1097.     {
  1098.         switch ( LOWORD(wParam) )
  1099.         {
  1100.             case IDM_FILE_NEW:
  1101.                 CreateDIBView(NULL);
  1102.                 return TRUE;
  1103.  
  1104.             case IDM_FILE_NEWDDB:
  1105.                 CreateDDBView();
  1106.                 return TRUE;
  1107.  
  1108.             case IDM_FILE_NEW_DIBSECTION:
  1109.                 CreateDIBSectionView();
  1110.                 return TRUE;
  1111.  
  1112.             case IDM_FILE_OPEN:
  1113.             {
  1114.                 KFileDialog fo;
  1115.  
  1116.                 if ( fo.GetOpenFileName(m_hWnd, "bmp", "Bitmap Files") )
  1117.                     CreateDIBView(fo.m_TitleName);
  1118.                 
  1119.                 return TRUE;
  1120.             }
  1121.         }
  1122.  
  1123.         return FALSE; // not processed
  1124.     }
  1125.  
  1126.     virtual LRESULT WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1127.     {
  1128.         if ( uMsg==WM_USER + 1)
  1129.         {
  1130.             CreateHexView(wParam, lParam);
  1131.             return 0;
  1132.         }
  1133.         
  1134.         LRESULT lr = KMDIFrame::WndProc(hWnd, uMsg, wParam, lParam);
  1135.  
  1136.         if ( uMsg == WM_CREATE )
  1137.         {
  1138.             m_background.SetBitmap(m_hInst, IDB_PUZZLE);
  1139.             m_background.Attach(m_hMDIClient);
  1140.         }
  1141.  
  1142.         return lr;
  1143.     }
  1144.  
  1145.     void GetWndClassEx(WNDCLASSEX & wc)
  1146.     {
  1147.         KFrame::GetWndClassEx(wc);
  1148.  
  1149.         wc.hIcon = LoadIcon(m_hInst, MAKEINTRESOURCE(IDI_IMAGE));
  1150.     }
  1151.  
  1152. public:
  1153.     KMyMDIFRame(HINSTANCE hInstance, const TBBUTTON * pButtons, int nCount,
  1154.         KToolbar * pToolbar, KStatusWindow * pStatus) :
  1155.         KMDIFrame(hInstance, pButtons, nCount, pToolbar, pStatus, Translate)
  1156.     {
  1157.         m_nCount = 0;
  1158.     }
  1159. };
  1160.  
  1161.  
  1162. const TBBUTTON tbButtons[] =
  1163. {
  1164.     { STD_FILENEW,     IDM_FILE_NEW,   TBSTATE_ENABLED, TBSTYLE_BUTTON, { 0, 0 }, IDS_FILENEW,  0 },
  1165.     { STD_FILEOPEN,  IDM_FILE_OPEN,  TBSTATE_ENABLED, TBSTYLE_BUTTON, { 0, 0 }, IDS_FILEOPEN, 0 }
  1166. };
  1167.  
  1168.  
  1169. class KMyDialog : public KDialog
  1170. {
  1171.     KDDBBackground whole;
  1172.     KDDBBackground groupbox;
  1173.     KDDBBackground frame;
  1174.     KDDBBackground button;
  1175.  
  1176.     HINSTANCE      m_hInstance;
  1177.  
  1178.     virtual BOOL DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  1179.     {
  1180.         switch (uMsg)
  1181.         {
  1182.             case WM_INITDIALOG:
  1183.                 m_hWnd = hWnd;
  1184.                 
  1185.                 whole.SetBitmap(m_hInstance, IDB_PAPER01);
  1186.                 whole.SetStyle(KDDB::draw_tile);
  1187.                 whole.Attach(hWnd);
  1188.                 
  1189.                 groupbox.SetBitmap(m_hInstance, IDB_BRICK02);
  1190.                 groupbox.SetStyle(KDDB::draw_center);
  1191.                 groupbox.Attach(GetDlgItem(hWnd, IDC_GROUPBOX));
  1192.  
  1193.                 frame.SetBitmap(m_hInstance, IDB_BRICK02);
  1194.                 frame.SetStyle(KDDB::draw_stretchprop);
  1195.                 frame.Attach(GetDlgItem(hWnd, IDC_FRAME)); 
  1196.                 return TRUE;
  1197.     
  1198.             case WM_COMMAND:
  1199.                 if ( LOWORD(wParam)==IDOK )
  1200.                 {
  1201.                     EndDialog(hWnd, 1);
  1202.                     return TRUE;
  1203.                 }
  1204.         }
  1205.  
  1206.         return FALSE;
  1207.     }
  1208.  
  1209. public:
  1210.     KMyDialog(HINSTANCE hInst)
  1211.     {
  1212.         m_hInstance = hInst;
  1213.     }
  1214. };
  1215.  
  1216.  
  1217. int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int nShow)
  1218. {
  1219.     KToolbar      toolbar;
  1220.     KStatusWindow status;
  1221.     KMyDialog      testdialog(hInst);
  1222.  
  1223.     testdialog.Dialogbox(hInst, MAKEINTRESOURCE(IDD_BACKGROUND), NULL);
  1224.  
  1225.     KMyMDIFRame frame(hInst, tbButtons, 2, & toolbar, & status);
  1226.  
  1227.     TCHAR title[MAX_PATH];
  1228.  
  1229.     HDC hDC = GetDC(NULL);
  1230.     wsprintf(title, "DIBShop (%s)", PixelFormatName(PixelFormat(hDC)));
  1231.     ReleaseDC(NULL, hDC);
  1232.  
  1233.     frame.CreateEx(0, _T("ClassName"), title,
  1234.         WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  1235.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
  1236.         NULL, LoadMenu(hInst, MAKEINTRESOURCE(IDR_MAIN)), hInst);
  1237.     
  1238.  
  1239.     frame.ShowWindow(nShow);
  1240.     frame.UpdateWindow();
  1241.  
  1242.     frame.MessageLoop();
  1243.  
  1244.     return 0;
  1245. }
  1246.