今回はデスクトップ時計の表示順序を設定する機能を追加します。
表示順序とは、よくある「常に最前面に表示する」などです。
今回は、以下の3種類を切り替えるようにします。
①通常表示:
時計をクリックすると最前面に表示される。他アプリケーションがアクティブの場合は、背面に隠れる。
②最前面に表示:
常に最前面に表示する。他アプリケーションの裏に隠れることはない。
③最背面に表示:
常に最背面に表示する。クリックしても最前面にでることはない。
まずはデザインです。
前回追加したContextmenuStripに「表示」を追加します。
その下に「通常」「最前面に表示」「最背面に表示」を追加します。

初期表示時は「通常」表示とするため、
「通常」のCheckStateプロパティを「Checked」にCheckedプロパティを「True」にします。

次に実装です。
今回は、最背面に表示させる機能を実現するために、user32.dllというライブラリを使う必要があるようです。
user32.dllを使うためには以下の1行を追加する必要があります。
次に、各ToolStripMenuItemがクリックされた時の処理を追加します。
this.TopMostがtureの時は常に最前面に表示されます。
Checkedプロパティがtrueの時、ToolStripMenuItemの左にレ点が追加されます。
最背面については、TopMostのようなプロパティがないため自分で実装する必要があります。
ネットで調べていたらそれらしいものがありました。
最背面に表示させるにはSetWindowPos関数を使用して、クリックされてもウィンドウがアクティブにならないようにするようです。
Activatedイベント時に上記SetWindowPosを呼び出すようにします。
以上で、通常表示、最前面表示、最背面表示が実現できるはずです。
では、実行。
んー。通常表示と最前面表示は良いのですが、最背面表示に一つ問題が…。
通常の左クリック時は最背面表示が実現されているのですが、右クリック時に何故か前面に出てきてしまいます。
これは宿題として、とりえあえず今日はこの辺で〆ます。
ありがとうございました。
表示順序とは、よくある「常に最前面に表示する」などです。
今回は、以下の3種類を切り替えるようにします。
①通常表示:
時計をクリックすると最前面に表示される。他アプリケーションがアクティブの場合は、背面に隠れる。
②最前面に表示:
常に最前面に表示する。他アプリケーションの裏に隠れることはない。
③最背面に表示:
常に最背面に表示する。クリックしても最前面にでることはない。
まずはデザインです。
前回追加したContextmenuStripに「表示」を追加します。
その下に「通常」「最前面に表示」「最背面に表示」を追加します。
初期表示時は「通常」表示とするため、
「通常」のCheckStateプロパティを「Checked」にCheckedプロパティを「True」にします。
次に実装です。
今回は、最背面に表示させる機能を実現するために、user32.dllというライブラリを使う必要があるようです。
user32.dllを使うためには以下の1行を追加する必要があります。
using System.Runtime.InteropServices; // user32.dllを使用するため
次に、各ToolStripMenuItemがクリックされた時の処理を追加します。
private void 通常ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.TopMost = false;
this.通常ToolStripMenuItem.Checked = true;
this.最前面に表示ToolStripMenuItem.Checked = false;
this.最背面に表示ToolStripMenuItem.Checked = false;
}
private void 最前面に表示ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.TopMost = true;
this.通常ToolStripMenuItem.Checked = false;
this.最前面に表示ToolStripMenuItem.Checked = true;
this.最背面に表示ToolStripMenuItem.Checked = false;
}
private void 最背面に表示ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.TopMost = false;
this.通常ToolStripMenuItem.Checked = false;
this.最前面に表示ToolStripMenuItem.Checked = false;
this.最背面に表示ToolStripMenuItem.Checked = true;
bottomMost();
}
this.TopMostがtureの時は常に最前面に表示されます。
Checkedプロパティがtrueの時、ToolStripMenuItemの左にレ点が追加されます。
最背面については、TopMostのようなプロパティがないため自分で実装する必要があります。
ネットで調べていたらそれらしいものがありました。
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
const UInt32 SWP_NOSIZE = 0x0001; //サイズを変更しない
const UInt32 SWP_NOMOVE = 0x0002; //位置を変更しない
const UInt32 SWP_NOACTIVATE = 0x0010; //ウィンドウをアクティブにしない
private void bottomMost()
{
SetWindowPos(Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
}
private void Form1_Activated(object sender, EventArgs e)
{
if (最背面に表示ToolStripMenuItem.Checked)
{
bottomMost();
}
}
最背面に表示させるにはSetWindowPos関数を使用して、クリックされてもウィンドウがアクティブにならないようにするようです。
Activatedイベント時に上記SetWindowPosを呼び出すようにします。
以上で、通常表示、最前面表示、最背面表示が実現できるはずです。
では、実行。
んー。通常表示と最前面表示は良いのですが、最背面表示に一つ問題が…。
通常の左クリック時は最背面表示が実現されているのですが、右クリック時に何故か前面に出てきてしまいます。
これは宿題として、とりえあえず今日はこの辺で〆ます。
ありがとうございました。
スポンサーサイト
プロフィール
管理者:ハピクロ
ハッピークローバー(ハピクロ)のブログです。
仕事/趣味でプログラミングをやっています。
ゲームも少しやっています。
最新記事
最新コメント
月別アーカイブ
訪問者
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード