[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;
 }
}

| | コメント (0)

[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;
}

| | コメント (0)

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

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

Action = caFree;

| | コメント (0)

[Delphi] フォームを最前面に表示する

//最前面に表示する
SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);

//普通に戻す
SetWindowPos(Handle,HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE or SWP_NOMOVE);

FormStyleによって最前面にするとちらつくが、上記の方法だとちらつかずにできる。

| | コメント (0)

[BCB] MDIで親フォームにスクロールバーを出さない方法

//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
    : TForm(Owner)
{
 FClientWndProc = MakeObjectInstance(ClientWndProc);
 if (FClientWndProc != NULL)
  FOrgWndProc = (void *)SetWindowLong(ClientHandle, GWL_WNDPROC,Longint(FClientWndProc));
}
//---------------------------------------------------------------------------
__fastcall TMainForm::~TMainForm(void)
{
 if (FOrgWndProc != NULL)
  SetWindowLong(ClientHandle, GWL_WNDPROC, Longint(FOrgWndProc));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::ClientWndProc(TMessage &Msg)
{
 switch (Msg.Msg) {
 case WM_NCCALCSIZE:
  // スクロールバーを消す
  ShowScrollBar(ClientHandle, SB_BOTH, false);
  Msg.Result = CallWindowProc((FARPROC)FOrgWndProc, ClientHandle,Msg.Msg, Msg.WParam, Msg.LParam);
  break;
 default:
  Msg.Result = CallWindowProc((FARPROC)FOrgWndProc, ClientHandle,Msg.Msg, Msg.WParam, Msg.LParam);
  break;
 }
}

| | コメント (0)

[BCB] 最大化したときのFormのサイズを取得する方法

ヘッダ
class TMainForm : public TForm
{
  :
private:
 TRect FMaximizedRect;
 // メッセージハンドラ
 void _fastcall WMGetMinMaxInfo(TWMGetMinMaxInfo &Msg);

 BEGIN_MESSAGE_MAP
 MESSAGE_HANDLER(WM_GETMINMAXINFO, TWMGetMinMaxInfo, WMGetMinMaxInfo)
 END_MESSAGE_MAP(TForm)
  :
};


ソース
void _fastcall TMainForm::WMGetMinMaxInfo(TWMGetMinMaxInfo &Msg)
{
 //最大化したときのFormのサイズを取得
 FMaximizedRect.Top=0;
 FMaximizedRect.Left=0;
 FMaximizedRect.Right=Msg.MinMaxInfo->ptMaxSize.x;
 FMaximizedRect.Bottom=Msg.MinMaxInfo->ptMaxSize.y;

 /* その他、取得できる値
  //最大化の時のポジション
  Msg.MinMaxInfo.ptMaxPosition.x , Msg.MinMaxInfo.ptMaxPosition.y
  //最小サイズ
  Msg.MinMaxInfo.ptMinTrackSize.x , Msg.MinMaxInfo.ptMinTrackSize.y
  //最大サイズ
  Msg.MinMaxInfo.ptMaxTrackSize.x , Msg.MinMaxInfo.ptMaxTrackSize.y
 */
}

設定値を取得するだけでなく、逆に値を設定することもできるので最大化したときのサイズを変えたりもできる。

| | コメント (0)