Maus.cpp 3.1 KB

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