タスクバーの位置や大きさ

タスクバーの位置や大きさ

タスクバーの位置や大きさを取得するには、SHAppBarMessage関数で簡単に取得できます。
まず、この関数を使うためにをincludeします。
次にパラメーターとして使うAPPBARDATA構造体を0で初期化し、cbSizeメンバにこの構造体の大きさを入れておきます。
そして、SHAppBarMessage関数を呼び出します。

#include

APPBARDATA ABData;
ZeroMemory(&ABData, sizeof(ABData)); //0で初期化
ABData.cbSize = sizeof(ABData); //構造体の大きさを入れる
SHAppBarMessage(ABM_GETTASKBARPOS, &ABData);


これで、タスクバーの位置がAPPBARDATA構造体のrcメンバにRECT型で入っています。


サンプル

void GetTaskBarPosition(CRect* lpcRectTaskBar)
{
  APPBARDATA sBarInfo;

  ZeroMemory(&sBarInfo,sizeof(APPBARDATA));
  sBarInfo.cbSize = sizeof(APPBARDATA);
  sBarInfo.hWnd = m_hWnd;
  SHAppBarMessage(ABM_GETTASKBARPOS,&sBarInfo);
  *lpcRectTaskBar = sBarInfo.rc;
}

結果
  *lpcRectTaskBarに{top=1412 bottom=1442 left=-2 right=1802}のように
  スクリーン座標で格納される。leftの値が負であることに注意。

//*********************************************************
// タスクバー領域の矩形を返す。
//*********************************************************
RECT GetTaskbarRect( void )
{
  APPBARDATA abd;

  memset( &abd, 0, sizeof( abd ) );
  abd.cbSize = sizeof( abd );

  SHAppBarMessage( ABM_GETTASKBARPOS, &abd );
  return abd.rc;
}//GetTaskbarRect



デスクトップ領域のサイズ

デスクトップ領域のサイズを取得する方法。

GetSystemMetrics( SM_CXSCREEN ) // デスクトップ領域の幅を返す。
GetSystemMetrics( SM_CYSCREEN ) // デスクトップ領域の高さを返す。


//*********************************************************
// デスクトップ領域の矩形を返す。
//*********************************************************
RECT GetScreenRect( void )
{
  RECT Rect;

  Rect.left = 0;
  Rect.top  = 0;
  Rect.right = GetSystemMetrics( SM_CXSCREEN );
  Rect.bottom = GetSystemMetrics( SM_CYSCREEN );
  return Rect;
}//GetScreenRect


--------------------------------------------------------------------------------

デスクトップ作業領域(デスクトップ領域からタスクバー等を除いた領域)のサイズを取得する方法。
このサイズは最大化されたウィンドウのサイズと一致する。

GetSystemMetrics( SM_CXFULLSCREEN ) // デスクトップ作業領域の幅を返す。
GetSystemMetrics( SM_CYFULLSCREEN ) // デスクトップ作業領域の高さを返す。


//*********************************************************
// デスクトップ作業領域の矩形を返す。
//*********************************************************
RECT GetWorkareaRect( void )
{
  RECT Rect;

  SystemParametersInfo( SPI_GETWORKAREA, 0, &Rect, 0 ); // デスクトップ作業領域の矩形を取得する。
  return Rect;
}//GetWorkareaRect


タスクバーの大きさをのぞいた画面の大きさ

タスクバーの大きさをのぞいた画面の大きさを得たいときがあると思います。
そんなときはSystemParametersInfoAPIを使います。


使用法は、

RECT rc;
SystemParametersInfo(SPI_GETWORKAREA,0,&rc,0);

です。
これで、RECT構造体のrcに画面の左上と右下の座標が入ります。


プログラムが起動するまで待つ

はじめに
バッチ処理等で、あるプログラムが終了するまで次のプログラムを実行させたくないときに、プログラムの終了を待つ方法です。
プログラムの終了を待つには、WaitForSingleObjectというAPIを使います。この関数は、あるオブジェクトがシグナル状態になるまで待つという関数です。なんかややこしい言い方ですが、要するに指定したスイッチがオンになるまで待つということです。そして今回使うスイッチは、プログラムが終了するとオンになるスイッチです。このスイッチは、CreateProcessを使ってプログラムを実行すると手に入ります。PROCESS_INFORMATION構造体に返ってくるhProcess(プロセスのハンドル)がそれです。あとはそれを、WaitForSingleObjectに渡せばOKです。
  PROCESS_INFORMATION Procinfo;
  STARTUPINFO StartInfo;

  StartInfo.cb=sizeof(stinfo);
  StartInfo.lpReserved=NULL;
  StartInfo.lpDesktop=NULL;
  StartInfo.lpTitle=NULL;
  StartInfo.dwFlags=0;
  StartInfo.cbReserved2=0;
  StartInfo.lpReserved2=NULL;

  //プログラムの実行
  CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,0,NULL,NULL
          ,&StartInfo,Procinfo);

  //終了まで待つ
  WaitForSingleObject(Procinfo.hProcess,INFINITE);


さいごに
これでプログラムの終了が待てますが、エクスプローラーだけはこの方法が使えないので注意してください。エクスプローラー(explorer.exe)は、別のエクスプローラー本体を実行して自分はさっさと終了してしまうので、その時点でWaitForSingleObjectから戻ってきてしまいます。


閉じるボタンを灰色にして使えなくする

ウインドウの閉じるボタンを灰色にして使用できなくします。
閉じるボタンはシステムメニューの閉じる項目を使用不可にすると、一緒に使用不可になってくれます。


  hMenu = GetSystemMenu(hWnd,FALSE);
  EnableMenuItem(hMenu,SC_CLOSE,MF_BYCOMMAND|MF_GRAYED);


元に戻すときは、

  hMenu = GetSystemMenu(hWnd,FALSE);
  EnableMenuItem(hMenu,SC_CLOSE,MF_BYCOMMAND|MF_ENABLED);


とします。


環境変数の展開


はじめに
%windir%\explorer.exeのように環境変数を含んだパスを、c:\windows\explorer.exeのように環境変数を展開したパスにする方法です。
方法といっても、そういうAPIがあるので別になんということはないです。

char Name[] = "%windir%\explorer.exe";
char ExpandName[MAX_PATH];

ExpandEnvironmentStrings(Name,ExpandName,sizeof(ExpandName));

これだけです。
このAPIは別にパスじゃなくても単なる文字列でも使えます。というかそっちが本当の使い方。

おわりに
今回のは、小技でも何でもないのですが、私がどうするのか分からなくて結局人に教えてもらったので、誰かが私のように悩まないように載せました。


メモリリークチェック


はじめに
今回はメモリリークのチェックに使っているツールを紹介します。
このツールはVisual C++のデバッグルーチンを使っています。

ソース

リファレンス
必要なインクルードファイル
#include
#include "MyMacro.h"
#include "MyCrtDbg.h"

プロジェクトに追加するファイル
MyCrtDbg.cpp


int WinMain(.............)
{
  DEBUGMEMINIT();
  //DEBUGMEMSETFLAG(DBGMEM_LOG); //メモリ確保時にログが出力される

  pTest = NEW CTest(); //newの代わりにNEWを使用する

  DEBUGMEMRELEASE();
}


出力結果
D:\MyProjects\test.cpp(737) : Allocate Size = 68byte
D:\MyProjects\test.cpp(737) : Allocate Size = 68byte
D:\MyProjects\test.cpp(77) : Allocate Size = 14byte
D:\MyProjects\test.cpp(737) : Allocate Size = 68byte
↑DEBUGMEMSETFLAG(DBGMEM_LOG)設定時のみ

----------------------------------------------------------
メモリ分布
  0 ~ 31 Total: 47 Max: 41
32 ~ 63 Total: 28 Max: 27
64 ~ 95 Total: 10 Max: 10
96 ~ 127 Total: 4 Max: 3
128 ~ 159 Total: 1 Max: 1
160 ~ 191 Total: 0 Max: 0
192 ~ 223 Total: 0 Max: 0
224 ~ 255 Total: 0 Max: 0
256 ~ 287 Total: 0 Max: 0
288 ~   Total: 3 Max: 1
----------------------------------------------------------

最大6204バイトのメモリを確保しました。
64バイト以下のメモリを最大68個 最大1918バイト確保しました。



おわりに
メモリサイズごとの確保回数が出力されるので個人的には重宝しています。

0 コメント: