|
|
||||
Tips > |
|||||
非アクティブでフォーム表示(SetWindowPos) |
更新 : 2010/10/10 |
||||
|
|
||
解説: アプリケーションによっては、一番後ろに隠れたウィンドウを前面に表示したい、逆に手前のウィンドウを一番後ろに隠したいなどの場合があります。 このような z オーダーに関わる操作は、Win32API 関数の SetWindowPos で実現できます。 今回は、この関数を使って、隠れているウィンドウを非アクティブで前面に出してみます。 ちょっと寄り道: SetWindowPos 関数は以下のように定義されています。 BOOL SetWindowPos( HWND hWnd, // ウィンドウのハンドル HWND hWndInsertAfter, // 配置順序のハンドル int X, // 横方向の位置 int Y, // 縦方向の位置 int cx, // 幅 int cy, // 高さ UINT uFlags // ウィンドウ位置のオプション ); z オーダーは、ウィンドウの視覚的階層構造での奥行きの順番のことです。 使用例: アプリケーションを起動して、Button1 をクリック後、他のウィンドウをアクティブにしてください。 3 秒後、アプリケーションがアクティブにならないで前面に現れます。 準備としては Button と Timer を適当に配置して、Timer の Interval プロパティに 3000 を設定しておきます。 Button1 のクリックで Timer1 を起動させます。 OnTimer では、まず Timer を止めて、アクティブにしないでフォームを表示させるようにSetWindowPos 関数に パラメータを渡します。 これで、他のウィンドウに隠れたアプリケーションが非アクティブで前面に表示されます。 最前面表示後、解除するコードを追加しておくのも良いでしょう。 //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Timer1->Enabled = true; } //------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = false; // 非アクティブでフォームを表示 SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); } //------------------------------------------------------------------- |