1

どこか別の場所に描かれた後、描かれた楕円を削除する方法を理解するのに少し苦労しています。私はいつもマウスをフォローするために円が必要です、そしてこれはプログラムがするべきすべてです。マウスの位置を取得して円を描きますが、最後の円を削除するにはどうすればよいですか?

#include <Windows.h>
#include <iostream>

void drawRect(int a1, int a2){
HDC screenDC = ::GetDC(0);
//Draw circle at mouse position
::Ellipse(screenDC, a1, a2+5, a1+9, a2+14);
::ReleaseDC(0, screenDC);
//::InvalidateRect(0, NULL, TRUE); //<- I tried that but then everything flickers
//Also, the refresh rate is not fast enough... still some circles left
}

int main(void)
{

int a1;
int a2;
bool exit=false;
while (exit!=true)
    {
    POINT cursorPos;
    GetCursorPos(&cursorPos);
    float x = 0;
    x = cursorPos.x; 
    float y = 0;
    y = cursorPos.y;

    a1=(int)cursorPos.x;
    a2=(int)cursorPos.y; 
    drawRect(a1, a2);

    }
}
4

1 に答える 1

2

画面全体の上に透明なウィンドウを使用することをお勧めします。これははるかに簡単になります。Windowsは、今説明したように動作するようには設計されていません。速度を最適化するには、次の2つの方法があります。

  1. 2つのDCを使用します-1つのメモリDCはによって作成されCreateCompatibleDCます。このようにして、最初に画像を準備してから、ウィンドウのDCの代わりにすばやく描画することができます。
  2. 円を描いた長方形を覚えて、この長方形だけを無効にします。

また、メッセージを受信するには、WM_MOUSEMOVEメッセージにフックを実装する必要があることに注意してください。ループのあるプログラムは、プロセッサ時間の99%を無料で消費します。マウスフックについてはMSDNを参照してください。

OK、これはWinAPIになります。願わくば、メッセージサイクルなどのWinAPIアプリケーションの基本的なものを書く方法を知っていることを願っています。いずれの場合も、WinAPIアプリケーション用のVisualStudioテンプレートを使用できます。そうします。まず、Aboutダイアログとスタッフに関する興味のないコードを削除します(何をすべきかわからない場合はスキップできます)。次に、ウィンドウを作成する必要があります。

  • 関数を更新しMyRegisterClassます。交換

    wcex.hbrBackground =(HBRUSH)(COLOR_WINDOW + 1); wcex.lpszMenuName = MAKEINTRESOURCE(IDC _...);

wcex.hbrBackground = CreateSolidBrush(RGB(128, 128, 128));
wcex.lpszMenuName = NULL;
  • 関数を更新しInitInstanceます。交換

    hWnd = CreateWindow(szWindowClass、szTitle、WS_OVERLAPPEDWINDOW、CW_USEDEFAULT、0、CW_USEDEFAULT、0、NULL、NULL、hInstance、NULL);

hWnd = CreateWindowEx(WS_EX_TOPMOST|WS_EX_LAYERED, szWindowClass, szTitle, WS_POPUP|WS_VISIBLE, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

hWndの整合性がチェックされた直後に、次のコード行を追加します。

SetLayeredWindowAttributes(hWnd, RGB(128, 128, 128), 255, LWA_COLORKEY);

交換

ShowWindow(hWnd, nCmdShow);

ShowWindow(hWnd, SW_MAXIMIZE);
  • WM_PAINTここで、のセクションに描画を実装しWndProcます。

    hdc = BeginPaint(hWnd、&ps); POINT ptNew; GetCursorPos(&ptNew); HBRUSH hbr = CreateSolidBrush(RGB(255、255、255)); HBRUSH hold =(HBRUSH)SelectObject(hdc、hbr); Ellipse(hdc、ptNew.x + 15、ptNew.y + 15、ptNew.x + 30、ptNew.y + 30); SelectObject(hdc、hold); DeleteObject(hbr); ptOld = ptNew; EndPaint(hWnd、&ps);

  • 明日もフックを続けます。今日は手遅れです。または、この記事を手動でご覧ください。

于 2012-05-30T20:06:55.070 に答える