ToolStripDropDownMenu에 대한 시각적 스타일을 비활성화합니다
-
12-12-2019 - |
문제
나는 Visual Styles의 영향을받는 MenuStrip
컨트롤을 방지하려고 노력하고 있습니다.
그래서 간단한 메뉴 스트립과 Main()
의 비활성화 된 시각적 스타일을 사용하여 간단한 양식을 만들었습니다.
// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
.
이 외관을 산출합니다 (참고 회색 테두리 및 배경) :
이제이 양식의 다른 컨트롤이 시각적 스타일의 영향을받는 방식으로 동일한 작업을 원합니다 (이 드롭을 사용하여 시각적 스타일을 비활성화하고 싶습니다).
그래서 처음에는 모든 DropDown
의 ToolStripMenuItem
의 시각적 스타일을 비활성화하려고했지만 작동하지 않았습니다. 그런 다음 전체 MenuStrip
전체에 시각적 인 스타일을 비활성화하려고 노력했지만, 해당 작업을 수행하지 않았습니다.
여기에 내 사용자 정의 메이커의 코드가 있습니다.
class MPMenuStrip : MenuStrip
{
[DllImportAttribute("uxtheme.dll")]
private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);
protected override void OnHandleCreated(EventArgs e)
{
// first attempt:
foreach (ToolStripMenuItem menuItem in this.Items)
SetWindowTheme(menuItem.DropDown.Handle, "", "");
// second attempt:
SetWindowTheme(this.Handle, "", "");
base.OnHandleCreated(e);
}
}
.
사용자 정의 MenuStrip
컨트롤 사용에도 불구하고 Application.EnableVisualStyles();
의 Main()
가 호출되면 양식의 모양이 (파란색) :
이 드롭 다운의 모양에 어떤 아이디어가있을 수있는 아이디어는 무엇입니까?
내가 누락 된 것은 무엇입니까?
감사합니다.
해결책
Menustrip은 전혀 기본 Windows 제어가 아니므로 시각적 스타일 테마의 직접적인 영향을받지 않습니다.모든 렌더링은 .NET 코드로 수행됩니다.이것을 수행하는 기본 클래스는 ToolStripRenderer 인 ToolStripProfessionalRenderer 및 ToolStripsystemRenderer의 두 가지 구현이있는 툴 스트라이퍼 렌더러입니다.후자는 운영 체제를 에뮬레이션하려고 시도하고, Menustrip의 렌더링 장치를 "시스템"으로 설정하여 얻을 수 있습니다.에뮬레이션은 Windows 7과 같은 나중에 운영 체제에서 그렇게 그렇게 그렇고 정확하게 잘못되었습니다.
실제 운영 체제를 찾아야하는 경우 MainMenu를 대신 사용하십시오.Menustrip에 비해 몇 가지 제한 사항이 있습니다.색상을 변경하려면 자신의 렌더러를 구현하고 컬러 테이블을 수정할 수 있습니다.이 답변 .