Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1408919
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2006-06-27 16:48:29

公司软件用MiniGUI-1.6.x做GUI,现在添加一功能需要通过键盘来控制鼠标移动,本来用SetCursorPos可以完成,但是界面上有一排自定义的按纽控件,是通过鼠标移动消息来控制
按纽的反白显示效果。因此领导提出要求:键盘控制鼠标移动而且那些按纽也需要同时有反白
的效果。
   我就想通过在MSG_KEYDOWN消息下自己向主窗口发送MSG_MOUSEMOVE来完成上述功能。
但是不起效果。自己又查了自定义消息那一节,讲的也不是很清楚。

用SetCursorPos 完成过类似功能,但是有个前提,必须跑在frmebuffer上,qvfb 上不行,你的其他功能可以用 SendMessage 来时现 ,看看现面的代码:(实现一个用方向键来控制鼠标移动的功能)

#include
#include
#include
#include
int x,y;
static int WinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
   switch (message) {
   case MSG_KEYDOWN:
       switch (LOWORD(wParam)){
              case 105:
                   x-=5;
                   SetCursorPos(x,y);
                   break;
              case 106:
                   x+=5;
                   SetCursorPos(x,y);
                   break;
              case 103:
                   y-=5;
                   SetCursorPos(x,y);
                   break;
              case 108:
                   y+=5;
                   SetCursorPos(x,y);
                   break;
       }
       break;

   case MSG_CLOSE:
       DestroyAllControls (hWnd);
       DestroyMainWindow (hWnd);
       PostQuitMessage (hWnd);
       return 0;
   }

   return DefaultMainWinProc(hWnd, message, wParam, lParam);
}

int MiniGUIMain (int args, const char* arg[])
{
   MSG Msg;
   HWND hMainWnd;
   MAINWINCREATE CreateInfo;
   x=100;y=100;
   SetCursorPos(x,y);
#ifdef _LITE_VERSION
   SetDesktopRect(0, 0, 1024, 768);
#endif
   
   CreateInfo.dwstyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
   CreateInfo.dwExstyle = WS_EX_NONE;
   CreateInfo.spCaption = "demo of  key  control mouse";
   CreateInfo.hMenu = 0;
   CreateInfo.hCursor = GetSystemCursor(0);
   CreateInfo.hIcon = 0;
   CreateInfo.MainWindowProc = WinProc;
   CreateInfo.lx = 0;
   CreateInfo.ty = 0;
   CreateInfo.rx = 320;
   CreateInfo.by = 240;
   CreateInfo.iBkColor = COLOR_lightwhite;
   CreateInfo.dwAddData = 0;
   CreateInfo.hHosting = HWND_DESKTOP;
   
   hMainWnd = CreateMainWindow (&CreateInfo);
   
   if (hMainWnd == HWND_INVALID)
       return -1;

   ShowWindow(hMainWnd, SW_SHOWNORMAL);

   while (GetMessage(&Msg, hMainWnd)) {
       //TranslateMessage(&Msg);
       DispatchMessage(&Msg);
   }

   MainWindowThreadCleanup (hMainWnd);

   return 0;
}

#ifndef _LITE_VERSION
#include
#endif
用SendMessage行吗?我做过实验,
SendMessage(hWnd, MSG_MOUSEMOVE , 0 ,0);这样做肯定是不行的,
   你的问题我想大概是这个原因,因为qvfb跑在X Windows上,而X Windows有自己的光标位置,而MiniGUI是跑在qvfb上,所以MiniGUI不能改变X Window的光标位置了。

阅读(1266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~