AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Komisches Problem beim Neuzeichnen

Komisches Problem beim Neuzeichnen

Ein Thema von Rastaman · begonnen am 5. Feb 2006 · letzter Beitrag vom 5. Feb 2006
 
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#1

Komisches Problem beim Neuzeichnen

  Alt 5. Feb 2006, 20:33
Hallo.
Ich hab einfach n bischn rumgespielt und bin auf ne komische Sache gestoßen.
Folgendes soll einen Kreis zeichnen, dessen Radius man in einem Edit editieren kann.
Das Problem zu schildern wäre zu kompliziert, probierts einfach mal aus

Delphi-Quellcode:
program TestProg;

uses
  Messages,
  Windows;

const
  CLASSNAME = 'WindowClass';
  STYLEFLAGS = WS_SYSMENU;
  STYLEFLAGSEDIT = ES_AUTOHSCROLL or WS_BORDER or WS_CHILD or WS_VISIBLE;
var
  WndClassInfo: TWndClass;
  Msg: TMsg;

  Mittelpunkt: TPoint = (
    X: 200;
    Y: 180);
  Radius: Integer = 5;

function CreateControls(Handle: HWND): Boolean;
var
  ControlArray: Array [0..1] of HWND;
begin
  Result := True;
  ControlArray[0] := CreateWindow('EDIT', '5', STYLEFLAGSEDIT,
    0, 0, 30, 20, Handle, 1, hInstance, nil);

  if not IsWindow(ControlArray[0]) then
    Result := False;
end;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
var
  ps: TPaintStruct;
  WndDC: HDC;
  Brush, BrushOld: HBRUSH;

  Buffer: Array [0..2] of Char;
  Code: Integer;
begin
  case uMsg of
    WM_CLOSE:
      begin
        DestroyWindow(hWnd);
        PostQuitMessage(0);
        Result := 0;
      end;
    WM_COMMAND:
      begin
        if HiWord(wParam) = EN_CHANGE then
        begin
          SendMessage(GetDlgItem(hWnd, 1), WM_GETTEXT, 3, Integer(@Buffer));
          Val(Buffer, Radius, Code);
          SendMessage(hWnd, WM_PAINT, 0, 0);
          Result := 0;
        end;
      end;
    WM_CREATE:
      begin
        if not CreateControls(hWnd) then
          SendMessage(hWnd, WM_CLOSE, 0, 0);

        SendMessage(GetDlgItem(hWnd, 1), EM_LIMITTEXT, 2, 0);
        ShowWindow(hWnd, SW_SHOW);
        Result := 0;
      end;
    WM_PAINT:
      begin
        WndDC := BeginPaint(hWnd, ps);
        Brush := CreateSolidBrush($00C8D0D4);
        BrushOld := SelectObject(WndDC, Brush);
        RectAngle(WndDC, -1, -1, 401, 361);
        SelectObject(WndDC, BrushOld);
        DeleteObject(Brush);
        Ellipse(WndDC, Mittelpunkt.X - Radius, Mittelpunkt.Y - Radius,
          Mittelpunkt.X + Radius, Mittelpunkt.Y + Radius);
        EndPaint(WndDC, ps);
        Result := 0;
      end;
  else
    Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

begin
  with WndClassInfo do
  begin
    style := CS_VREDRAW or CS_HREDRAW;
    lpfnWndProc := @WndProc;
    hInstance := hInstance;
    hCursor := LoadCursor(0, IDC_ARROW);
    hbrBackground := COLOR_APPWORKSPACE;
    lpszClassName := CLASSNAME;
  end;

  RegisterClass(WndClassInfo);

  CreateWindow(CLASSNAME, 'Test Prog', STYLEFLAGS,
    440, 332, 400, 360, 0, 0, hInstance, nil);

  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end.
Danke!
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 02:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz