어플리케이션에서 Ctrl+/ 또는 Alt+/ 단축키가 동작하지 않을 때

No Comments

델파이로 만든 어플리케이션에서는 메뉴나 액션의 단축키로 Ctrl + / 또는 Alt + / 키를 설정해도 동작하지 않는다.

/ 키를 VCL에서 인식할 수 없기 때문에 발생하는 문제인데 이를 해결하려면 메뉴나 액션이 포함되어 있는 폼의  IsShortCut 메소드를 오버라이드 해서 다음과 같이 별도 처리를 해주면 된다.

function TXXXForm.IsShortCut(var Message: TWMKey): Boolean;
const VK_SLASH = 191;
var SS : TShiftState; begin Result := inherited IsShortCut(Message);

// 기존 방법으로 단축키를 찾지 못했을 경우 if not Result then begin SS := KeyDataToShiftState(Message.KeyData);
// Ctrl+/ 나 Alt+/ 이면 if ((ssCtrl in SS) or (ssAlt in SS)) and
(Message.CharCode = VK_SLASH) then begin // CharCode를 변경한다. Message.CharCode := TextToShortcut('/');

// 변경된 메시지를 가지고 ActionList를 다시 한번 훑어본다. Result := inherited IsShortcut(Message);
end;
end;
end;

델파이로 만든 어플리케이션은 Vista에서 ALT 키 누를 때 화면이 깨진다

No Comments

문제

Delphi 2007 이전의 VCL로 만들어진 어플리케이션의 경우 Windows Vista에서 ALT 키를 누르면 버튼이나 체크박스 등의 기본 콘트롤들이 깨지는 현상이 발생한다. 

ALT 키 누르기 전 상태

ALT 키 누르기 전 상태


ALT 키 누른 후

ALT 키 누른 후

원인

 이 현상은 윈도 테마가 적용된 어플리케이션에서만 발생하며 ALT 키를 누르면 WM_UPDATEUISTATE 메시지가 각 콘트롤에게 전달되고 이 때 단축키가 표시되는데 VCL에서는 이 메시지를 처리하지 않는다.

해결

아래 링크에 나와 있는 방법을 사용하면 된다.
ALT Key press causes controls to disappear under Themes in Vista and XP

Delphi 7 이전 버전의 경우에는 한가지 다른 방법이 있다.
AcroEdit는 Delphi 6 버전으로 개발되고 있는데 Delphi 6 에서는 XP Theme를 기본적으로 지원하지 않는다. 그래서 대부분의 경우 Delphi 7부터 기본으로 포함된 Mike Lischke의 Theme Manager를 사용한다.

 Theme Manager는 어플리케이션이 실행될 때 모든 폼과 콘트롤의 윈도 프로시저를 후킹해서 테마 지원 코드를 삽입하도록 되어 있다. 따라서 대부분의 VCL 기본 콘트롤에 대해 별도의 윈도 프로시저가 소스 코드 상에 존재한다. ThemeMgr.pas 파일을 수정해서 각 콘트롤의 윈도 프로시저(ButtonControlWindowProc, GroupBoxWindowProc 등)에

WM_UPDATEUISTATE: Control.Invalidate;

를 삽입해 주면 상기 문제가 해결된다.