硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9519|回复: 2
收起左侧

[μCGUI] 响应wm_paint消息显示图片后,是否可以响应wm_key再显示另一张图片?

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2012-11-5 09:57:00 | 显示全部楼层 |阅读模式
转自:http://www.ucgui.net/bbs/dispbbs.asp?boardid=1&Id=1221
Eric2013备注:主要看UCGUI论坛管理员的回复。
这是我的子窗口的回调函数:
static void Fbmovie_callback(WM_MESSAGE*pMsg){   
//Old_movieBackgroundWin(pMsg);
      j=0;
     switch(pMsg->MsgId){
              case WM_PAINT:GUI_Clear();
                    draw_movie_window();
                    break;
             case WM_KEY:
                   switch(((WM_KEY_INFO*)(pMsg->Data.p))->Key)
                   {
                    case KEY_UP:
                             if(j>6)
                              j=0;
                             Redraw_movie_window(j);     
                             j++;
                    break;
                    case KEY_DOWN:
                           if(j<0)
                           j=7;
                           Redraw_movie_window(j);
                           j--;break;
                    case KEY_RIGHT:
                         break;
                   case KEY_LEFT:
                        break;
                  }
             break;
             case WM_PID_STATE_CHANGED:
             / /WM_SetFocus(pMsg->hWin);
                     break;default:
             WM_DefaultProc(pMsg);
                     break;
          }
}         
     程序可以响应按键,但是执行 Redraw_movie_window(j)后,
     并没有显示新的图片!难道是被回调函数重绘了?请问斑竹我该怎么实现这样的功能呢??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2012-11-5 10:00:41 | 显示全部楼层
子窗口是这样产生的:
hw_movie=WM_CreateWindowAsChild(0,0,500,400,WM_HBKWIN,WM_CF_SHOW,Fbmovie_callback,0);
WM_SetCallback(WM_GetDesktopWindow(),0);WM_EnableMemdev(hw_movie);
  //GUI_Clear();
WM_SetFocus(hw_movie);
WM_Paint(hw_movie);
WM_SetCallback(hw_movie,Fbmovie_callback);
  //WM_SetFocuws(WM_GetDesktopWindow());
  while(flag)
{
      //WM_ClrHasTrans(hw_movie);
       WM_Exec();
      //GUI_Delay(200);
      WM_SetFocus(hw_movie);}
      WM_DeleteWindow(hw_movie);
     //WM_SetCallback(WM_HBKWIN,cbBackgroundWin);
    //同样的结构,我把它放在桌面窗口的回调中就可以正常显示!不知道哪里搞错了.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
 楼主| 发表于 2012-11-5 10:02:35 | 显示全部楼层
这个问题, 我很早以前就已经说过了.
我在做五子棋的时候, 要在点击事件后, 在窗体上绘制一个棋子.就如你的问题一样.
在UCGUI中调用每个窗体回调函数处理WM_PAINT消息,画窗体时, 有一个操作就是:
                    WM_SelectWindow(hWin);
                 hWin就要当前要画的窗体句柄.
所以, 你如果要往窗体上绘图, 特别要注意:
     1. 必须先用WM_SelectWindow(hWin);选中当前你要绘图的窗体.否则就是默认绘制在屏幕窗体上.
     2. 还须特别注意的是, 如果是对话框窗体, 想在对话框窗体的回调函数中的WM_TOUCH消息中进行绘图,
         则必须选中对话框窗体的客户区窗体, 因为对话框上的东西都是绘制在其子窗体---客户区窗体上的.
如下, hWin就是对话框窗体够柄:          //The chess is paint to the dialog's client dlg, so select it,
             //if select hWin will not be show chess...
                WM_SelectWindow(WM_GetFirstChild(hWin));
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-18 01:13 , Processed in 0.147920 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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