デスクトップの壁紙設定と透視

今回は、デスクトップの壁紙を設定しその壁紙を他のウインドウやデスクトップのアイコンを通して透視してみます。

壁紙の設定

 デスクトップの壁紙を設定するには、システムのパラメータを取得・設定するSystemParametersInfo()を使います。このAPIの第一引数に壁紙の設定を指定するSPI_DESKWALLPAPERを、第3引数に壁紙にしたいビットマップファイルのファイル名が入った文字列ポインタを設定するとそのファイルを壁紙にできます。例えば、lpszFnを壁紙にしたいなら

  SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpszFn,0);

 とするわけです。今回は、ウインドウにドラッグ&ドロップされたファイルを壁紙に設定するようにしました。そのためには、まずウインドウの作成後DragAcceptFiles(hwMain,TRUE);としてドロップを受け入れるようにし、WM_DROPFILESメッセージが来たらドロップされたファイルをSystemParametersInfo()に渡して壁紙に設定します。

  case WM_DROPFILES: /* ファイルがドロップされた時の処理 */

    hDrop=(HDROP)wParam; /* HDROPを取得 */
    DragQueryFile(hDrop,0,lpszFn,256); /* ファイル名を取得 */

    /* ドロップされたファイルを壁紙に設定 */
    SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpszFn,0);

    DragFinish(hDrop); /* ドラッグ&ドロップ終了処理 */

    break;

壁紙の透視

 PaintDesktop()を使うと、デバイスコンテキストにデスクトップそのものを描く事ができます。つまり、デスクトップ上のアイコンや他のウインドウを除いた、デスクトップの壁紙やパターンが描かれるわけです。このAPIを使えば、アイコンに埋め尽くされたデスクトップでも壁紙を「透視」できる事になりますね。今回は、ウインドウのクライアント領域全体に壁紙を描くのでウインドウの描画処理を

  case WM_PAINT:

      hdc=BeginPaint(hwnd,&ps);

      /* デバイスコンテキストにデスクトップ描画 */
      PaintDesktop(hdc);

      EndPaint(hwnd,&ps);

      break;

 のようにしておきます。なお、このようにした場合PaintDesktop()で描かれるのは壁紙のうちウインドウの「下」にある部分のようです(デバイスコンテキストの一部だけに描きたい場合は、クリッピングすれば良いみたい)。以上の処理で再描画のたびにウインドウの部分にあるデスクトップの壁紙が描画されるようになったので、ウインドウが移動した時にも再描画をかけておきましょう。これで、ウインドウが壁紙を透視する「ルーペ」になります。

  case WM_MOVE:

      /* ウインドウが移動されるたびに再描画 */
      InvalidateRgn(hwnd,NULL,FALSE);
      UpdateWindow (hwnd);             /* 再描画 */

      break;

プログラム

実行したら、適当なBMPファイルをウインドウにドロップして壁紙を変更し、ウインドウを移動させてみてください。

プログラムソース

ウインドウを動かすと、ウインドウの内部にその部分のデスクトップの壁紙が描画されますね。


Windowsプログラミング実験室 > プログラミング資料庫