2012-05-30 64 views
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); 

    } 
} 

回答

2

您最好在屏幕上方使用透明窗口。這會容易得多。 Windows的設計並不像你剛剛描述的那樣。爲了優化速度,您有兩種方法:

  1. 使用兩個DC - 一個由CreateCompatibleDC創建的存儲器DC。這樣,您可以先準備好圖像,然後快速繪製圖像,而不是窗口的DC。
  2. 記住矩形,您已經繪製了圓形並僅使該矩形失效。

另外請注意,你應該實現一個掛鉤WM_MOUSEMOVE消息以接收它們。循環程序將佔用99%的處理器時間。看看MSDN鼠標鉤。

好的,這將是WinAPI。希望,你知道如何編寫一個WinAPI應用程序基本的東西,如消息循環和其他。在任何情況下,您都可以爲WinAPI應用程序使用Visual Studio模板。我會這樣做的。 首先,刪除有關關於對話框和工作人員的無趣代碼(如果您不知道該怎麼做,可以跳過它)。接下來,您應該創建您的窗口:

  • 更新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); 
  • 現在,實施的WndProcWM_PAINT部分圖紙。

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

  • 明天會繼續上鉤。今天太晚了。或者,手動查看this article

+0

嗯,我讀過關於此之前,但我不完全明白。正如我所說的,我第一次使用這個工具,而且我更像是一個系統管理員而不是程序員。你知道我可以看一些例子嗎? – mohrphium

+0

會嘗試,但這需要一些時間來思考。第一個問題是:你想要簡單的WinAPI或MFC的提示嗎? – Forgottn

+0

無論哪種方法更容易實現,因爲我對其中任何一方都沒有經驗。 – mohrphium