AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [nonVCL] Farbe von STATIC bei Mausbewegung ändern
Thema durchsuchen
Ansicht
Themen-Optionen

[nonVCL] Farbe von STATIC bei Mausbewegung ändern

Ein Thema von Chris P · begonnen am 11. Feb 2007 · letzter Beitrag vom 12. Feb 2007
Antwort Antwort
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#1

[nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 15:01
Hi Leute,

mein nonVCL-Programm soll folgendes machen:

Bei einer Mausbewegung soll die Farbe des darunterliegenden Pixels ermittlelt werden.
Soweit kein Problem. Jetzt soll aber die Farbe in einem STATIC-Feld angezeigt werden.
Also so ähnlich wie bei Luckies "WhatColor".

Die Farbe bekomme ich mit
clr := GetPixel(AppDC, pt.x, pt.y); Und den Pinsel mit
brush := CreateSolidBrush(clr); Nun habe ich es schon mit SetBKColor versucht aber leider ohne Erfolg.

Muss ich evtl. eine WM_CTLCOLORSTATIC-Nachricht an das Parentfenster schicken?
  Mit Zitat antworten Zitat
stefan2005

Registriert seit: 30. Sep 2003
Ort: Puchheim
250 Beiträge
 
Delphi 6 Personal
 
#2

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 18:07
hi,
ich bin mir jetzt nicht sicher ob du das gemacht hast oder ob das überhaupt stimmt, aber man muss einen erstellten Brush oder Pen doch erst mittels SelectObject aktivieren ?
Vielleicht hast du das vergessen.

Grüsse,
Stefan
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 18:18
Auch mit SelectObject habe ich es versucht.

Geht leider auch nicht.
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 18:24
Zur Hilfe nochmal mein Quelltext:

Delphi-Quellcode:
function DlgFunc(hWnd: HWND; uMsg: Cardinal; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
var
   pt: TPoint;
   brush: HBRUSH;
begin
   Result := TRUE;
   case uMsg of
   
   ...
   
   WM_MOUSEMOVE:
      begin
        if ((GetCapture = hWnd) and GetCursorPos(pt)) then
        begin

         
           // pixelcolor
          clr := GetPixel(AppDC, pt.x, pt.y);

          dcRect := getdc(GetDlgItem(hwnd, 106));
          brush := CreateSolidBrush(clr);
          SelectObject(dcRect, brush);
          
          SetBkColor(dcRect , clr);
        end;
      end;
    ...
end;
  Mit Zitat antworten Zitat
Sunshine

Registriert seit: 1. Feb 2003
Ort: HN
1 Beiträge
 
#5

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 19:44
Hi,

du must WM_CTLCOLORSTATIC abfangen. SetBkColor funktioniert irgendwie nicht bei Static Controls.

Also ungefähr so:

Delphi-Quellcode:
begin
   Result := TRUE;
   case uMsg of
   
   ...
   
   WM_MOUSEMOVE:
      begin
        if ((GetCapture = hWnd) and GetCursorPos(pt)) then
        begin
           // pixelcolor
          clr := GetPixel(AppDC, pt.x, pt.y);
      end;
   end;

   WM_CTLCOLORSTATIC:
     begin
       brush := CreateSolidBrush(clr);
       result := BOOL(brush);
     end;
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 20:14
Erstmal vielen Dank für die Antworten.

WM_CTLCOLORSTATIC wird geschickt wenn das Control neu gezeichnet wird.

Also müsste ich ja nach
clr := GetPixel(AppDC, pt.x, pt.y); das Control neuzeichnen?

Oder wie löse ich das WM_CTLCOLORSTATIC-Ereignis aus?
  Mit Zitat antworten Zitat
stefan2005

Registriert seit: 30. Sep 2003
Ort: Puchheim
250 Beiträge
 
Delphi 6 Personal
 
#7

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 20:22
hi,
vom Gefühl her würde ich sagen, dass GetPixel nichts neuzeichnet (da es nur einen pixel ausließt).
probier es doch mal mit InvalidRect, das sollte das auf alle Fälle neuzeichnen.

Grüsse,
Stefan
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 20:37
Das hier führt leider immer noch zu gewünschten Erfolg:
Delphi-Quellcode:
WM_INITDIALOG:
     begin
        GetWindowRect(GetDlgItem(hwnd, 106), rc);
        AppDC := CreateDC('DISPLAY', nil, nil, nil);
     end;
   WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          IDC_COLOR_RECT:
            begin
              brush := CreateSolidBrush(clr);
              Result := BOOl(brush);
            end;
        end;
      end;
   WM_MOUSEMOVE:
      begin
        if ((GetCapture = hWnd) and GetCursorPos(pt)) then
        begin
       
          // pixelcolor
          clr := GetPixel(AppDC, pt.x, pt.y);

          invalidateRect(GetDlgItem(hwnd, 106), @rc, true);
         
        end;
      end;
 ....
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 11. Feb 2007, 22:38
Also ich habe deinen Code mal geändert, bei mir läuft das jetzt. Natürlich nur innerhalb des Fensters, denn außerhalb funktioniert WM_MOUSEMOVE nicht. Kannst ja mal testen, must sicherlich noch anpassen, da du nur ein Teil des Codes gezeigt hast. Ist sicher noch nicht optimal.
Delphi-Quellcode:
var
 clr: integer;//globale variable

//...
var
  WinInfo: TWindowInfo;
  brush: HBrush;
  pt: TPoint;
  hDC: cardinal;
begin
  //Result := 0;
  case uMsg of
    WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          IDC_COLOR_RECT:
            begin
              brush := CreateSolidBrush(clr);
              Result := BOOl(brush);
            end;
        end;
      end;
   WM_MOUSEMOVE:
      begin
        if (*(GetCapture = hWnd) and*) GetCursorPos(pt) then
        begin
          FillChar(WinInfo,Sizeof(WinInfo),0);
          WinInfo.cbSize := Sizeof(WinInfo);
          GetWindowInfo(hWnd,WinInfo);
          
          dec(pt.X, WinInfo.rcClient.Left);
          dec(pt.Y, WinInfo.rcClient.Top);
          hDC:= GetDC(hWnd);
          clr:= GetPixel(hDC, pt.x, pt.y);
          windows.ReleaseDC(hWnd, hDC);
          RedrawWindow(hwndLabel1, nil, 0, RDW_INVALIDATE or RDW_ERASE);//neu Zeichnen
       end;
      end;
//...
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Chris P

Registriert seit: 8. Mär 2004
230 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: [nonVCL] Farbe von STATIC bei Mausbewegung ändern

  Alt 12. Feb 2007, 11:28
Danke bitsetter!!!

RedrawWindow(...) ist genau das was ich gebraucht habe!

Ich kann WM_MOUSEMOVE auch außerhalb des Fensters abfangen, da ich mit SetCapture arbeite.


Mein Problem ist gelöst


Mit freundlichen Grüßen

Chris P
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz