안녕하세요!
추운날씨에 고생이 많으십니다.
몇가지 궁금한 점이 있어 글을 남김니다.
1. 윈도우의 시작메뉴와 같은 메뉴를 프로그램 내부에 삽입시키는 방법
2. 폼의 사이즈를 일정크기 이하로 줄이지 못하게 할때,
폼 속성의 Constraints => MinHeight, MinWidth 를 설정해 놓으면
그 크기 이하로 줄어 들지는 않으나, 마우스로 드래그 할때,
그 크기 이하로 드래그는 되었다가, 마우스를 놓게 되면
줄어들지 않습니다.
아예 처음부터 드래그도 더 이상 줄어들지 못하게 하는 방법
이상 2가지 입니다.
많은 조언을 부탁드립니다.
좋은 하루 되세요...
> 안녕하세요!
> 추운날씨에 고생이 많으십니다.
> 몇가지 궁금한 점이 있어 글을 남김니다.
> 1. 윈도우의 시작메뉴와 같은 메뉴를 프로그램 내부에 삽입시키는 방법
> 2. 폼의 사이즈를 일정크기 이하로 줄이지 못하게 할때,
> 폼 속성의 Constraints => MinHeight, MinWidth 를 설정해 놓으면
> 그 크기 이하로 줄어 들지는 않으나, 마우스로 드래그 할때,
> 그 크기 이하로 드래그는 되었다가, 마우스를 놓게 되면
> 줄어들지 않습니다.
> 아예 처음부터 드래그도 더 이상 줄어들지 못하게 하는 방법
> 이상 2가지 입니다.
> 많은 조언을 부탁드립니다.
> 좋은 하루 되세요...
> 1. 윈도우의 시작메뉴와 같은 메뉴를 프로그램 내부에 삽입시키는 방법
구체적으로 무엇을 의미하는지 모르겠지만
팝업메뉴에 그림이 들어가게 하는 방법을 질문하시는건가요?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
newitem : TMenuItem;
i: Integer;
begin
// Popup menu의 이전 item을 clear 한다
for i := PopupMenu1.Items.Count -1 downto 0 do
PopupMenu1.Items.Delete(i);
for i := 0 to 9 do // 임의로 10개만 만들어 본것임
begin
newitem := TMenuItem.Create(PopupMenu1); // menu item 생성
newitem.Caption := IntTostr(i)+' 번째 Item'; // menu item 의 캡션
newitem.MenuIndex := i;
PopupMenu1.Items.Add(newitem); // Popup menu 에 추가
end;
// 추가된 item의 각 이미지를 그린다
for i := 0 to PopupMenu1.Items.Count - 1 do
SetMenuItemBitmaps(PopupMenu1.Handle,
i, // 이미지를 넣을 item의 위치
MF_BYPOSITION,
Image1.Picture.BitMap.Handle, // handle of unchecked bitmap
Image1.Picture.BitMap.Handle); // handle of checked bitmap
end;
procedure TForm1.Button2Click(Sender: TObject);
var
P: TPoint;
begin
// 수동으로 popup 하기
P.X := Button2.Left;
P.Y := Button2.Top;
P := Self.ClientToScreen(P); // form 기준의 좌표를 desktop 기준의 좌표로 계산
PopupMenu1.PopUp(P.X, P.Y);
end;
end.
> 2. 폼의 사이즈를 일정크기 이하로 줄이지 못하게 할때,
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
message WM_GETMINMAXINFO;
procedure WMInitMenuPopup(var Msg: TWMInitMenuPopup);
message WM_INITMENUPOPUP;
procedure WMNCHitTest(var Msg: TWMNCHitTest);
message WM_NCHitTest;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);
begin
// design time시 결정한 폼의 높이와 폭을 실행시 윈도우 TrackSize의
// 최대, 최소값과 동일하게 하여 사용자가 폼의 크기를 변경할 때마다
// 변경된 크기는 무시하고 항상 동일한 크기로 setting하게 한다
inherited;
with Msg.MinMaxInfo^ do
begin
ptMinTrackSize.x:= Self.width;
ptMaxTrackSize.x:= Self.width;
ptMinTrackSize.y:= Self.height;
ptMaxTrackSize.y:= Self.height;
end;
end;
procedure TForm1.WMInitMenuPopup(var Msg: TWMInitMenuPopup);
begin
// 폼의 시스템 메뉴의 "화면 복귀(R), 크기 변경(S)"를 사용하지 못하게 한다
inherited;
if Msg.SystemMenu then
EnableMenuItem(Msg.MenuPopup, SC_SIZE, MF_BYCOMMAND or MF_GRAYED)
end;
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
// 폼의 경게선에 가면 커서의 모양이 바뀌면서 폼의 크기를 변경할 수 있도록
// 되는데 이것도 막는다
inherited;
with Msg do
if Result in [HTLEFT, HTRIGHT, HTBOTTOM, HTBOTTOMRIGHT,
HTBOTTOMLEFT, HTTOP, HTTOPRIGHT, HTTOPLEFT]
then
Result:= HTNOWHERE
end;
end.