LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1251|回复: 10

[求助]关于MiniGUI下的InvalidateRect()的问题 

[复制链接]
发表于 2007-4-3 00:39:52 | 显示全部楼层 |阅读模式
完成的功能是想让多个图片轮流的显示在窗口上
但是只能显示第一个图片,就不动了

大家帮我看看啊

#define IDTIMER 100
static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
   HDC hdc;
   static BITMAP s_bmp;
   static char bmpno[] = "0.jpg";
   bmpno[0] = '0';
   RECT rc = {23,12,321,240};
   switch (message) {

  case MSG_CREATE:
    SetTimer(hWnd, IDTIMER, 100);
         
    return 0;         
  case MSG_ERASEBKGND:
    bmpno[0] = bmpno[0]+1;  
    hdc = BeginPaint (hWnd);
    if(LoadBitmapFromFile(HDC_SCREEN, &s_bmp, bmpno));
    FillBoxWithBitmap (hdc, 23, 12, 321, 240, &s_bmp);
    EndPaint(hWnd, hdc);
    return 0;

  case MSG_TIMER:
    InvalidateRect (hWnd, &rc, TRUE);
    return 0;

  case MSG_CLOSE:
    UnloadBitmap(&s_bmp);
    DestroyMainWindow (hWnd);
    PostQuitMessage (hWnd);
    return 0;   

  default:
    return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
    return 0;
}

===========================================================
这个是修正后的一个测试程序,48 ,57是ASIC码

但是运行后显示  “浮点数例外”,大家帮我分析一下吧  小弟先谢了~~


    char bmpno[] = "0.jpg";
    bmpno[0] = 48;

static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    static BITMAP s_bmp;

    RECT rc = {23,12,321,240};

    switch (message) {
  case MSG_CREATE:
    SetTimer(hWnd, IDTIMER, 100);           
    break;
      
  case MSG_PAINT:
    if(LoadBitmapFromFile(HDC_SCREEN, &s_bmp, bmpno))
    {  return -1; }
    hdc = BeginPaint (hWnd);         
    FillBoxWithBitmap (hdc, 23, 12, 321, 240, &s_bmp);
    EndPaint(hWnd, hdc);
    break;
  case MSG_TIMER:
     
    if(wParam == IDTIMER)
         
    { bmpno[0] ++;
    LoadBitmapFromFile(HDC_SCREEN, &s_bmp, bmpno);
              
    GetClientRect(hWnd, &rc);
            
    FillBoxWithBitmap (hdc, 23, 12, 321, 240, &s_bmp);}
    if(bmpno[0] == 57)
    {
    KillTimer(hWnd, IDTIMER);
    UnloadBitmap(&s_bmp);
    DestroyMainWindow (hWnd);
    PostQuitMessage (hWnd);
    }
            
    break;
        
  case MSG_CLOSE:
    KillTimer(hWnd, IDTIMER);
    UnloadBitmap(&s_bmp);
    DestroyMainWindow (hWnd);
    PostQuitMessage (hWnd);
    break;
  default:
    return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
  return 0;
}
发表于 2007-4-3 09:11:07 | 显示全部楼层
为何不在 MSG_TIMER 中直接绘图呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-3 16:00:09 | 显示全部楼层
啊,把程序改了,在MSG_TIMER下绘制,也不好使呀~~~`
回复 支持 反对

使用道具 举报

发表于 2007-4-3 19:12:57 | 显示全部楼层
细看了一下楼主的代码。我记得只在 MSG_PAINT 中才使用 BeginPaint/EndPaint。楼主不妨去掉它们,并用 GetClientDC 来获取 DC
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-4 23:13:22 | 显示全部楼层
我把程序改了一下  还不能成功
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-4 23:30:26 | 显示全部楼层
我认为是消息列队没有及时的刷新
但是也不知道怎么解决 ~~~~
回复 支持 反对

使用道具 举报

发表于 2007-4-4 23:31:20 | 显示全部楼层
好歹也用
[PHP]

复制代码

[/PHP]
(全部大写)

把代码放进去,这种没缩进的东东不要让人看了一次再看第二次
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-5 23:11:09 | 显示全部楼层
哈哈  不好意思啊
之前没有意识到这个问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-4-5 23:11:50 | 显示全部楼层
大虾帮我分析下下吧 谢谢啦
回复 支持 反对

使用道具 举报

发表于 2007-4-10 21:06:51 | 显示全部楼层
  1. static int k = 30;
  2.          .
  3.          .
  4.          .
  5.   case MSG_PAINT:
  6.          .
  7.          .
  8.          .
  9.      --k;
  10.      if(k)  [color="Red"]//第1次来到这里,k是不是等于29呢?[/color]
  11.      {
  12.      KillTimer(hWnd, IDTIMER); [color="Red"]//如果第一次进来就把定时器给删除了……[/color]
  13.          .
  14.          .
  15.          .
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表