お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"MDI親の中央にロゴマークを置く"






【タイトル】MDI親フォームの中央にロゴマーク(ビットマップ)を置く
           (になっているはずです)

1:[ファイル(F)]、[新規作成(N)] で新規作成ダイアログを表示、
    [プロジェクト]タブを選択、[MDIアプリケーション]で雛形を作ります。

2:MainForm に TImage を1個置き(Image1)、適当なビットマップを入れ
    ます。

3:以下のコードを TMainForm に追加します。

type
  TMainForm = class(TForm)
// ...(省略)...
  private
    FDefClientProc: TFarProc;
    FClientInstance: TFarProc;
    procedure ClientWndProc(var Message: TMessage);
    procedure PutBitmap(DC: HDC);
  protected
    procedure CreateWnd; override;

// ここまで interface、ここから implementation

procedure TMainForm.ClientWndProc(var Message: TMessage);

  procedure Default;
  begin
    with Message do
      Result := CallWindowProc(FDefClientProc, ClientHandle, Msg, wParam, 
lParam);
  end;

begin
  with Message do
    case Msg of
      WM_HSCROLL, WM_VSCROLL:
        begin
          Default;
          InvalidateRect(ClientHandle, nil, FALSE);
        end;
      WM_ERASEBKGND:
        begin
          PutBitmap(TWMEraseBkGnd(Message).DC);
          Result := 1;
        end;
    else
      Default;
    end;
end;

procedure TMainForm.PutBitmap(DC: HDC);
var
  R: TRect;
  w, h: Integer;
begin
  Windows.GetClientRect(ClientHandle, R);
  FillRect(DC, R, Brush.Handle);
  w := Image1.Picture.Bitmap.Width;
  h := Image1.Picture.Bitmap.Height;
  BitBlt(DC, (R.Right - w)div 2, (R.Bottom - h)div 2, w, h, 
         Image1.Picture.Bitmap.Canvas.Handle, 0,0, SRCCOPY);
end;

procedure TMainForm.CreateWnd;
begin
  inherited CreateWnd;
  FClientInstance := MakeObjectInstance(ClientWndProc);
  FDefClientProc := Pointer(GetWindowLong(ClientHandle, GWL_WNDPROC));
  SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FClientInstance));
end;


 MDI子フォームの移動によって、親フォームのスクロールバーの表示状態が
変わるとき(表示されるまたは消える場合に)、ちょっと位置がずれることが
あります。
 それ以外は大丈夫...だとは思いますが、やばそうな部分や改良点があった
ら指摘してもらえると嬉しいです。

Original document by 河邦 正         氏 ID:(GCC02240)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum