Maus.cpp 2.9 KB

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