Q&A

  • 메인폼에서...우측에이름을표시하려면????
항상많은도움을 받고 있습니다.

메인폼에서(폼화면에서 form1이라고표시되는부분)좌측윗부분에 form1이라고

표시됩니다만 반대로 우측끝으로 로그인한사람의이름을 표시하고 싶은데...

어떻게 해야할런지요???

아시는분 부탁드립니다.

그럼 ...

1  COMMENTS
  • Profile
    최용일 2000.03.17 05:14
    안녕하세요. 최용일입니다.



    타이틀바와 같은 비-클라이언트영역에 버튼을 그린다거나 하는 행동은

    WM_NCPAINT라는 비-클라이언트영역을 그리는 메세지를 받을 때 그려주시면

    됩니다. 아래는 예제입니다.



    unit Unit1;



    interface



    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    Buttons, StdCtrls;

    type

    TForm1 = class(TForm)

    procedure FormCreate(Sender: TObject);

    procedure FormResize(Sender: TObject);

    private

    FCustomCaption: string;

    protected

    procedure DrawCustomCaption;

    procedure SetCustomCaption(ACaption: string);

    procedure WMNCPaint(var Message: TWMNCPaint); message WM_NCPAINT;

    procedure WMNCActivate(var Message: TWMNCActivate); message WM_NCACTIVATE;

    published

    // 사용자 캡션을 저장하는 프로퍼티입니다.

    property CustomCaption: string read FCustomCaption write SetCustomCaption;

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}





    { TForm1 }



    procedure TForm1.DrawCustomCaption;

    // 사용자의 캡션을 그리는 함수입니다.

    var

    FrameX, FrameY, SizeX, SizeY, TextLength: Integer;

    pRect: TRect;

    R: TRect;

    begin

    if FCustomCaption = '' then // 사용자캡션이 ''이면 아무일도 하지않습니다.

    Exit;



    // 타이틀바의 프레임의 크기와 좌표를 얻습니다.

    FrameX := GetSystemMetrics(SM_CXFRAME);

    FrameY := GetSystemMetrics(SM_CYFRAME);

    SizeX := GetSystemMetrics(SM_CXSIZE);

    SizeY := GetSystemMetrics(SM_CYSIZE);



    // Device Context핸들을 얻습니다.

    Canvas.Handle := GetWindowDC(Handle);

    // 폰트, 칼라를 설정.

    Canvas.Font.Name := '굴림체';

    Canvas.Font.Size := 9;

    Canvas.Brush.color := clBtnFace;

    // 사용자 캡션의 길이를 얻습니다.

    TextLength := Canvas.TextWidth(FCustomCaption);

    // 사용자 캡션을 그릴 좌표를 얻습니다.

    pRect := Bounds(Width - FrameX - 4*SizeX + 12 - TextLength, FrameY + 2,

    TextLength+6, SizeY - 4);



    try

    // 버튼모양을 그립니다. DrawButtonFace는 Buttons유닛에 선언되어있습니다.

    DrawButtonFace(Canvas, pRect, 1, bsAutoDetect, False, False, False);

    // 캡션이 그려질 좌표를 구합니다.

    R := Bounds(Width - FrameX - 4*SizeX + 12 - TextLength, FrameY + 3,

    TextLength + 4, SizeY - 7);

    with pRect do

    // 사용자 캡션을 그립니다.

    Canvas.TextRect(R, R.Left + 2, R.Top , FCustomCaption);

    finally

    // DC를 풀어줍니다. DC를 얻어서 사용한 후에는 반드시 풀어주어야 합니다.

    ReleaseDC(Handle, Canvas.Handle);

    Canvas.Handle := 0;

    end;

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    // 넣고 싶은 캡션을 설정합니다.

    FCustomCaption := '';

    end;



    procedure TForm1.FormResize(Sender: TObject);

    begin

    // 폼의 크기가 재조정됐을때 비클라이언트 영역을 다시 그립니다.

    // Perform대신에 SendMessage를 사용하면 제대로 그려지지 않습니다.

    Perform(WM_NCACTIVATE, Word(Active), 0);

    end;



    procedure TForm1.WMNCActivate(var Message: TWMNCActivate);

    // 이 메세지를 처리하지 않으면 폼이 비활성화되었을 때 사용자 캡션이

    // 그려지지 않습니다.

    begin

    inherited;

    DrawCustomCaption;

    end;



    procedure TForm1.WMNCPaint(var Message: TWMNCPaint);

    // 폼의 비활성화 영역을 그리라고 명령하는 메세지 함수입니다.

    // 먼저 상속된 WMNCPaint를 통해서 폼의 캡션을 그린후

    // 사용자 캡션을 그립니다.

    begin

    inherited;

    DrawCustomCaption;

    end;



    procedure TForm1.SetCustomCaption(ACaption: string);

    // 사용자 캡션을 설정합니다.

    begin

    if FCustomCaption <> ACaption then

    begin

    FCustomCaption := ACaption;

    DrawCustomCaption;

    end;

    end;



    end.

    김명덕 wrote:

    > 항상많은도움을 받고 있습니다.

    > 메인폼에서(폼화면에서 form1이라고표시되는부분)좌측윗부분에 form1이라고

    > 표시됩니다만 반대로 우측끝으로 로그인한사람의이름을 표시하고 싶은데...

    > 어떻게 해야할런지요???

    > 아시는분 부탁드립니다.

    > 그럼 ...