찾다

 >  Q&A  >  본문

c++ - settimer用久了绘制的界面会错乱?

1.个人有两个小工具,都使用了win32api无标题栏无边框的自绘界面的形式

其中一个是简单的用了settimer每隔30或者一下网页的内容,然后在WM_PAINT里面textout,这个的问题是时间久了(几个小时)后界面就消失了,任务管理器里面进程还在;

另外一个是鼠标取色的工具,鼠标在桌面上移动,工具上面就即时显示颜色值,这个依然是几个小时内必定会出现界面绘制错乱或者界面变成一个奇怪的窗口。
有人遇到过这个bug吗,网上搜索果无果...请问这个bug怎么解决?

2.
//以下是第一个工具的关键代码

SetTimer(NULL,0,30000,myTimerProc1);

case WM_PAINT:
{
    PAINTSTRUCT ps = { 0 };
    HDC    hDc = BeginPaint(hWnd, &ps);
                
    string strTemp="Init...";
    TextOut(hDc, 10, 0 ,strTemp.c_str(),strTemp.length());
                
    EndPaint(hWnd, &ps);
}
break;
            
VOID CALLBACK myTimerProc1(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime ) 
{
    //获取内容 略...
    InvalidateRect(hwnd, NULL, 1);
    UpdateWindow(hwnd);
}

————————————————————————————————————
以下是第二个工具的关键代码

SetTimer(g_hWnd,1,200,NULL);

static POINT pt={-100};
RECT rc;
static COLORREF cr={0},crLast={0};
    
case WM_TIMER:
            {
                RECT winRect;
                GetWindowRect(hWnd,&winRect);
                GetCursorPos(&pt);
                cr=GetPixel(hdcScreen,pt.x,pt.y);

                if(cr!=crLast)
                {
                    crLast=cr;
                    RECT rect={1,1,220,150};
                    InvalidateRect(hWnd,&rect,0);
                }
            }
            break;

WM_PAINT的代码太乱就不贴了

3.没有报错信息

4.以下是第一个工具截图

这里是第二个工具的正常截图

第二个工具用久了之后变成只剩下这么一个窗口

或者变成这样
(那4个框框是文本框,显示还是没问题,上面一排是可以输入rgb值的,下面一个长的是可以输入颜色16进制,输入rgb值则下面自动显示16进制值,输入16进制值则上面显示转换的rgb值。
自绘的地方则各种错乱)

5.出现时间不定,不知道如何调试

大家讲道理大家讲道理2807일 전722

모든 응답(2)나는 대답할 것이다

  • ringa_lee

    ringa_lee2017-04-17 15:02:38

    시간이 지나면서 문제가 발생한다면 리소스 누수나 메모리 누수로 인한 것일 수도 있나요?

    회신하다
    0
  • 高洛峰

    高洛峰2017-04-17 15:02:38

    GDI 리소스가 소진되었습니다. 공개하지 않은 브러시 글꼴 비트맵이 있는지 확인하세요

    회신하다
    0
  • 취소회신하다