컨트롤을 각각 다시 칠하지 않고 동시에 컨트롤을 변경하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/2421646

  •  19-09-2019
  •  | 
  •  

문제

예를 들어 런타임에 두 개의 버튼을 비활성화해야 합니다.첫 번째 버튼을 비활성화한 후 회색으로 바뀌었고 두 번째 버튼도 회색으로 변했습니다.그런데 리페인팅을 동시에 하는 방법을 모르겠어요!

나는 그런 것이 필요합니다 :

  1. 양식 고정(다시 그리기 비활성화)
  2. 첫 번째 버튼 비활성화
  3. 두 번째 버튼 비활성화
  4. 양식 다시 그리기 활성화

그것을 구현하는 방법은 무엇입니까?

도움이 되었습니까?

해결책

Win32 API를보십시오 WM_SETREDRAW 메시지. 예를 들어:

SendMessage(Handle, WM_SETREDRAW, False, 0);
Button1.Enabled := False;
Button2.Enabled := False;
SendMessage(Handle, WM_SETREDRAW, True, 0);
InvalidateRect(Handle, nil, True);

다른 팁

애플리케이션이 메시지 루프에 다시 들어갈 때까지 메시지를 처리할 수 없으므로 메시지 처리에 의존하는 제어 상태를 수정/업데이트하려는 모든 시도는 메시지를 "펌프"하지 않는 단일 코드 시퀀스 내에서 작동하지 않습니다.

다행스럽게도 VCL 컨트롤은 일반적으로 Update 메서드를 통해 메시지가 처리될 때까지 기다리지 않고 강제로 다시 그리는 방법을 제공합니다.

Button1.Enabled := False;
Button2.Enabled := False;
Button1.Update;
Button2.Update;

이는 양식 다시 그리기를 비활성화하는 것과 독립적으로 작동합니다.어쨌든 응용 프로그램이 메시지 루프에 들어갈 때까지 양식은 다시 그려지지 않으므로 메시지 처리를 유발하지 않는 단일 프로시저 내에서 양식 그리기를 비활성화하고 다시 활성화하는 것은 시간 낭비입니다.

이것은 정확히 두 버튼을 동시에 다시 그리는 것이 아닐 수도 있지만, 이 문제의 범위를 훨씬 넘어서는 멀티스레드 GUI 페인팅 코드에 들어가지 않고는 두 개의 별도 컨트롤을 실제로 동시에 그리는 것은 불가능합니다.그러나 이러한 방식으로 두 개의 버튼에 대한 업데이트 호출은 필요한 만큼 거의 동시에 적용됩니다.

Elias551에 :

Lockwindowupdate는 아마도 드래그 앤 드롭 작업을위한 것이기 때문에이를 처리하는 가장 좋은 방법은 아니며 오용시 미묘한 버그를 소개 할 수 있습니다.

보다 http://blogs.msdn.com/b/oldnewthing/archive/2007/02/22/1742084.aspx

대신 사용하십시오 SendMessage(hwnd, WM_SETREDRAW, FALSE, 0)

WM_SETREDRAW의 위의 결정은 하위 Windows를 업데이트하지 않습니다.

대신 RedRawWindow를 권장합니다.

RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN);

도움이 될 수 있습니다 : API Lockwindowupdate (핸들 : HWND) 잠금 장치는 손잡이와 어린이로 끌어 당깁니다.

전:

procedure TForm1.ColorButtons();
begin
  LockWindowUpdate(Self.Handle);
  // Make some stuff
  LockWindowUpdate(0);
end;

잠긴 핸들이 재설정되면 구성 요소가 다시 인쇄됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top