문제

최선을 다했지만 여기서 무슨 일이 일어났는지 알 수 없습니다.Delphi 4에서는 잘 작동했습니다.Delphi 2009로 업그레이드한 후 이것이 작동하는 방식인지, 아니면 문제가 있는지는 알 수 없습니다.

다음은 Delphi 2009의 디자인 모드에서 내 프로그램 메뉴의 모습입니다.

enter image description here

주 메뉴와 파일 하위 메뉴의 모든 단어에는 한 글자에 밑줄이 그어져 있습니다.이렇다고 합니다.이 밑줄 친 문자는 단축키라고 하며 Windows 응용 프로그램의 표준이므로 Alt 키와 해당 문자를 사용하여 마우스가 아닌 키보드로 메뉴 항목과 하위 메뉴 항목을 빠르게 선택할 수 있습니다.

항목 캡션의 일부로 "&" 문자를 사용하면 이러한 방법으로 얻을 수 있습니다. 예를 들면 다음과 같습니다.다른 이름으로 저장...

응용 프로그램을 실행하고 마우스를 사용하여 파일 메뉴를 열면 다음과 같습니다.

enter image description here

기본 메뉴에서는 문자에 밑줄이 표시되지만 파일 메뉴에서는 밑줄이 표시되지 않습니다.

대신 Alt-F 키를 사용하여 파일 하위 메뉴를 열면 다음과 같이 올바르게 표시됩니다.

enter image description here

모든 Accelerator Key 문자에는 적절한 밑줄이 그어져 있습니다.

AutoHotKeys 옵션을 사용해 보았지만 문제는 아닙니다.

누군가 전에 이 문제를 겪은 적이 있나요?두 번째 이미지의 예는 제가 모르는 올바른 동작인가요?아니면 제가 놓쳤을 수도 있는 옵션이나 코딩 실수가 있나요?


2009년 11월(1년 후):mghie는 이 문제의 근원을 파악하고 문제를 파악한 것 같습니다.아래에서 그의 답변을 참조하십시오.

도움이 되었습니까?

해결책

ALT 키가 고정되지 않는 한 일반적으로 해당 가속기를 숨기는 표준 Windows 설정 (디스플레이 속성 아래)이 있습니다. 그것은 Alt+F10으로 메뉴를 열는 것이 왜 당신을 보여주는지를 설명합니다. 아마 그게 원인일까요?

편집] : 아니요. 방금 시도했지만 메뉴 항목이있는 간단한 tform에 가속기가 표시되지만 Timagelist를 추가하고 단일 메뉴 항목의 ImageIndex를 설정하거나 간단히 소유자를 true로 설정하면 가속기 밑줄이 사라집니다. 나는 그것이 실제로 VCL의 버그라고 생각합니다.

BTW, 이것은 Windows XP에 있습니다.

해결 방법 :

Windows XP 64에서 Delphi 2009를 사용하여 이것을 디버깅했으며, 누락 된 가속기의 근본 원인은 Windows가 보내는 것 같습니다. WM_DRAWITEM 메시지와 메시지 ODS_NOACCEL 플래그 세트. 시스템이 항상 가속기를 표시하도록 설정되어 있지 않아야합니다. 따라서 VCL 버그가 아니라 VCL이 작동하지 않는 Windows 문제라고 말할 수 있습니다.

그러나 자신의 코드로 작업을 수행 할 수 있습니다. 메시지를 VCL에 전달하기 전에 플래그를 재설정하면됩니다. Window Proc

protected
  procedure WndProc(var Message: TMessage); override;

그렇게 :

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

이것은 데모 코드 전용입니다. SystemParametersInfo() 때마다 a WM_DRAWITEM 메시지가 수신되지만 프로그램이 시작되면 프로그램이 시작될 때마다 WM_SETTINGCHANGE 메시지.

다른 팁

Windows 2000과 함께 소개 된 "기능"입니다.

오래된 새로운 것 : Windows가 키보드 가속기를 숨기고 기본적으로 사각형에 초점을 맞추는 이유는 무엇입니까?

Delphi 4 가이 Windows 기능을 지원하지 않은 것으로 보입니다.

2000 및 XP 메뉴를 표시하려면 가속기 키를 표시하고 데스크탑에서 빈 지점을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하고 모양 탭을 클릭하고 효과 아래에 효과를 선택하십시오. ALT 키를 누를 때까지 키보드 탐색을위한 밑줄이 그어진 문자 숨기기. 확인을 두 번 클릭하십시오.

Vista에서 어떻게 해야할지 잘 모르겠습니다.

Vista에서 메모장과 동일한 동작을 가지고 있기 때문에 그것이 델파이 생성 버그라고 생각하지 않습니다. 또한 델파이 자체에서 btw ...
나는 당신의 질문 전에주의를 기울이지 않았다고 고백해야합니다. 지적 해 주셔서 감사합니다.

Jim McKeeth가 위에서 (정확하게) 언급했듯이 이는 "설계상" 동작입니다.키보드 동작을 통해 메뉴가 실행되면 단축키가 표시되어야 하지만, 마우스로 실행되면 단축키는 의도적으로 표시되지 않습니다.

항상 액셀러레이터를 표시하도록 XP를 구성했지만 해당 옵션을 변경한 빠른 테스트를 통해 메뉴에도 밑줄이 표시되지 않아야 함을 확인했습니다(Visual Studio는 예상대로 응답했으며 마우스를 사용할 때 밑줄이 표시되지 않았습니다).그러나 Microsoft Office에서는 이 설정을 무시하고 항상 밑줄을 표시합니다.따라서 Delphi에서 메뉴가 그려지는 방식에 버그가 있는 것 같습니다(저는 Delphi에 대한 경험이 없습니다).

Vista에 대한 옵션도 찾았습니다. http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

새로운 액세스 센터에서이를 켤 수 있습니다 (제어판으로 이동하여 액세스 용이성을 클릭 한 다음 액세스 센터의 용이성을 클릭하십시오).액세스 센터의 용이성에서 키보드를보다 쉽게 ​​사용할 수 있도록 클릭하고 바닥에서 밑줄 키보드 단축키 및 액세스 키 확인란을 선택하십시오.

추가 조사를 하는 동안 Delphi 포럼에서 다음과 같은 관련 버그를 발견했습니다. http://qc.codegear.com/wc/qcmain.aspx?d=37403

귀하의 경우 하위 창(그려진 메뉴)이 상위 창에서 WM_UIUPDATESTATE 메시지를 가져오지 않거나 처리하지 않는 것 같습니다. 이로 인해 액셀러레이터를 사용하여 다시 그리기가 발생합니다.

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