フリーソフト

« 2006年4月 | トップページ | 2006年6月 »

アイコン・カーソル リソースについて

グループアイコン(RT_GROUP_ICON)やグループカーソル(RT_GROUP_CURSOR)のデータ構造に関する情報です。

まず最初に全体のヘッダ情報。

struct NEWHEADER {
  WORD Reserved;
  WORD ResType;
  WORD ResCount;
} NEWHEADER, *PNEWHEADER;
NEWHEADER NewHeader;

ResTypeにはアイコンならRES_ICON、カーソルならRES_CURSOR。
ResCountには入っているリソースの個数。

ヘッダに続いて以下のデータがリソースの個数だけ続く。

typedef struct tagRESDIR {
  union {
  ICONRESDIR   Icon;
  CURSORDIR    Cursor;
  } ResInfo;
  WORD    Planes;
  WORD    BitCount;
  DWORD   BytesInRes;
  WORD  IconCursorId;
} RESDIR;

Planesはカラープレーン数。
BitCountは1ピクセルあたりのビット数。
BytesInResはリソースのサイズ。
IconCursorIdはリソースのID。

struct ICONRESDIR {
  BYTE Width;
  BYTE Height;
  BYTE ColorCount;
  BYTE reserved;
} ICONRESDIR;

Widthはアイコンの幅。
Heightはアイコンの高さ。
ColorCountは色数。255色以上の場合は0が入る。

struct CURSORDIR {
  WORD Width;
  WORD Height;
} CURSORDIR;

Widthはカーソルの幅。
Heightはカーソルの高さ。

[BCB] ファイルのタイムスタンプ(更新日時など)を取得

ファイルの「作成日時」「更新日時」「アクセス日時」を取得する方法です。手順は
1.ファイルをオープン (CreateFile)
2.ファイルタイムを取得 (GetFileTime)
3.取得したファイルタイム(UTC)をローカルタイムに変換 (FileTimeToLocalFileTime)
4.ローカルファイルタイムをシステムタイムに変換 (FileTimeToSystemTime)
5.システムタイムをTDateTime型に変換 (SystemTimeToDateTime)
6.ファイルをクローズ (CloseHandle)
となります。

  HANDLE hFile;
  FILETIME FtCreationTime,FtLastAccessTime,FtLastWriteTime;
  FILETIME LftCreationTime,LftLastAccessTime,LftLastWriteTime;
  SYSTEMTIME StCreationTime,StLastAccessTime,StLastWriteTime;

  hFile = CreateFile(Filename.c_str() , GENERIC_READ , 0 , NULL ,
  OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
  if (hFile != INVALID_HANDLE_VALUE) {
    GetFileTime(hFile,&FtCreationTime,&FtLastAccessTime,&FtLastWriteTime);

    FileTimeToLocalFileTime(&FtCreationTime,&LftCreationTime);
    FileTimeToSystemTime(&LftCreationTime ,&StCreationTime);
    Edit1->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StCreationTime));

    FileTimeToLocalFileTime(&FtLastAccessTime ,&LftLastAccessTime);
    FileTimeToSystemTime(&LftLastAccessTime ,&StLastAccessTime);
    Edit2->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StLastAccessTime));

    FileTimeToLocalFileTime(&FtLastWriteTime ,&LftLastWriteTime);
    FileTimeToSystemTime(&LftLastWriteTime ,&StLastWriteTime);
    Edit3->Text=FormatDateTime("yyyy/mm/dd hh:nn:ss",SystemTimeToDateTime(StLastWriteTime));
  }
  CloseHandle(hFile);


関連項目:
 ・世界協定時刻(UTC)をローカルタイムに変換
 ・TSystemTime(_SYSTEMTIME)とTDateTimeの変換

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

[Delphi/BCB] manifestファイルをexeに埋め込む

manifestファイルの書き方はこちらを参照してください。

作成したmanifestファイルをexeファイルにリソースとして埋め込む方法です。

#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define CONTROL_PANEL_RESOURCE_ID 123
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "○○.exe.manifest"

これをmanifest.rcというようなファイル名で保存します。なお上記の○○の部分には実行ファイルの名前を書きます。「プロジェクト」-「プロジェクトに追加」で作成したrcファイルをプロジェクトに追加します。

これでコンパイルすればOKです。

[BCB] セーフモードが通常モードかを判定する

switch (GetSystemMetrics(SM_CLEANBOOT)) {
case 0:
  //通常どおり起動された
  break;
case 1:
  //「Safeモード」で起動された
  break;
case 2:
  //「ネットワークを使ったSafeモード」で起動された
  break;
}

[BCB] マウスのボタンの数を取得する

int NumOfButton=GetSystemMetrics(SM_CMOUSEBUTTONS);

switch (NumOfButton) {
case 0:
  //マウスがない
  break;
case 1:
  //ボタンが1個
  break;
case 2:
    :

}

[BCB] マウスが接続されているか調べる

if (GetSystemMetrics(SM_MOUSEPRESENT)) {
  //接続されている
} else {
  //接続されていない
}

[BCB] ListViewに32bitアイコンを表示

BCB6.0では、ListViewなどにWindows XPで使用される32bitアイコン(アルファチャンネルを持つ半透明アイコン)を表示しようとすると、アルファがうまく反映されず、アイコンのふちが黒くなって表示されてしまいます。これを解決する方法です。

まず、ImageListを32bitに変更します。例えばFormCreateなどに次のようなコードを書いておきます。

void __fastcall TForm1::FormCreate(TObject *Sender)
{            
  UINT Flags=ILC_COLOR32;
  if (ImageList1->Masked) Flags|=ILC_MASK;
  ImageList1->Handle = (int)ImageList_Create(Width, Height, Flags, 0, ImageList1->AllocBy);
}

次に、manifestファイルを作成します。書き方はこちらを参照してください。
以上です。

BCB6.0、XP環境において、ImageListに32bitアイコンを追加していき、ListViewに表示したところ正常に表示されました。

[BCB] Windowsのシステムディレクトリを取得

「C:\Windows」のようなWindowsディレクトリを取得するには次のようにします。

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  char Buf[MAX_PATH];
  GetWindowsDirectory(Buf,MAX_PATH);

   Label1->Caption=Buf;
}


同じように「C:\Windows\System32」のようなシステムディレクトリはGetSystemDirectoryで取得することができます。

[BCB] DLLのヘッダファイルの書き方

#ifndef HeaderH
#define HeaderH
//

[BCB] sprintfやDelphiのFormatのような関数は?

AnsiStringのsprintfメソッドを使います。
書式はDelphiのFormat関数と同じような感じです。

AnsiString Str=AnsiString().sprintf("%.5d",i);

« 2006年4月 | トップページ | 2006年6月 »