フリーソフト

フォーム・ダイアログ関連

[BCB] タイトルバーがないフォームを移動する

//Header file
class TForm1 : public TForm
{
__published: // IDE 管理のコンポーネント
private: // ユーザー宣言
  void __fastcall WMNCHitTest(TWMNCHitTest &Msg);

BEGIN_MESSAGE_MAP
  VCL_MESSAGE_HANDLER(WM_NCHITTEST, TWMNCHitTest, WMNCHitTest)
END_MESSAGE_MAP(TComponent)
public:  // ユーザー宣言
  __fastcall TForm1(TComponent* Owner);
};


//cpp file
void __fastcall TForm1::WMNCHitTest(TWMNCHitTest &Msg)
{
  DefaultHandler(&Msg);

  if (Msg.Result==HTCLIENT) {  // クライアント領域がクリックされら
    Msg.Result = HTCAPTION;    //タイトルバーがクリックされたと Windows に思わせる
  }
}

[Delphi] 「デスクトップの表示」や「Windows+D」でも最小化されないウインドウの作り方

「デスクトップの表示」や「Windows+D」でも最小化されないウインドウの作り方

constructor TForm1.Create(AOwner: TComponent);
var
  ProgmanHwnd: THandle;
begin
  inherited;
  ProgmanHwnd:=FindWindow('Progman','Program Manager');
  if ProgmanHwnd<>0 then
  begin
    ParentWindow:= ProgmanHwnd;
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
    //前面に表示する
    SetZOrder( True);
end;

[BCB] ウインドウを列挙する

//-----------------------------------------------------
void __fastcall ListupWindows(void)
{
  //ウインドウの列挙
   EnumWindows((WNDENUMPROC)EnumWindowsProc , NULL);
}

//------------------------------------------------------
BOOL CALLBACK EnumWindowsProc(HWND hwnd , LPARAM lp)
{
  if ((GetWindow(hwnd,GW_OWNER)==NULL) && (IsWindowVisible(hwnd))) {
    char buf[1024];
    ZeroMemory(buf,1024);
    GetWindowModuleFileName(hwnd,buf,1024);
    /*
    GetWindowText(hwnd , buf , 1024);
    GetClassName(hwnd , buf , 1024);
    DWORD processID=0;
    GetWindowThreadProcessId(hwnd, &processID);
    */
   
    Form1->ListBox1->Items->Add(Str);
  } 
  return TRUE;
}

[BCB] CheckBox付きのMessageDialog

TModalResult CheckMessageDialog(AnsiString Message, AnsiString Caption,
  AnsiString CheckBoxCaption, bool &Checked,
  TMsgDlgType DlgType, TMsgDlgButtons Buttons)
{
   TForm *Dialog=CreateMessageDialog(Message, DlgType, Buttons);
   if (!Caption.IsEmpty()) Dialog->Caption = Caption;

   int LeftEdge=Dialog->ClientWidth;
   int TopEdge =Dialog->ClientHeight;
   if (Dialog->ControlCount>0) {
     for (int i = 1; i < Dialog->ControlCount; i++) {
       TControl *Ctrl=Dialog->Controls[i];
       if (Ctrl->Left < LeftEdge) LeftEdge=Ctrl->Left;
       if (Ctrl->Top  < TopEdge)  TopEdge =Ctrl->Top;
     }
   } else {
     LeftEdge=20;
     TopEdge=20;
   }

   TCheckBox * CheckBox = new TCheckBox(Dialog);
   CheckBox->Parent  = Dialog;
   CheckBox->Caption = CheckBoxCaption;
   CheckBox->Checked = Checked;
   CheckBox->Left    = LeftEdge;
   CheckBox->Top     = Dialog->ClientHeight;
   CheckBox->Width   = Dialog->Canvas->TextWidth(CheckBox->Caption)+30;

   Dialog->ClientHeight = Dialog->ClientHeight + CheckBox->Height + TopEdge;

   if (CheckBox->Width + LeftEdge*2 > Dialog->ClientWidth)
     Dialog->ClientWidth = CheckBox->Width + LeftEdge*2;

   TModalResult Result = Dialog->ShowModal();
   Checked = CheckBox->Checked;

   delete Dialog;
   Dialog=NULL;
   
   return Result;
}

使い方
  bool Checked=false;
   CheckMessageDialog("本当に削除してもよろしいですか ?\r\nC:\\tmp\\*.*",
      "確認","今後は確認しない", Checked,
      mtConfirmation, (TMsgDlgButtons() << mbYes << mbNo << mbHelp));

[BCB] Formを半透明にする

Windows 2000以降でFormを半透明にする方法です。SetLayeredWindowAttributes関数の3番目の引数で透明度を指定します。0が完全に透明で255が不透明です。

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  SetWindowLong(Handle, GWL_EXSTYLE,GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
  SetLayeredWindowAttributes(Handle,0,200,LWA_ALPHA);
}

同じ関数を使って、ある色だけを透明にしたりもできます。以下の例は、Formの白色の部分を完全に透明にした上で、Formを半透明にしています。

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  SetWindowLong(Handle, GWL_EXSTYLE,GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED);
  SetLayeredWindowAttributes(Handle,clWhite,200,LWA_COLORKEY | LWA_ALPHA);

[BCB] 書式付エラーダイアログ表示関数

printfのような書式付きのエラーダイアログ表示関数です。
使い方は

ShowError("Cannot open file %s",filename);

のような感じです。

#include <stdarg.h>

void __cdecl TForm1::ShowError(const char *format, ...)
{
  va_list args;

  va_start(args,format);

  AnsiString Buf="";
  Buf.vprintf(format,args);
  va_end(args);

  Application->MessageBoxA(Buf.c_str(),"ERROR",MB_OK | MB_ICONERROR);
}

[BCB] フォームが最大化(最小化)されているか調べる

フォームの状態を調べるにはWindowStateプロパティを使用します。

{
 switch (Form1->WindowState) {
 case wsMaximized:
  //最大化されている
  break;
 case wsMinimized:
  //最小化されている
  break;
 case wsNormal:
  //どちらでもない
  break;
 }
}

[BCB] ダイアログを動的に作成する

ダイアログを動的に作成する方法です。以下はTSaveDialogの例です。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TSaveDialog *Dlg;

 Dlg=new TSaveDialog(this);
 //フィルタを設定
 Dlg->Filter="テキストファイル(*.txt)|*.txt|HTMLファイル(*.htm)|*.htm|すべてのファイル|*.*";
 //オプションを設定
 Dlg->Options=Dlg->Options<<ofOverwritePrompt<<ofPathMustExist;
 Dlg->FileName="list.txt";

 if (Dlg->Execute()) {
  //処理をする
 }
 
 delete Dlg;
}

[BCB] ダイアログのオプションを設定する

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TOpenDialog *Dlg=new TOpenDialog(this);

 //オプションを設定
 Dlg->Options.Clear();
 Dlg->Options<<ofFileMustExist<<ofPathMustExist;

 if (Dlg->Execute()) {
  //なにかの処理
 }
 delete Dlg;
}

[BCB] MDIで子画面を閉じる方法

通常は子画面の×ボタンを押しても最小化されるだけで消えません。
本当に閉じたい場合は、OnCloseの中に次の一行を書きます。

Action = caFree;