程序的主体是一个像Flashget的悬浮窗口一样的工具条,其中一个按钮用于开启、关闭屏幕作画。当按下开始按钮,就可以开始在屏幕上作画,但是和用全屏窗口实现的方法不一样的是,这时候还可以通过鼠标点击来切换窗口,而且按下鼠标左键,只要从按下鼠标左键到当前的时间大于某个时间或移动的距离小于某个值都不会开始画线,满足上述条件的才会开始画线,还有一个问题就是,如果某一笔(从鼠标左键按下到鼠标左键松开)在某个点(按下鼠标左键移动过程中)停留超过一定时间,以后都不算画线,而且如果这一笔是落在文本区,从鼠标左键按下到停留这一区域的文本会被选择起来就像没有经过屏幕画线似的,如果某一笔没有停留过,那么在鼠标经过的地方画线,当抬起鼠标左键超过一定时间,就保存刚才画的东西并且把屏幕上所画的线条清除就好像没有经过屏幕画线似的;如果几笔时间之间的时间间隔不超过上述的的抬起鼠标左键的一定时间,就当成同一幅画,之后又重复上述操作。
经过我的测试,应该不是用全屏的透明窗口之类的实现方法,原因是:1〉全屏窗口不能在开始之后切换窗口;2〉不会因鼠标移动得太慢或移动的距离太短而不开始作画;3〉我打开了一个非全屏的窗口画画,在画的过程中,用Alt加PrintScreen键打印画面,得到的是非全屏窗口,而用全屏窗口方法实现的得到的是整个屏幕的画面。
还有一个问题是如果将日期和时间属性对话框弹出来,在画线过程中,它的时间(秒数等)竟然不会刷新。等抬起超过一定时间(本次画画完毕)之后的画时间恢复正常显示,下一次画又不会刷新。
问题:
1〉怎样在按了开始按钮之后还可以通过点击来切换窗口,而且时间、距离不符合要求不算画线,当成正常的鼠标操作?
2〉怎样在在画完一幅画之后,清除笔迹?
3〉在画的过程中如果停留超过时间,清除笔迹,并且以前的鼠标操作当成正常操作,例如选择文本等?
暂时先提问这么多,等想到再问!

解决方案 »

  1.   

    有点没有看懂你要实现的功能。我试着回答下第一个问题。
    是不是可以让主窗口一直显示于最前端?
    dlg.SetWindowPos(&(dlg.wndTopMost), 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_SHOWWINDOW);//让dlg这个窗口显示在最前面
    其中dlg为窗口对象。
      

  2.   

    看了其他帖子,我想第一个和第三个问题应该可以这样解决:用全局钩子,把鼠标按下到抬起的所有消息吃掉保存起来,如果需要返还给应用,则把保存起来的消息重新发还给应用。谢谢xingwendeng现在的问题是:它画的线是画在各个窗口还是全屏还是其他地方,划完之后又是怎样擦除笔迹的?
      

  3.   

    功能实现起来到不是很难,就是比较麻烦。
    必须两个窗口,一个是悬浮窗口,另一个是绘画窗口。关键是绘画窗口的实现。
    绘画窗口是最大化透明窗口,而非全屏的(网上方法很多)。
    使用Win32的工程比MFC的好实现。
      

  4.   

    应该不是透明窗口,因为如果是透明窗口,日期和时间属性对话框的时间就会更新,他这里的窗口在画线过程中是不变的,而且应该没有绘画窗口,因为如果用某些自己的窗口,用Alt+PrintScreen就会复制到该窗口的位图,而我测试过在画线过程中用Alt+PrintScreen得到的还是其他窗口,例如最前面的是日期和时间属性对话框,得到的还是日期和时间属性对话框而不是某个透明的窗口。
      

  5.   

    可能是主窗口在绘图时才激活的。你使用Alt+PrintScreen时,主窗口并没有激活吧。
      

  6.   

    hhyytt(鹦鹉螺)我是在绘图时使用Alt+PrintScreen的,所以可能是画在屏幕上。
      

  7.   

    这个程序能不能给我一份,研究。
    [email protected]
      

  8.   

    这个程序本身是写字的,但我想把它的思想用于画画,你可以到网上搜一下,“慧视小灵鼠”,不过有很多都是坏的RAR文件。
      

  9.   

    我的是在http://www.xn163.com下的
      

  10.   

    我试了一下,发现他是得到desktop的DC画的。
      

  11.   

    并且画的时候,禁止了desktop的DC的刷新。
      

  12.   

    hhyytt(鹦鹉螺)
    你是通过什么工具进行跟踪的,是SOFTICE吗?
      

  13.   

    主要画图技术:
    编译试试
    #include <windows.h>
    #include <tchar.h>
    #include <assert.h>void CenterText(HDC hDC, int x, int y, LPCTSTR szFace, LPCTSTR szMessage, int point)
    {
        HFONT hFont = CreateFont(- point * GetDeviceCaps(hDC, LOGPIXELSY) / 72,
     0, 0, 0, FW_BOLD, TRUE, FALSE, FALSE, 
     ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, 
     PROOF_QUALITY, VARIABLE_PITCH, szFace);
    //  assert(hFont);    HGDIOBJ hOld = SelectObject(hDC, hFont);    SetTextAlign(hDC, TA_CENTER | TA_BASELINE);    SetBkMode(hDC, TRANSPARENT);
        SetTextColor(hDC, RGB(0, 0, 0xFF));
        TextOut(hDC, x, y, szMessage, _tcslen(szMessage));    SelectObject(hDC, hOld);
        DeleteObject(hFont);
    }const TCHAR szMessage[] = _T("Hello,hhyytt");
    const TCHAR szFace[]    = _T("Times New Roman");#pragma comment(linker, "-merge:.rdata=.text")
    #pragma comment(linker, "-align:512")extern "C" void WinMainCRTStartup()
    {
        HDC hDC = GetDC(NULL);
    // assert(hDC);    CenterText(hDC, GetSystemMetrics(SM_CXSCREEN) / 2,
        GetSystemMetrics(SM_CYSCREEN) / 2,
        szFace, szMessage, 72);
        
        ReleaseDC(NULL, hDC);
        ExitProcess(0);
    }
      

  14.   

    如果是用桌面DC画的话,所话的东西是不用擦去的,否则会闪得太厉害.那么画出来的线是怎么清楚的呢?其实很简单,设置一下模式为"或"就可以了.方法::SetROP2(hDC, R2_NOT);同一条线画两次就可以清除了.不会闪.为什么,"或"运算.
      

  15.   

    请教一下:你的桌面DC怎么写的?能发一份程序给我研究吗? 谢谢了!
    [email protected]