Timothy6 2019-12-01 16:56 采纳率: 0%
浏览 188

求问:使用GDI绘图为什么一段时间后会失效?

写了一个记录时间的结构体:
struct time{
int second ;
int centisec ;
} tm ;
WM_PAINT是这样的:
Hdc hdc ;
PAINTSTRUCT ps ;
hdc = BeginPaint(hwnd , &ps) ;
RECT rc ;
SetMapMode(hdc , MM_TEXT) ;
GetClientRect(hwnd , &rc) ;
int r = 0.45 * Min(rc.bottom - rc.top , rc.right - rc.left) ;
SetWindowOrgEx(hdc , (rc.left - rc.right) / 2, (rc.top - rc.bottom) / 2 , NULL) ;

        //Draw the clock

        HBRUSH hb = CreateSolidBrush(RGB(60 , 60 , 60)) ;
        HBRUSH hbold = (HBRUSH)SelectObject(hdc , hb) ;
        Ellipse(hdc , -r , -r , r , r ) ;
        hb = CreateSolidBrush(RGB(30 , 30 , 30)) ;
        SelectObject(hdc , hb) ;
        Ellipse(hdc , -r * 0.90 , -r * 0.90 , r * 0.90 , r * 0.90 ) ;
        hb = CreateSolidBrush(RGB(20 , 20 , 2)) ;
        SelectObject(hdc , hb) ;
        Ellipse(hdc , -r * 0.30 , -r * 0.30 , r * 0.30 , r * 0.30 ) ;
        hb = CreateSolidBrush(RGB(0 , 0 , 0)) ;
        SelectObject(hdc , hb) ;
        Ellipse(hdc , -r * 0.03 , -r * 0.03 , r * 0.03 , r * 0.03 ) ;

        //draw scales

        HPEN hp = CreatePen(PS_SOLID , 2 , RGB(0 , 0 , 0)) ;
        HPEN hpold = (HPEN)SelectObject(hdc , hp) ;
        for (int i = 0 ; i < 30 ; ++i){
            double theta = PI * (double)i / 15.0 ;
            MoveToEx(hdc , r * 0.90 * sin(theta) , - r * 0.90 * cos(theta) , NULL) ;
            LineTo(hdc , r * 0.85 * sin(theta) , - r * 0.85 * cos(theta)) ;
        }
        for (int i = 0 ; i < 100 ; ++i){
            double theta = PI * (double)i / 50.0 ;
            MoveToEx(hdc , r * 0.30 * sin(theta) , - r * 0.30 * cos(theta) , NULL) ;
            LineTo(hdc , r * 0.27 * sin(theta) , - r * 0.27 * cos(theta)) ;
        }

        //draw the hand

        hp = CreatePen(PS_SOLID , 3 , RGB(0 , 0 , 0)) ;
        SelectObject(hdc , hp) ;
        MoveToEx(hdc , 0 , 0 , NULL) ;
        double theta1 = PI / 15.0 * (tm.second + (double)tm.centisec / 100.0) ;
        LineTo(hdc , r * 0.84 * sin(theta1) , - r * 0.84 * cos(theta1)) ;

        hp = CreatePen(PS_SOLID , 2 , RGB(0 , 0 , 0)) ;
        SelectObject(hdc , hp) ;
        MoveToEx(hdc , 0 , 0 , NULL) ;
        double theta2 = PI / 50.0 * tm.centisec ;
        LineTo(hdc , r * 0.26 * sin(theta2) , - r * 0.26 * cos(theta2)) ;
        SelectObject(hdc, hpold) ;
        SelectObject(hdc, hbold) ;
        DeleteObject(hp) ;
        DeleteObject(hb) ;
        EndPaint(hwnd , &ps) ;
}

用了一个计时器SetTimer(hwnd , 9999 , 10 , NULL)

case WM_TIMER:{
        if(wParam == 9999){
            --tm.centisec ;
            proctm(tm) ;
            InvalidateRect(hwnd , NULL , TRUE) ;
        }
        break;
    }
刚开始运行是这样的:
![图片说明](https://img-ask.csdn.net/upload/201912/01/1575190277_775215.png)
运行比较正常,
可是过了一段时间,画刷貌似失效了,变成了这样:![图片说明](https://img-ask.csdn.net/upload/201912/01/1575190495_329616.png)
这是为什么啊?求解!
  • 写回答

1条回答 默认 最新

  • zqbnqsdsmd 2019-12-02 00:20
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题