C
WindowsAPI

画面上にウィンドウなしで描画する(C言語)

開発環境

・windows10
・visual studio2017

どのようなプログラムを作るか?

下記コードをコンパイルし、出力された実行ファイルを起動すると画面上に白い四角形が現れ、矢印キーで操作でき、Escキーで終了できるようなプログラムのコードを紹介します。

douga.gif

コード

rect_move.c
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE a, LPSTR b, int c)
{

    HDC hdc;//デバイスコンテキストを入れるためのハンドル

    hdc = GetDC(NULL);//デバイスコンテキスト取得
    //引数NULLでデスクトップのデバイスコンテキスト取得

    int x = 0;//四角形を描画するx軸
    int y = 0;//四角形を描画するy軸
    while (1) {
            InvalidateRect(0, NULL, FALSE);//デスクトップ再描画

            Rectangle(//四角形描画 
                    hdc,         // デバイスコンテキストのハンドル
                    x,   // 長方形の左上隅の x 座標
                    y,    // 長方形の左上隅の y 座標
                    x+100,  // 長方形の右下隅の x 座標
                    y+100  // 長方形の右下隅の y 座標
             );

             int speed = 30;

             if (GetKeyState(VK_UP) < 0) {// 上キーが押されてるか?
                     y=y- speed;
             }


             if (GetKeyState(VK_DOWN) < 0) {// 下キーが押されてるか?
                     y=y+ speed;
             }


             if (GetKeyState(VK_RIGHT) < 0) {// 右キーが押されてるか?
                     x=x+ speed;
             }


             if (GetKeyState(VK_LEFT) < 0) {// 左キーが押されてるか?
                     x = x - speed;
             }


             if (GetKeyState(VK_ESCAPE) < 0) {// Escキーが押されてるか?
                     break;
             }
    }
    InvalidateRect(0, NULL, FALSE);//デスクトップ再描画

    ReleaseDC(NULL, hdc);//デバイスコンテキスト解放
    return 0;
}

用語

・ハンドル
ハンドルとはポインタのような物で、メモリ上のどこかに存在するリソースの場所を特定するための物

・デバイスコンテキスト
デバイスコンテキストとはディスプレイデバイスやプリンターデバイスなどの表示デバイスを仮想化するために導入されたWindowsのしくみ

最後に

今回自windows10で動くwindows vistaのガジェットのようなソフトを作れたらなと思いウィンドウなしで描画する方法を模索し、ようやくそれらしい方法が見つかったので少しでも同じような事で悩んでいる方々の助けになれたらなと思い投稿しました。
しかしまだ私は未熟者です。
今回の投稿に誤りやおかしな表現があるのならば
コメント欄よりご指摘いただければ幸いです。

ちなみにwhile(1)のすぐ下のInvalidateRect(0, NULL, FALSE);を書き忘れると以下のようになります↓(13行目)

AGDRec.gif