Delphi 로 메뉴를 아름답게 만드세요
Windows의 많은 프로그램에는 Windows "시작" 메뉴 왼쪽에 위에서 아래로 긴 Windows 배너가 있거나 Word처럼 각 메뉴 표시줄 왼쪽에 작은 아이콘이 있는 등 매우 아름다운 메뉴가 있습니다. 멋진 메뉴들, 나만의 메뉴가 지루해 보인다고 느끼시나요? 타사 컨트롤이 필요하지 않으며 Delphi를 사용하여 위 기능을 구현할 수 있습니다.
사용자 정의 메뉴를 구현하려면 메뉴에 그려진 그래픽에 맞게 메뉴를 그릴 때 메뉴의 크기를 변경한 다음 필요한 메뉴 효과를 그려야 합니다. Delphi에서 각 메뉴 항목은 TmenuItem 컨트롤에 해당합니다. 이 유형의 컨트롤에는 OnDrawItem 및 OnMeasureItem이라는 두 가지 이벤트가 있습니다.
OnMeasureItem 이벤트는 다음과 같이 정의됩니다.
type TMenuMeasureItemEvent = PRocedure(보내는 사람: TObject; ACanvas: TCanvas;
var Width, Height: Integer) 객체;
속성 OnMeasureItem: TMenuMeasureItemEvent;
이 이벤트는 메뉴 표시줄이 자체 크기를 모니터링할 때 생성됩니다. Acanvas 매개변수는 그려질 그리기 객체를 정의하고, Width 및 Height 매개변수는 이 두 정의 앞에 있는 var를 보셨나요? OnMeasureItem 이벤트를 사용할 수 있다는 의미입니다. 처리 기능에서 이 두 값을 변경하면 메뉴의 크기가 변경됩니다.
OnDrawItem 이벤트는 다음과 같이 정의됩니다.
TMenuDrawItemEvent = 프로시저 유형(보내는 사람: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울) 개체;
속성 OnDrawItem: TMenuDrawItemEvent;
이 이벤트는 메뉴가 그려질 때 발생합니다. Acanvas 매개변수는 메뉴 그리기 개체를 정의하고, Aret 매개변수는 메뉴의 그리기 영역을 지정하며, Selected 매개변수는 현재 메뉴 항목의 선택 여부를 정의합니다.
위의 소개에서 볼 수 있듯이 사용자 정의 메뉴를 구현하려면 OnMeasureItem 이벤트에 코드를 작성하여 메뉴 항목의 크기를 변경한 다음 OnDrawItem 이벤트에 필요한 효과를 그리면 됩니다.
아래에서는 설명하기 위한 구체적인 예를 제시합니다. 이 예는 Windows 시작 메뉴와 같은 배너 표시줄 기능을 사용자 정의 메뉴에 표시하는 것입니다. 동시에 이 프로그램은 선택한 메뉴 표시줄을 그라데이션 색상으로 채울 수도 있습니다(3721 중국어 웹사이트 소프트웨어의 작업 표시줄 메뉴와 같습니다). 프로그램의 아이디어는 다음과 같습니다. 먼저 긴 비트맵을 만든 다음 메뉴에 표시할 텍스트와 이미지 및 필요에 따라 각 메뉴 표시줄의 OnMeasureItem 이벤트에서 메뉴 항목의 너비와 높이를 변경합니다. 프로그램의 해당 비트맵 부분을 OnDrawItem 이벤트의 메뉴 항목에 복사합니다. 메뉴바가 선택되면 먼저 Acanvas 매개변수의 브러시 색상을 변경한 후 메뉴바의 해당 부분을 차례로 채워줌으로써 선택한 메뉴바의 그라데이션 색상 채우기를 구현합니다. 마지막으로 텍스트가 메뉴 표시줄에 출력됩니다.
구체적인 절차를 소개하겠습니다. 먼저 이미지 소프트웨어를 사용하여 긴 비트맵 파일을 만듭니다(필요에 따라 이미지의 가로 세로 비율을 설정할 수 있습니다. 제 이미지에서는 10:1입니다). Delphi에서 새 프로젝트를 생성하고 TImage 컨트롤을 Form1에 추가한 다음 컨트롤의 AutoSize 속성을 True로 설정합니다. 그런 다음 TMainMenu 컨트롤을 Form1에 추가하고 OwnerDraw 속성을 True로 설정한 다음(매우 중요합니다. 그렇지 않으면 프로그램을 구현할 수 없습니다) TMainMenu 아래에 6개의 TMenuItem 개체를 추가합니다(TMainMenu 컨트롤을 마우스 오른쪽 버튼으로 클릭한 다음 팝-메뉴를 클릭합니다). 위 메뉴 메뉴 디자이너 항목의 경우 디자인 창에 메뉴 모음을 추가할 수 있습니다.) Name 속성을 각각 Caption1, Caption2, ..., Caption6으로 설정합니다.
다음은 특정 프로그램 목록입니다.
유닛 OwnerMenu;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤, 양식, 대화 상자,
메뉴, ExtCtrls, StdCtrls, ImgList;
유형
TForm1 = 클래스(TForm)
메인메뉴1: TMainMenu;
Main1: TMenuItem;
Caption1: TMenuItem;
Caption2: TMenuItem;
캡션3: TMenuItem;
Caption4: TMenuItem;
Caption5: TMenuItem;
Caption6: TMenuItem;
이미지1: T이미지;
절차 Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
절차 Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
절차 Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
절차 Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
절차 Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
절차 Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
절차 Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
사적인
{비공개 선언}
공공의
절차 DrawItem(보내는 사람: TMenuItem; ACanvas: TCanvas;ARect: TRect;
선택됨: 부울;strOUt:String);
{공개 선언}
끝;
var
Form1: TForm1;
i,iH,Ind,iW,iRate:Integer;
r온도:TRect;
iG1,iG2:정수;
구현
{$R *.DFM}
절차 TForm1.DrawItem(Sender: TMenuItem; ACanvas: TCanvas;ARect: TRect;
선택됨: 부울;strOut:String);
var
j:정수;
시작하다
i:=ARect.Bottom -ARect.Top; //텍스처의 높이와 너비를 가져옵니다.
Ind:=Sender.MenuIndex;
iH:=Round(Image1.Height/6*Ind); //텍스처 위치를 가져옵니다.
//이미지의 해당 위치에 있는 비트맵을 메뉴에 복사합니다.
StretchBlt(ACanvas.Handle,ARect.Left,ARect.Top,iW,i,Image1.Canvas.Handle,0,iH,
Image1.Width,Round(Image1.Height/6),SRCCOPY);
if Selected then start //메뉴 항목이 선택되었습니다.
ACanvas.Font.Color := clWhite;
r온도:=ARect;
rTemp.Left := rTemp.left+iW;
iG1:=Round((rTemp.Right - rTemp.Left)/10);
rTemp.Right := rTemp.Left +iG1;
for j:= 0 to 9 do start //루프를 통해 색상 그라데이션 효과 설정
ACanvas.Brush.Color := RGB(0,0,j*25);
ACanvas.FillRect(rTemp);
rTemp.Left := rTemp.Left +iG1;
rTemp.Right := rTemp.Left +iG1;
끝;
끝
else start //이 메뉴 항목이 선택되지 않았습니다.
ACanvas.Brush.Color := cl3DLight //배경색을 밝은 회색으로 설정합니다.
r온도:=ARect;
rTemp.Left := rTemp.left+iW;
ACanvas.FillRect(rTemp);
ACanvas.Font.Color := clBlack;
끝;
//캔버스 브러시 채우기 모드를 투명으로 설정합니다.
ACanvas.Brush.Style:=bsClear;
//메뉴에 텍스트 출력
ACanvas.TextOut(ARect.Left+iW+5,ARect.Top,strOut);
끝;
절차 TForm1.Caption1MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
//OnMeasureItem 이벤트에서 메뉴의 너비와 높이를 변경합니다. 다음 5개의 프로그램은 동일합니다.
//텍스트에 맞게 메뉴의 너비와 높이를 변경합니다.
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
Width:=Width+iW; //추가 텍스트를 수용할 수 있도록 계산에 따라 메뉴 너비를 변경합니다.
끝;
절차 TForm1.Caption2MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
너비:=너비+iW;
끝;
절차 TForm1.Caption3MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
너비:=너비+iW;
끝;
절차 TForm1.Caption4MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
너비:=너비+iW;
끝;
절차 TForm1.Caption5MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
너비:=너비+iW;
끝;
절차 TForm1.Caption6MeasureItem(Sender: TObject; ACanvas: TCanvas;
var 너비, 높이: 정수);
시작하다
높이:=ACanvas.TextHeight('Caption1')+5;
너비:=ACanvas.TextWidth('Caption1')+5;
iRate:=Round(Image1.Height/(높이*6));
iW:=Round(Image1.Width /iRate);
너비:=너비+iW;
끝;
절차 TForm1.Caption1DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption1');
끝;
절차 TForm1.Caption2DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption2');
끝;
절차 TForm1.Caption3DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption3');
끝;
절차 TForm1.Caption4DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption4');
끝;
절차 TForm1.Caption5DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption5');
끝;
절차 TForm1.Caption6DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; 선택됨: 부울);
시작하다
DrawItem(TMenuItem(Sender),ACanvas,ARect,Selected,'Caption6');
끝;
끝.