Advertisement
pravinda333

GDI flickering Fix

Oct 19th, 2013
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 23.63 KB | None | 0 0
  1. #include "resource.h"
  2. #include <windows.h>
  3. #include <windowsx.h> // for TransparentBlt()
  4. #include <commctrl.h>
  5. #include <gdiplus.h>
  6.  
  7. #pragma comment( linker, "/manifestdependency:\"type='win32' \
  8.                          name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
  9.                          processorArchitecture='*' publicKeyToken='6595b64144ccf1df' \
  10.                          language='*'\"")
  11.  
  12. #pragma comment( lib, "comctl32.lib")
  13. #pragma comment( lib, "Msimg32.lib" ) // for TransparentBlt()
  14. #pragma comment( lib, "Gdiplus.lib" )
  15.  
  16. using namespace Gdiplus;
  17.  
  18. // variable for storing the instance
  19.  
  20. static HINSTANCE hInst;
  21.  
  22. // icons
  23.  
  24. static HICON hIcon, // main window's icon
  25.              hiAdmin;            // icon in the left corner of the status bar
  26.  
  27. // WinMain's procedure
  28. void BitBltImages(HWND hwnd, HDC hdcMem, HDC leftbmpDC, HDC rightbmpDC, Image* image, Image* image1)
  29. {
  30.     RECT r;
  31.     GetClientRect(hwnd, &r);
  32.                 //============= aspect ratio ================//
  33.  
  34.             UINT o_height = image->GetHeight(), o_width = image->GetWidth();
  35.  
  36.             INT n_width = 80;
  37.    
  38.             INT n_height = 100;
  39.    
  40.             double ratio = ( (double)o_width ) / ( (double)o_height );
  41.    
  42.             if (o_width > o_height)
  43.             {
  44.        
  45.                 // Resize down by width
  46.        
  47.                 n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
  48.    
  49.             }
  50.             else
  51.                 n_width = static_cast<UINT>(n_height * ratio);
  52.  
  53.             //==================== draw it with high quality ==========================//
  54.             //          graphics.DrawImage( image, r.left + 5, r.top + 10, n_width, n_height );
  55.             int x = r.left + 5;
  56.             int y = r.top + 10;
  57.             //BitBlt(hdcMem, x, y, n_width, n_height, leftbmpDC, 0, 0, SRCCOPY);
  58.             TransparentBlt(hdcMem,
  59.                 x, y, n_width, n_height,
  60.                 leftbmpDC,
  61.                 0, 0, n_width, n_height,
  62.                 RGB(255, 255, 255));
  63.  
  64.             /******************** right logo *******************/
  65.  
  66.             //============= aspect ratio ================//
  67.  
  68.             o_height = image1->GetHeight(), o_width = image1->GetWidth();
  69.  
  70.             n_width = 90;
  71.    
  72.             n_height = 100;
  73.    
  74.             ratio = ( (double)o_width ) / ( (double)o_height );
  75.    
  76.             if (o_width > o_height)
  77.             {
  78.        
  79.                 // Resize down by width
  80.        
  81.                 n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
  82.    
  83.             }
  84.             else
  85.                 n_width = static_cast<UINT>(n_height * ratio);
  86.  
  87.             //===================== draw it with high quality ==========================//
  88.             x = r.right - r.left - 90;
  89.             y = r.top + 10;
  90.             //BitBlt(hdcMem, x, y, n_width, n_height, rightbmpDC, 0,  0, SRCCOPY);
  91.             TransparentBlt(hdcMem,
  92.                 x, y, n_width, n_height,
  93.                 rightbmpDC,
  94.                 0, 0, n_width, n_height,
  95.                 RGB(255, 255, 255));
  96.  
  97. }
  98.  
  99. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  100. {
  101.     // bitmap for middle logo
  102.  
  103.     static HBITMAP bmpSimbol;
  104.  
  105.     // variables for painting the window
  106.  
  107.     static HBRUSH hbPozadina; // gray background brush for grid on the top
  108.  
  109.     static Image *image = Image::FromFile(L".\\resources\\BG.emf"), // left logo
  110.         *image1 = Image::FromFile(L".\\resources\\RGF.png"); // right logo
  111.  
  112.     //UPDATE////////
  113.     static HDC MemDC;
  114.     static HBITMAP bmp;
  115.  
  116.     static HDC middlebmpDC;
  117.     static BITMAP middlebmp;
  118.  
  119.     static HDC leftbmpDC;
  120.     static HBITMAP leftbmp;
  121.  
  122.     static HDC rightbmpDC;
  123.     static HBITMAP rightbmp;
  124.  
  125.     switch(msg)
  126.     {
  127.  
  128.     case WM_CREATE:
  129.         {
  130.             // load gray background brush for the top banner
  131.  
  132.             hbPozadina = CreateSolidBrush( RGB( 230, 230, 230 ) );
  133.  
  134.             // load left icon in the status bar
  135.  
  136.             hiAdmin = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON2) );
  137.  
  138.             // load middle logo
  139.  
  140.             bmpSimbol = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP16) );
  141.  
  142.             int max_width = GetSystemMetrics(SM_CXSCREEN);
  143.             int max_height = GetSystemMetrics(SM_CYSCREEN);
  144.  
  145.             HDC hdc = GetDC(hwnd);
  146.            
  147.             //main memDC
  148.             MemDC = CreateCompatibleDC(hdc);
  149.             bmp = CreateCompatibleBitmap( hdc, max_width, max_height);
  150.             SelectObject(MemDC, bmp);
  151.  
  152.             //left image memdc
  153.             middlebmpDC = CreateCompatibleDC(hdc);
  154.             memset( &middlebmp, 0 , sizeof(BITMAP) );
  155.             GetObject( bmpSimbol, sizeof(BITMAP), &middlebmp );
  156.             SelectObject( middlebmpDC, bmpSimbol );
  157.  
  158.             //left image-----------------------------
  159.  
  160.             //============= aspect ratio ================//
  161.  
  162.             UINT o_height = image->GetHeight(), o_width = image->GetWidth();
  163.  
  164.             INT n_width = 80;
  165.    
  166.             INT n_height = 100;
  167.    
  168.             double ratio = ( (double)o_width ) / ( (double)o_height );
  169.    
  170.             if (o_width > o_height)
  171.             {
  172.        
  173.                 // Resize down by width
  174.        
  175.                 n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
  176.    
  177.             }
  178.             else
  179.                 n_width = static_cast<UINT>(n_height * ratio);
  180.  
  181.             //==================== draw it with high quality ==========================//
  182.             leftbmpDC = CreateCompatibleDC(hdc);
  183.             leftbmp = CreateCompatibleBitmap(hdc, n_width, n_height);
  184.             SelectObject(leftbmpDC, leftbmp);
  185.             SetBkMode(leftbmpDC, TRANSPARENT);
  186.             RECT rc = {0, 0, n_width, n_height};
  187.             FillRect(leftbmpDC, &rc, (HBRUSH)GetStockObject(WHITE_BRUSH));
  188.  
  189.             Graphics graphics( leftbmpDC );
  190.             int img_x = 0;
  191.             int img_y = 0;
  192.  
  193.             graphics.SetSmoothingMode( SmoothingModeHighQuality );
  194.  
  195.             graphics.SetInterpolationMode( InterpolationModeHighQualityBicubic );
  196.             graphics.DrawImage( image, img_x,img_y, n_width, n_height );
  197.  
  198.             /******************** right logo *******************/
  199.  
  200.             //============= aspect ratio ================//
  201.  
  202.             o_height = image1->GetHeight(), o_width = image1->GetWidth();
  203.  
  204.             n_width = 90;
  205.    
  206.             n_height = 100;
  207.    
  208.             ratio = ( (double)o_width ) / ( (double)o_height );
  209.    
  210.             if (o_width > o_height)
  211.             {
  212.        
  213.                 // Resize down by width
  214.        
  215.                 n_height = static_cast<UINT>( ( (double)n_width ) / ratio );
  216.    
  217.             }
  218.             else
  219.                 n_width = static_cast<UINT>(n_height * ratio);
  220.  
  221.             //===================== draw it with high quality ==========================//
  222.             //right image memdc
  223.             rightbmpDC = CreateCompatibleDC(hdc);
  224.             rightbmp = CreateCompatibleBitmap(hdc, n_width, n_height);
  225.             SelectObject(rightbmpDC, rightbmp);
  226.             SetBkMode(leftbmpDC, TRANSPARENT);
  227.             FillRect(rightbmpDC, &rc, (HBRUSH) GetStockObject(WHITE_BRUSH));
  228.  
  229.             graphics.ReleaseHDC(leftbmpDC);
  230.  
  231.             Graphics graphics2(rightbmpDC);
  232.             //graphics.FromHDC(rightbmpDC);
  233.  
  234.             graphics2.DrawImage( image1, img_x, img_y, n_width, n_height );
  235.  
  236.             //---------------------------------------
  237.             ReleaseDC(hwnd, hdc);
  238.  
  239.         }
  240.         return (LRESULT)0;
  241.  
  242.     case WM_ERASEBKGND:
  243.         return (LRESULT)1; // so we avoid flicker ( all painting is in WM_PAINT )
  244.  
  245.     case WM_PAINT:
  246.         {
  247.             PAINTSTRUCT ps;
  248.  
  249.             HDC hdc = BeginPaint( hwnd, &ps);
  250.  
  251.             RECT r; // rectangle for main window's client area
  252.            
  253.             GetClientRect( hwnd, &r);
  254.  
  255.             //HDC hdcMemImg = CreateCompatibleDC(hdc); // back buffer for middle logo
  256.  
  257.             // compatible bitmap for MemDC
  258.  
  259.             //HBITMAP bmp = CreateCompatibleBitmap( hdc, r.right - r.left, r.bottom - r.top );
  260.             //HBITMAP   oldBmp = (HBITMAP)SelectObject( MemDC, bmp ); // needed for cleanup
  261.  
  262.             /*************** nacrtaj baner ******************/
  263.  
  264.             // top banner background
  265.  
  266.             // position it properly at the top
  267.  
  268.             RECT rect;
  269.  
  270.             rect.left = r.left;
  271.             rect.top = r.top;
  272.             rect.right = r.right;
  273.             rect.bottom = 120;
  274.  
  275.             FillRect( MemDC, &rect, hbPozadina );
  276.  
  277.             // draw grid on the banner background
  278.  
  279.             LOGBRUSH lbPozadina;
  280.            
  281.             HGDIOBJ hPenPozadina = NULL, hOldPenPozadina;
  282.  
  283.             lbPozadina.lbColor = RGB( 216, 216, 216 );
  284.             lbPozadina.lbHatch = 0;
  285.             lbPozadina.lbStyle = BS_SOLID;
  286.  
  287.             hPenPozadina = ExtCreatePen( PS_COSMETIC | PS_SOLID, 1, &lbPozadina, 0, NULL);
  288.  
  289.             hOldPenPozadina = SelectObject( MemDC, hPenPozadina); // needed for cleanup
  290.  
  291.             for( int i = rect.left + 12; i< rect.right; i += 12)
  292.             {
  293.                 MoveToEx( MemDC, i, rect.top, NULL );
  294.  
  295.                 LineTo( MemDC, i, rect.bottom - rect.top + 1 );
  296.             }
  297.  
  298.             for( int i = rect.top + 12; i< rect.bottom; i += 12)
  299.             {
  300.                 MoveToEx( MemDC, rect.left, i, NULL );
  301.  
  302.                 LineTo( MemDC, rect.right - rect.left + 1, i );
  303.             }
  304.  
  305.             // perform proper cleanup
  306.  
  307.             SelectObject( MemDC, hOldPenPozadina);
  308.  
  309.             DeleteObject(hPenPozadina);
  310.  
  311.             /************************ middle orange text ************************/
  312.  
  313.             HFONT hf, hfOld;
  314.            
  315.             long lfHeight;
  316.  
  317.             // set font size below via function's first argument
  318.  
  319.             lfHeight = -MulDiv( 14, GetDeviceCaps( MemDC, LOGPIXELSY), 72 );
  320.            
  321.             hf = CreateFont( lfHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0,
  322.                 L"Arial Black" );
  323.  
  324.             SetBkMode( MemDC, TRANSPARENT );
  325.  
  326.             SetTextColor( MemDC, RGB( 255, 163, 94 ) ); // orange
  327.                
  328.             hfOld = (HFONT)SelectObject( MemDC, hf ); // needed for cleanup
  329.  
  330.             RECT baner; // needed for proper positioning
  331.  
  332.             SIZE sBaner; // needed for proper positioning
  333.  
  334.             GetTextExtentPoint32( MemDC, L"ГЕОТЕРМАЛНИ ИНФОРМАЦИОНИ СИСТЕМ ГРАДА БЕОГРАДА-ГЕОТЕРМИСТ",
  335.                 wcslen(L"ГЕОТЕРМАЛНИ ИНФОРМАЦИОНИ СИСТЕМ ГРАДА БЕОГРАДА-ГЕОТЕРМИСТ"), &sBaner );
  336.  
  337.             // proper positioning
  338.  
  339.             baner.left = r.left + 60;
  340.             baner.right = r.right - r.left - 60;
  341.             baner.top = r.top + 15;
  342.             baner.bottom = r.top + sBaner.cy;
  343.  
  344.             DrawTextEx( MemDC, L"ГЕОТЕРМАЛНИ ИНФОРМАЦИОНИ СИСТЕМ ГРАДА БЕОГРАДА-ГЕОТЕРМИСТ",
  345.                 wcslen(L"ГЕОТЕРМАЛНИ ИНФОРМАЦИОНИ СИСТЕМ ГРАДА БЕОГРАДА-ГЕОТЕРМИСТ"), &baner,
  346.                 DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_WORDBREAK, 0 );
  347.  
  348.             SelectObject( MemDC, hfOld ); // proper cleanup
  349.  
  350.             /******************* middle logo ********************/
  351.  
  352.  
  353.  
  354.             // draw bitmap to the back buffer
  355.  
  356.             TransparentBlt( MemDC, ( r.right - r.left - 64 ) / 2, r.top + 20 + sBaner.cy, 64, 64,
  357.                 middlebmpDC, 0, 0, middlebmp.bmWidth, middlebmp.bmHeight, RGB( 0, 0, 0) );
  358.  
  359.             /******************************* left text ************************/
  360.  
  361.             baner.left = r.left + 90;
  362.             baner.top = r.top + sBaner.cy + 28;
  363.             baner.right = 460;
  364.             baner.bottom = r.bottom;
  365.  
  366.             lfHeight = -MulDiv( 8, GetDeviceCaps( MemDC, LOGPIXELSY), 72 );
  367.            
  368.             hf = CreateFont( lfHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0,
  369.                 L"Arial Black" );
  370.  
  371.             SetTextColor( MemDC, RGB( 0, 0, 0 ) );
  372.                
  373.             hfOld = (HFONT)SelectObject( MemDC, hf ); // needed for proper cleanup
  374.  
  375.             DrawTextEx( MemDC, L"УПРАВА ГРАДА БЕОГРАДА\nСЕКРЕТАРИЈАТ ЗА КОМУНАЛНЕ И СТАМБЕНЕ ПОСЛОВЕ\nУПРАВА ЗА ЕНЕРГЕТИКУ",
  376.                 wcslen(L"УПРАВА ГРАДА БЕОГРАДА\nСЕКРЕТАРИЈАТ ЗА КОМУНАЛНЕ И СТАМБЕНЕ ПОСЛОВЕ\nУПРАВА ЗА ЕНЕРГЕТИКУ"),
  377.                 &baner, DT_CENTER | DT_NOCLIP | DT_WORDBREAK, 0 );
  378.  
  379.             SelectObject( MemDC, hfOld ); // proper cleanup
  380.  
  381.             /*************************** right text *************************/
  382.  
  383.             baner.top = r.top + sBaner.cy + 28;
  384.             baner.left = r.right - 350;
  385.             baner.right = r.right - 100;
  386.             baner.bottom = r.bottom;
  387.  
  388.             lfHeight = -MulDiv( 8, GetDeviceCaps( MemDC, LOGPIXELSY), 72 );
  389.            
  390.             hf = CreateFont( lfHeight, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0,
  391.                 L"Arial Black" );
  392.                
  393.             hfOld = (HFONT)SelectObject( MemDC, hf ); // needed for proper cleanup
  394.  
  395.             DrawTextEx( MemDC, L"УНИВЕРЗИТЕТ У БЕОГРАДУ\nРУДАРСКО ГЕОЛОШКИ ФАКУЛТЕТ\nДЕПАРТМАН ЗА ХИДРОГЕОЛОГИЈУ",
  396.                 wcslen(L"УНИВЕРЗИТЕТ У БЕОГРАДУ\nРУДАРСКО ГЕОЛОШКИ ФАКУЛТЕТ\nДЕПАРТМАН ЗА ХИДРОГЕОЛОГИЈУ"),
  397.                 &baner, DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_WORDBREAK, 0 );
  398.  
  399.             SelectObject( MemDC, hfOld ); // proper cleanup
  400.  
  401.             /******************** main window's gradient background ***************/
  402.  
  403.             //============ down triangle =========//
  404.  
  405.             TRIVERTEX vertex[3];
  406.  
  407.             vertex[0].x     = r.right;
  408.             vertex[0].y     = r.bottom - r.top - 30;
  409.             vertex[0].Red   = 0xDB00;
  410.             vertex[0].Green = 0xE500;
  411.             vertex[0].Blue  = 0xF100;
  412.             vertex[0].Alpha = 0x0000;
  413.  
  414.             vertex[1].x     = r.left;
  415.             vertex[1].y     = r.bottom - r.top - 30;
  416.             vertex[1].Red   = 0x9500;
  417.             vertex[1].Green = 0xB300;
  418.             vertex[1].Blue  = 0xD700;
  419.             vertex[1].Alpha = 0x0000;
  420.  
  421.             vertex[2].x     = r.left;
  422.             vertex[2].y     = r.top + 120;
  423.             vertex[2].Red   = 0xDB00;
  424.             vertex[2].Green = 0xE500;
  425.             vertex[2].Blue  = 0xF100;
  426.             vertex[2].Alpha = 0x0000;
  427.  
  428.             // Create a GRADIENT_TRIANGLE structure that
  429.             // references the TRIVERTEX vertices.
  430.            
  431.             GRADIENT_TRIANGLE gTriangle;
  432.  
  433.             gTriangle.Vertex1 = 0;
  434.             gTriangle.Vertex2 = 1;
  435.             gTriangle.Vertex3 = 2;
  436.  
  437.             // Draw a shaded triangle.
  438.            
  439.             GradientFill( MemDC, vertex, 3, &gTriangle, 1, GRADIENT_FILL_TRIANGLE);
  440.  
  441.             //=============== upper triangle =================//
  442.  
  443.             TRIVERTEX vertex1[3];
  444.  
  445.             vertex1[0].x     = r.right;
  446.             vertex1[0].y     = r.bottom - r.top - 30;
  447.             vertex1[0].Red   = 0xDB00;
  448.             vertex1[0].Green = 0xE500;
  449.             vertex1[0].Blue  = 0xF100;
  450.             vertex1[0].Alpha = 0x0000;
  451.  
  452.             vertex1[1].x     = r.right;
  453.             vertex1[1].y     = r.top + 120;
  454.             vertex1[1].Red   = 0x9500;
  455.             vertex1[1].Green = 0xB300;
  456.             vertex1[1].Blue  = 0xD700;
  457.             vertex1[1].Alpha = 0x0000;
  458.  
  459.             vertex1[2].x     = r.left;
  460.             vertex1[2].y     = r.top + 120;
  461.             vertex1[2].Red   = 0xDB00;
  462.             vertex1[2].Green = 0xE500;
  463.             vertex1[2].Blue  = 0xF100;
  464.             vertex1[2].Alpha = 0x0000;
  465.  
  466.             // Draw a shaded triangle.
  467.            
  468.             GradientFill( MemDC, vertex1, 3, &gTriangle, 1, GRADIENT_FILL_TRIANGLE);
  469.  
  470.             /******************** left logo *******************/
  471.             ///////////////////////////////////////////////////////////////////////////////////////////
  472.             BitBltImages(hwnd, MemDC, leftbmpDC, rightbmpDC, image, image1);
  473.             ///////////////////////////////////////////////////////////////////////////////////////////
  474.            
  475.        
  476.             /********* draw a line at the bottom of the top banner ******/
  477.  
  478.             LOGBRUSH lb;
  479.  
  480.             HGDIOBJ hPen = NULL, hOldPen;
  481.  
  482.             lb.lbColor = RGB( 0, 0, 0 );
  483.             lb.lbHatch = 0;
  484.             lb.lbStyle = BS_SOLID;
  485.  
  486.             hPen = ExtCreatePen( PS_COSMETIC | PS_SOLID, 1, &lb, 0, NULL);
  487.  
  488.             hOldPen = SelectObject( MemDC, hPen ); // needed for proper cleanup
  489.  
  490.             MoveToEx( MemDC, r.left, r.top + 120, NULL );
  491.  
  492.             LineTo( MemDC, r.right - r.left + 1, r.top + 120 );
  493.  
  494.             // perform proper cleanup
  495.  
  496.             SelectObject( MemDC, hOldPen );
  497.  
  498.             DeleteObject(hPen);
  499.  
  500.             /***************** draw status bar **************/
  501.  
  502.             //============= down triangle ==================//
  503.  
  504.             TRIVERTEX vertex3[3];
  505.  
  506.             vertex3[0].x     = r.right;
  507.             vertex3[0].y     = r.bottom;
  508.             vertex3[0].Red   = 0x3100;
  509.             vertex3[0].Green = 0x8300;
  510.             vertex3[0].Blue  = 0x9900;
  511.             vertex3[0].Alpha = 0x0000;
  512.  
  513.             vertex3[1].x     = r.left;
  514.             vertex3[1].y     = r.bottom;
  515.             vertex3[1].Red   = 0x3100;
  516.             vertex3[1].Green = 0x8300;
  517.             vertex3[1].Blue  = 0x9900;
  518.             vertex3[1].Alpha = 0x0000;
  519.  
  520.             vertex3[2].x     = ( r.right - r.left ) / 2;
  521.             vertex3[2].y     = r.bottom - r.top - 15;  
  522.             vertex3[2].Red   = 0x4800;
  523.             vertex3[2].Green = 0xAC00;
  524.             vertex3[2].Blue  = 0xC600;
  525.             vertex3[2].Alpha = 0x0000;
  526.  
  527.             // Create a GRADIENT_TRIANGLE structure that
  528.             // references the TRIVERTEX vertices.
  529.            
  530.             GRADIENT_TRIANGLE gTriangleStatusBar;
  531.  
  532.             gTriangleStatusBar.Vertex1 = 0;
  533.             gTriangleStatusBar.Vertex2 = 1;
  534.             gTriangleStatusBar.Vertex3 = 2;
  535.  
  536.             // Draw a shaded triangle.
  537.            
  538.             GradientFill( MemDC, vertex3, 3, &gTriangleStatusBar, 1,
  539.                 GRADIENT_FILL_TRIANGLE);
  540.  
  541.             //============== upper triangle ==============//
  542.  
  543.             TRIVERTEX vertex1s[3];
  544.  
  545.             vertex1s[0].x     = r.right;
  546.             vertex1s[0].y     = r.bottom - r.top - 30;
  547.             vertex1s[0].Red   = 0x3100;
  548.             vertex1s[0].Green = 0x8300;
  549.             vertex1s[0].Blue  = 0x9900;
  550.             vertex1s[0].Alpha = 0x0000;
  551.  
  552.             vertex1s[1].x     = r.left;
  553.             vertex1s[1].y     = r.bottom - r.top - 30;
  554.             vertex1s[1].Red   = 0x3100;
  555.             vertex1s[1].Green = 0x8300;
  556.             vertex1s[1].Blue  = 0x9900;
  557.             vertex1s[1].Alpha = 0x0000;
  558.  
  559.             vertex1s[2].x     = ( r.right - r.left ) / 2;
  560.             vertex1s[2].y     = r.bottom - r.top - 15;
  561.             vertex1s[2].Red   = 0x4800;
  562.             vertex1s[2].Green = 0xAC00;
  563.             vertex1s[2].Blue  = 0xC600;
  564.             vertex1s[2].Alpha = 0x0000;
  565.  
  566.             // Draw a shaded triangle.
  567.            
  568.             GradientFill( MemDC, vertex1s, 3, &gTriangleStatusBar, 1,
  569.                 GRADIENT_FILL_TRIANGLE );
  570.  
  571.             //================== left triangle =================//
  572.  
  573.             TRIVERTEX vertex2s[3];
  574.  
  575.             vertex2s[0].x     = r.left;
  576.             vertex2s[0].y     = r.bottom ;
  577.             vertex2s[0].Red   = 0x3100;
  578.             vertex2s[0].Green = 0x8300;
  579.             vertex2s[0].Blue  = 0x9900;
  580.             vertex2s[0].Alpha = 0x0000;
  581.  
  582.             vertex2s[1].x     = r.left;
  583.             vertex2s[1].y     = r.bottom - r.top - 30;
  584.             vertex2s[1].Red   = 0x3100;
  585.             vertex2s[1].Green = 0x8300;
  586.             vertex2s[1].Blue  = 0x9900;
  587.             vertex2s[1].Alpha = 0x0000;
  588.  
  589.             vertex2s[2].x     = ( r.right - r.left ) / 2;
  590.             vertex2s[2].y     = r.bottom - r.top - 15;
  591.             vertex2s[2].Red   = 0x4800;
  592.             vertex2s[2].Green = 0xAC00;
  593.             vertex2s[2].Blue  = 0xC600;
  594.             vertex2s[2].Alpha = 0x0000;
  595.  
  596.             // Draw a shaded triangle.
  597.            
  598.             GradientFill( MemDC, vertex2s, 3, &gTriangleStatusBar, 1,
  599.                 GRADIENT_FILL_TRIANGLE );
  600.  
  601.             //================= right triangle ================//
  602.  
  603.             TRIVERTEX vertex3s[3];
  604.  
  605.             vertex3s[0].x     = r.right;
  606.             vertex3s[0].y     = r.bottom - r.top - 30;
  607.             vertex3s[0].Red   = 0x3100;
  608.             vertex3s[0].Green = 0x8300;
  609.             vertex3s[0].Blue  = 0x9900;
  610.             vertex3s[0].Alpha = 0x0000;
  611.  
  612.             vertex3s[1].x     = r.right;
  613.             vertex3s[1].y     = r.bottom;
  614.             vertex3s[1].Red   = 0x3100;
  615.             vertex3s[1].Green = 0x8300;
  616.             vertex3s[1].Blue  = 0x9900;
  617.             vertex3s[1].Alpha = 0x0000;
  618.  
  619.             vertex3s[2].x     = ( r.right - r.left ) / 2;
  620.             vertex3s[2].y     = r.bottom - r.top - 15;
  621.             vertex3s[2].Red   = 0x4800;
  622.             vertex3s[2].Green = 0xAC00;
  623.             vertex3s[2].Blue  = 0xC600;
  624.             vertex3s[2].Alpha = 0x0000;
  625.  
  626.             // Draw a shaded triangle.
  627.            
  628.             GradientFill( MemDC, vertex3s, 3, &gTriangleStatusBar, 1,
  629.                 GRADIENT_FILL_TRIANGLE );
  630.  
  631.             //========= draw right text in status bar =============//
  632.  
  633.             lfHeight = -MulDiv( 8, GetDeviceCaps( MemDC, LOGPIXELSY), 72 );
  634.            
  635.             hf = CreateFont( lfHeight, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0,
  636.                 L"Arial Black" );
  637.                
  638.             hfOld = (HFONT)SelectObject( MemDC, hf ); // needed for proper cleanup
  639.  
  640.             GetTextExtentPoint32( MemDC, L"ЦЕНТАР ЗА ОБНОВЉИВЕ ВОДНЕ ЕНЕРГЕТСКЕ РЕСУРСЕ",
  641.                 wcslen(L"ЦЕНТАР ЗА ОБНОВЉИВЕ ВОДНЕ ЕНЕРГЕТСКЕ РЕСУРСЕ"), &sBaner );
  642.  
  643.             // position it properly
  644.  
  645.             RECT rcStatusBar;
  646.  
  647.             rcStatusBar.bottom = r.bottom;
  648.             rcStatusBar.right = r.left + sBaner.cx + 30;
  649.             rcStatusBar.left = r.left + 30;
  650.             rcStatusBar.top = r.bottom - r.top - 30;
  651.  
  652.             // draw it to the back buffer
  653.  
  654.             DrawTextEx( MemDC, L"РУДАРСКО ГЕОЛОШКИ ФАКУЛТЕТ\nЦЕНТАР ЗА ОБНОВЉИВЕ ВОДНЕ ЕНЕРГЕТСКЕ РЕСУРСЕ",
  655.                 wcslen(L"РУДАРСКО ГЕОЛОШКИ ФАКУЛТЕТ\nЦЕНТАР ЗА ОБНОВЉИВЕ ВОДНЕ ЕНЕРГЕТСКЕ РЕСУРСЕ"),
  656.                 &rcStatusBar, DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_WORDBREAK, 0 );
  657.  
  658.             SelectObject( MemDC, hfOld ); // proper cleanup
  659.  
  660.             //============== right text in the status bar ==================//
  661.  
  662.             lfHeight = -MulDiv( 10, GetDeviceCaps( MemDC, LOGPIXELSY), 72 );
  663.            
  664.             hf = CreateFont( lfHeight, 0, 0, 0, FW_BOLD, TRUE, 0, 0, 0, 0, 0, 0, 0,
  665.                 L"Arial" );
  666.                
  667.             hfOld = (HFONT)SelectObject( MemDC, hf ); // needed for proper cleanup
  668.  
  669.             GetTextExtentPoint32( MemDC, L" Дејан Миленић & Ана Врањеш © 2013 сва права задржана",
  670.                 wcslen(L" Дејан Миленић & Ана Врањеш © 2013 сва права задржана"), &sBaner );
  671.  
  672.             // position it properly
  673.  
  674.             rcStatusBar.bottom = r.bottom;
  675.             rcStatusBar.right = r.right - 10;
  676.             rcStatusBar.left = r.right - r.left - sBaner.cx - 10;
  677.             rcStatusBar.top = r.bottom - r.top - sBaner.cy;
  678.  
  679.             // draw it to the back buffer
  680.  
  681.             DrawTextEx( MemDC, L" Дејан Миленић & Ана Врањеш © 2013 сва права задржана",
  682.                 wcslen(L" Дејан Миленић & Ана Врањеш © 2013 сва права задржана"),
  683.                 &rcStatusBar, DT_CENTER | DT_VCENTER | DT_NOCLIP | DT_WORDBREAK | DT_NOPREFIX, 0 );
  684.  
  685.             // draw icon
  686.  
  687.             DrawIconEx( MemDC, r.left, r.bottom - r.top - 30, hiAdmin, 30, 30, NULL, NULL, DI_NORMAL );
  688.  
  689.             // perform proper cleanup
  690.  
  691.             SelectObject( MemDC, hfOld );
  692.  
  693.             DeleteObject(hf);
  694.  
  695.             /****************** draw back buffer on the screen DC *****************/
  696.  
  697.             BitBlt( hdc, 0, 0, r.right - r.left, r.bottom - r.top, MemDC, 0, 0, SRCCOPY );
  698.  
  699.             /************** cleanup *******************/
  700.  
  701.             //SelectObject( MemDC, oldBmp );
  702.  
  703.             //DeleteObject(bmp); // compatible bitmap for MemDC
  704.  
  705.             //DeleteDC(hdcMemImg); // memory DC for middle logo
  706.  
  707.             //DeleteDC(MemDC);
  708.  
  709.             EndPaint( hwnd, &ps);
  710.         }
  711.         return (LRESULT)0;
  712.  
  713.     case WM_SIZE:
  714.  
  715.         InvalidateRect( hwnd, NULL, TRUE);
  716.  
  717.         return (LRESULT)0;
  718.  
  719.     case WM_CLOSE:
  720.  
  721.         // destroy bitmaps
  722.  
  723.         DeleteObject(bmpSimbol);
  724.  
  725.         // destroy icons
  726.  
  727.         DestroyIcon(hIcon);
  728.         DestroyIcon(hiAdmin);
  729.  
  730.         // destroy brushes
  731.        
  732.         DeleteObject(hbPozadina);
  733.  
  734.         // delete Image objects
  735.  
  736.         delete image;
  737.         delete image1;
  738.  
  739.         DestroyWindow(hwnd);
  740.  
  741.         return (LRESULT)0;
  742.  
  743.     case WM_DESTROY:
  744.  
  745.         PostQuitMessage(0);
  746.  
  747.         //main dc
  748.         DeleteDC(MemDC);
  749.         DeleteObject(bmp);
  750.  
  751.         //left image dc
  752.         DeleteDC(leftbmpDC);
  753.        
  754.         //right image dc
  755.         DeleteDC(rightbmpDC);
  756.  
  757.         return (LRESULT)0;
  758.  
  759.     default:
  760.         return DefWindowProc(hwnd, msg, wParam, lParam);
  761.     }
  762.     return 0;
  763. }
  764.  
  765. // WinMain
  766.  
  767. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
  768.                    int nCmdShow)
  769. {
  770.     // store hInstance in global variable for later use
  771.  
  772.     hInst = hInstance;
  773.    
  774.     // load main icon
  775.  
  776.     hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON1));
  777.  
  778.     WNDCLASSEX wc;
  779.     HWND hwnd;
  780.     MSG Msg;
  781.  
  782.     /*********** variables for GDI+ initialization *****************/
  783.  
  784.     GdiplusStartupInput gdiplusStartupInput;
  785.     ULONG_PTR           gdiplusToken;
  786.  
  787.     /************** Initialize GDI+. *************************/
  788.  
  789.     GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
  790.  
  791.     /*************** finished GDI+ initialisation ********************/
  792.  
  793.     // initialize common controls
  794.  
  795.     INITCOMMONCONTROLSEX iccex;
  796.     iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
  797.     iccex.dwICC = ICC_LISTVIEW_CLASSES | ICC_UPDOWN_CLASS | ICC_STANDARD_CLASSES ;
  798.     InitCommonControlsEx(&iccex);
  799.    
  800.     // register main window class
  801.  
  802.     wc.cbSize = sizeof(WNDCLASSEX);
  803.     wc.style = 0;
  804.     wc.lpfnWndProc = WndProc;
  805.     wc.cbClsExtra = 0;
  806.     wc.cbWndExtra = 0;
  807.     wc.hInstance = hInst;
  808.     wc.hIcon = hIcon;
  809.     wc.hCursor = LoadCursor( NULL, IDC_ARROW );
  810.     wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
  811.     wc.lpszMenuName = NULL;
  812.     wc.lpszClassName = L"Main_Window";
  813.     wc.hIconSm = hIcon;
  814.  
  815.     if(!RegisterClassEx(&wc))
  816.     {
  817.         MessageBox(NULL, L"Window Registration Failed!", L"Error!", MB_ICONEXCLAMATION |
  818.             MB_OK);
  819.  
  820.         return 0;
  821.     }
  822.  
  823.     // create main window
  824.  
  825.     hwnd = CreateWindowEx( 0, L"Main_Window", L"Геотермист", WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
  826.         ( GetSystemMetrics(SM_CXMAXIMIZED) - 1020 ) / 2, 0, 1020, 600, NULL, NULL, hInstance, 0 );
  827.  
  828.     if(hwnd == NULL)
  829.     {
  830.         MessageBox(NULL, L"Window creation failed!", L"Error!", MB_ICONEXCLAMATION |
  831.             MB_OK);
  832.  
  833.         return 0;
  834.     }
  835.  
  836.     ShowWindow(hwnd, nCmdShow);
  837.     UpdateWindow(hwnd);
  838.  
  839.     while(GetMessage(&Msg, NULL, 0, 0) > 0)
  840.     {
  841.         TranslateMessage(&Msg);
  842.         DispatchMessage(&Msg);
  843.     }
  844.  
  845.     // shutdownd GDI+
  846.  
  847.     GdiplusShutdown(gdiplusToken);
  848.  
  849.     return Msg.wParam;
  850. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement