Q&A

  • 윈도우의 시작메뉴와 같은 메뉴는?
안녕하세요!



추운날씨에 고생이 많으십니다.



몇가지 궁금한 점이 있어 글을 남김니다.



1. 윈도우의 시작메뉴와 같은 메뉴를 프로그램 내부에 삽입시키는 방법



2. 폼의 사이즈를 일정크기 이하로 줄이지 못하게 할때,



폼 속성의 Constraints => MinHeight, MinWidth 를 설정해 놓으면



그 크기 이하로 줄어 들지는 않으나, 마우스로 드래그 할때,



그 크기 이하로 드래그는 되었다가, 마우스를 놓게 되면



줄어들지 않습니다.



아예 처음부터 드래그도 더 이상 줄어들지 못하게 하는 방법



이상 2가지 입니다.



많은 조언을 부탁드립니다.



좋은 하루 되세요...

3  COMMENTS
  • Profile
    김영대 1999.12.13 20:30
    무스탕 wrote:

    > 안녕하세요!

    > 추운날씨에 고생이 많으십니다.

    > 몇가지 궁금한 점이 있어 글을 남김니다.

    > 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.





  • Profile
    무스탕 1999.12.13 22:25
    안녕하세요! 무스탕입니다.



    이렇게 도움을 많이 주셔서 감사합니다.



    제가 얼마전에 아이디를 바꾸어서 처음 들어 보실겁니다.



    예전에는 땡삐란 아이디를 사용 했었습니다.



    제가 작년 7월쯤에 마이챗을 만들때도 도움을 많이 받았었죠...



    지금은 근무지를 옮긴 관계로 심갑수씨가 버전을 업그레이드 했더라구요.



    앞으로도 많은 도움을 부탁 드리겠습니다.



    감사합니다. 건강하세요... ^__^;

  • Profile
    무스탕 1999.12.13 22:25
    안녕하세요! 무스탕입니다.



    이렇게 도움을 많이 주셔서 감사합니다.



    제가 얼마전에 아이디를 바꾸어서 처음 들어 보실겁니다.



    예전에는 땡삐란 아이디를 사용 했었습니다.



    제가 작년 7월쯤에 마이챗을 만들때도 도움을 많이 받았었죠...



    지금은 근무지를 옮긴 관계로 심갑수씨가 버전을 업그레이드 했더라구요.



    앞으로도 많은 도움을 부탁 드리겠습니다.



    감사합니다. 건강하세요... ^__^;