Maus.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "Maus.h"
  2. #include "Bild.h"
  3. #include "Punkt.h"
  4. using namespace Framework;
  5. // Inhalt der Maus Klasse aus Maus.h
  6. // Konstruktor
  7. Maus::Maus()
  8. : hMaus( LoadCursor( 0, IDC_ARROW ) ),
  9. ref( 1 )
  10. {
  11. }
  12. // nicht constant
  13. void Maus::ladeMaus( int mausId )
  14. {
  15. if( mausId == MausId::nichts )
  16. hMaus = 0;
  17. if( mausId == MausId::normal )
  18. hMaus = LoadCursor( 0, IDC_ARROW );
  19. if( mausId == MausId::hand )
  20. hMaus = LoadCursor( 0, IDC_HAND );
  21. if( mausId == MausId::warten )
  22. hMaus = LoadCursor( 0, IDC_APPSTARTING );
  23. if( mausId == MausId::verschieben )
  24. hMaus = LoadCursor( 0, IDC_SIZEALL );
  25. if( mausId == MausId::text )
  26. hMaus = LoadCursor( 0, IDC_IBEAM );
  27. if( mausId == MausId::wahgerecht )
  28. hMaus = LoadCursor( 0, IDC_SIZEWE );
  29. if( mausId == MausId::senkrecht )
  30. hMaus = LoadCursor( 0, IDC_SIZENS );
  31. if( mausId == MausId::diagonal1 )
  32. hMaus = LoadCursor( 0, IDC_SIZENWSE );
  33. if( mausId == MausId::diagonal2 )
  34. hMaus = LoadCursor( 0, IDC_SIZENESW );
  35. if( mausId == MausId::verboten )
  36. hMaus = LoadCursor( 0, IDC_NO );
  37. SetCursor( hMaus );
  38. }
  39. void Maus::ladeMaus( Bild *maus )
  40. {
  41. HBITMAP hAndMaskBitmap;
  42. HBITMAP hXorMaskBitmap;
  43. HDC hDC = GetDC( 0 );
  44. HDC hAndMaskDC = CreateCompatibleDC( hDC );
  45. HDC hXorMaskDC = CreateCompatibleDC( hDC );
  46. hAndMaskBitmap = CreateCompatibleBitmap( hDC, maus->getBreite(), maus->getHöhe() );
  47. hXorMaskBitmap = CreateCompatibleBitmap( hDC, maus->getBreite(), maus->getHöhe() );
  48. //Select the bitmaps to DC
  49. HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject( hAndMaskDC, hAndMaskBitmap );
  50. HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject( hXorMaskDC, hXorMaskBitmap );
  51. //Scan each pixel of the souce bitmap and create the masks
  52. int y;
  53. for( int x = 0; x < maus->getBreite(); ++x )
  54. {
  55. for( y = 0; y < maus->getHöhe(); ++y )
  56. {
  57. int pixel = maus->getPixel( x, y );
  58. if( ( ( pixel >> 24 ) & 0xFF ) == 0 )
  59. {
  60. SetPixel( hAndMaskDC, x, y, RGB( 255, 255, 255 ) );
  61. SetPixel( hXorMaskDC, x, y, RGB( 0, 0, 0 ) );
  62. }
  63. else
  64. {
  65. SetPixel( hAndMaskDC, x, y, RGB( 0, 0, 0 ) );
  66. SetPixel( hXorMaskDC, x, y, RGB( ( pixel >> 16 ) & 0xFF, ( pixel >> 8 ) & 0xFF, pixel & 0xFF ) );
  67. }
  68. }
  69. }
  70. SelectObject( hAndMaskDC, hOldAndMaskBitmap );
  71. SelectObject( hXorMaskDC, hOldXorMaskBitmap );
  72. DeleteDC( hXorMaskDC );
  73. DeleteDC( hAndMaskDC );
  74. ReleaseDC( 0, hDC );
  75. ICONINFO iconinfo = { 0 };
  76. iconinfo.fIcon = 0;
  77. iconinfo.xHotspot = 0;
  78. iconinfo.yHotspot = 0;
  79. iconinfo.hbmMask = hAndMaskBitmap;
  80. iconinfo.hbmColor = hXorMaskBitmap;
  81. hMaus = CreateIconIndirect( &iconinfo );
  82. SetCursor( hMaus );
  83. }
  84. void Maus::update()
  85. {
  86. SetCursor( hMaus );
  87. }
  88. // constant
  89. HCURSOR Maus::getMausHandle()
  90. {
  91. return hMaus;
  92. }
  93. // Reference Counting
  94. Maus *Maus::getThis()
  95. {
  96. ++ref;
  97. return this;
  98. }
  99. Maus *Maus::release()
  100. {
  101. --ref;
  102. if( !ref )
  103. delete this;
  104. return 0;
  105. }