폼위에 A라는 그림을 나타내고
키조합을 Shift+A로 하면 그림A가 임의의 B가되고
물론 자리변동은 없어야겠죠
또 똑깥이 Shift+A를 누르면 원래 A그림으로 되돌아오는 것을
만들려고 하는데요.
문제는 창이 활성화되었건 비활성화되었건 간에 그림이 바뀌어야
하는데 방법이 없을까요?
제가 좀 무식해서 소스만 보고는 이해를 못하거든요.
소스와 아주 자세한 설명을 부탁드립니다.
비활성화 되면 안될거라고 하시는 말씀이 있던데...
아무튼 답변 부탁드립니다.
???
비활성화 되었건간에 상관없이 작동합니다.
다음은 예제 프로그램입니다. 이미지는 아래와 같이 직접 비트맵객체를 직접 생성
하여 사용하시거나 TImageList를 이용하세요. 동적으로 비트맵객체를 생성하는것
보단 TImageList를 사용하시는 것을 추천하고 싶습니다. 그럼 더 코드가 간결해
지니까요... 여기선 그냥 직접 생성하겠습니다.
별루 길지도 않으니까 충분히 이해하리라 믿습니다.
unit SetHotKey;
interface
uses
Windows, Messages, Classes, Controls, Dialogs, Graphics, Forms, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(sender: Tobject);
procedure FormDestroy(sender: Tobject);
private
// ATOM은 Windows유닛에 선언된 타입으로 16비트 부호없는 정수(Word)형입니다.
FHotKeyA, FHotKeyB: ATOM; // 핫키에대한 인덱스를 저장하는 변수입니다.
FImageA, FImageB: TBitmap; // 보여줄 비트맵객체.
protected
// 핫키를 처리하는 메세지 핸들러.
procedure WMHotKey(var msg: TWMHotKey); message WM_HotKey;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
// 핫키가 눌려지면 이 메세지 핸들러가 실행됩니다.
// TWMHotKey는 Messages유닛에 저장되어 있습니다.
// TWMHotKey.HotKey값에 눌려진 핫키의 인덱스가 들어있습니다.
begin
if Msg.HotKey = FHotKeyA then // 핫키가 Shift-A 이면
Image1.Picture.Assign(FImageA) // 이미지객체에 그림 A를 저장합니다.
else if Msg.HotKey = FHotKeyB then // 핫키가 Shift-B 이면
Image1.Picture.Assign(FImageB); // 이미지객체에 그림 B를 저장합니다.
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
// GlobalAddAtom은 문자열에 대한 전역적인 인덱스(Atom)를 추가하는 함수입니다.
// 전역적인 Atom 테이블은 윈도우즈가 관리합니다.
FHotKeyA := GlobalAddAtom('MyHotKey_A');
// RegisterHotKey는 윈도전체에 대한 핫키를 등록하는 API함수입니다.
// 첫번째 파라매터는 이 ㅎ핫키를 받을 윈도우 핸들을 넣어줍니다. 여기에선
// TForm1의 핸들이 되겠죠...
// 두번째 파라매터는 위에서 구한 ATOM값을 써주시교,
// Alt, Ctrl, Shift키와 함께 쓰려면 세번째 파라매터에다 MOD_ALT, MOD_CONTROL,
// MOD_SHIFT를 써주시고 그렇지 않으면 0을 넣어주시면 됩니다.
// 네번째 파라매터는 핫키의 가상키값입니다. 가상키값은 Windows유닛에 보시면
// 많은 키값들이 정의되어있습니다. '0' ~ '9', 'A' ~ 'Z'를 키값으로 쓰려면
// 그냥 그 키에 대한 아스키값을 넣어주시면 됩니다.
if RegisterHotKey(Handle, FHotKeyA, MOD_SHIFT, Integer('A')) = False then
// 핫키등록이 실패하면 에러 메세지를 출력합니다.
ShowMessage('HotKey Registration Failed');
FHotKeyB := GlobalAddAtom('MyHotKey_B');
if RegisterHotKey(Handle, FHotKeyB, MOD_SHIFT, Integer('B')) = False then
ShowMessage('HotKey Registration Failed');
// 그림 A와 B의 두개의 비트맵객체를 생성합니다.
FImageA := TBitmap.Create;
// 나타내고자하는 그림의 화일명을 써주세요...
FImageA.LoadFromFile('C:Delphi5Projects그림A.BMP');
FImageB := TBitmap.Create;
FImageB.LoadFromFile('C:Delphi5Projects그림B.BMP');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
// 그림 A와 B의 두개의 비트맵객체를 제거합니다.
FImageA.Free;
FImageB.Free;
// 등록된 핫키를 제거합니다.
UnRegisterHotKey(Handle, GlobalDeleteAtom(FHotKeyA));
UnRegisterHotKey(Handle, GlobalDeleteAtom(FHotKeyB));
end;
end.
mad wrote:
> 폼위에 A라는 그림을 나타내고
> 키조합을 Shift+A로 하면 그림A가 임의의 B가되고
> 물론 자리변동은 없어야겠죠
> 또 똑깥이 Shift+A를 누르면 원래 A그림으로 되돌아오는 것을
> 만들려고 하는데요.
> 문제는 창이 활성화되었건 비활성화되었건 간에 그림이 바뀌어야
> 하는데 방법이 없을까요?
> 제가 좀 무식해서 소스만 보고는 이해를 못하거든요.
> 소스와 아주 자세한 설명을 부탁드립니다.
> 비활성화 되면 안될거라고 하시는 말씀이 있던데...
> 아무튼 답변 부탁드립니다.
> ???