AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Auf nonVCL Button Zeichnen Wie?

Ein Thema von ts_abc · begonnen am 4. Okt 2004 · letzter Beitrag vom 11. Okt 2004
Antwort Antwort
ts_abc

Registriert seit: 22. Sep 2003
20 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Auf nonVCL Button Zeichnen Wie?

  Alt 4. Okt 2004, 23:03
Hallo,

Weiß jemand wie man auf einen unter nonVCL erstellten Button mit 'BS_OWNERDRAW' Zeichnen kann?

Gruß Thomas
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Auf nonVCL Button Zeichnen Wie?

  Alt 10. Okt 2004, 14:31
Hi,
ich denke mal, dass du versuchen musst mit Hilfe von MSDN-Library durchsuchenGetDC das Device Context rauszubekommen. Wenn du den hasst lässt sich darauf zeichnen. Nähere Informationen dazu findest du auf jedenfall im MSDN.

Chris
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#3

Re: Auf nonVCL Button Zeichnen Wie?

  Alt 10. Okt 2004, 14:51
Hier habe ich mal vor längerem eine nonVCL-Color-Button Beispiel erstellt, da dürfte aller nötiger Quelltext dabei sein.

PS: Die wichtigsten Stichworte sind: Es läuft über WM_DRAWITEM, über den lParam bekommt man einen Pointer auf eine PDRAWITEMSTRUCT, die alles nötige wie HWND, DC und Rect enthält, z.B. PDRAWITEMSTRUCT(dblParam).hDC.
  Mit Zitat antworten Zitat
ts_abc

Registriert seit: 22. Sep 2003
20 Beiträge
 
Delphi 10 Seattle Professional
 
#4

Re: Auf nonVCL Button Zeichnen Wie?

  Alt 11. Okt 2004, 00:19
Hallo,

wollte gerade Posten das ich herausgefunden habe wie es geht. Aber trotzdem besten dank für eure Posts es war genau das was ich gesucht habe. Habe es so wie scp beschrieben hat gemacht. Obendrein war da noch das Problem dass wenn die Maus über dem Button schwebt kein WM_DRAWITEM ausgelöst wurde und ebenso nicht wenn Sie ihn verläst. Musste dies selbst implementieren in dem ich dem Button die WndProc geklaut habe. Poste dies mal hier noch mit falls noch jemand dieses Problem hat.

Delphi-Quellcode:
uses
  XPTheme,
  Windows,
  Messages,
  ...;

const
  IDC_BUTTON_1 = 19;

var
  hButton_1 : DWORD;

//
// "BtnWndProc"
//
var
  MsInBtn1,
  BtnLM : Boolean;
  DefBtnProc : Pointer;

function BtnWndProc(wnd: HWND; uMsg: UINT; wp: wParam; lp: LParam): LRESULT;
  stdcall;
var
  TME : TTrackMouseEvent;
  TME_Proc : function(var EventTrack: TTrackMouseEvent): BOOL; stdcall;
begin
  Result := 0;
  case uMsg of
    WM_LBUTTONDOWN:
      begin
        BtnLM := True;
        Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
      end;
    WM_LBUTTONUP:
      begin
        BtnLM := False;
        Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
      end;
    WM_MOUSEHOVER:
      begin
        if MsInBtn1 or BtnLM then exit;
        MsInBtn1 := True;
        RedrawWindow(wnd, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME);
        Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
      end;
    WM_MOUSELEAVE:
      begin
        if not MsInBtn1 or BtnLM then exit;
        MsInBtn1 := False;
        RedrawWindow(wnd, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME);
        Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
      end;
    WM_MOUSEMOVE:
      begin
        TME.cbSize := sizeof(TTrackMouseEvent);
        TME.dwFlags := TME_HOVER or TME_LEAVE;
        TME.dwHoverTime := 10;
        TME.hwndTrack := hButton_1;
        TME_Proc := @TrackMouseEvent;
        TME_Proc(TME);
        Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
      end;
  else
    Result := CallWindowProc(DefBtnProc, wnd, uMsg, wp, lp);
  end;
end;

//
// "WndProc"
//
function WndProc(wnd: HWND; uMsg: UINT; wp: wParam; lp: LParam): LRESULT;
  stdcall;
var
  Details : TThemedElementDetails;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin

        ...

        // Button erzeugen
        hButton_1 := CreateWindowEx(0, 'BUTTON', 'x', WS_VISIBLE or WS_CHILD or
          BS_OWNERDRAW, 255,0,13,13, Wnd, IDC_BUTTON_1, hInstance,nil);
        DefBtnProc := Pointer(GetWindowLong(hButton_1, GWL_WNDPROC));
        SetWindowLong(hButton_1, GWL_WNDPROC, Integer(@BtnWndProc));

        ...
      end;
    WM_THEMECHANGED:
      UpdateThemes;
    WM_DRAWITEM:
      case wp of
        IDC_BUTTON_1:
          begin
            with PDrawItemStruct(lp)^ do
              if MsInBtn1 and not BtnLM then
                itemState := itemState or ODS_HOTLIGHT
              else
                itemState := itemState and not ODS_HOTLIGHT;

              Details := GetElementDetails(ttbButtonNormal);
              DrawParentBackground(hButton_1, hDC, @Details, True);
              DrawButton(hButton_1, PDrawItemStruct(lp)^);
            end;
          end;
      end;
    WM_COMMAND:
      case LOWORD(wp) of
        IDC_BUTTON_1:
          begin
            if HIWORD(wp) = BN_CLICKED then SendMessage(wnd,WM_CLOSE,0,0);
          end;
      end;
    WM_DESTROY:
      begin
        SetWindowLong(hButton_1, GWL_WNDPROC, Integer(DefBtnProc));
        DestroyThemeServices;
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(wnd,uMsg,wp,lp);
  end;
end;
Gruß Thomas
  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 01:37 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