MiniGUI鼠标捕获演示程序

默认情况下,MiniGUI系统只向光标热点之下的窗口发送鼠标信息,但是,对窗口设置捕获后,即是窗口不在鼠标下,也可接收鼠标消息,只能同时设置1个窗口为捕获窗口。

MiniGUI自带的鼠标捕获演示程序capture.c很难看出捕获的效果,甚至让不熟悉界面编程的人产生误解,所以我改写了示例程序,鼠标右击下面的窗口可切换下面的窗口是否为捕获窗口。

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
#include <minigui/control.h>

#define IDC_MYBUTTON    100
#define IDC_MYBUTTON2    110

/* a simple button control */

static int MybuttonWindowProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    static int status = 0;
    char buff[20]="";
    static int flag=0; 

    switch (message) {

    case MSG_RBUTTONDOWN:
        if(flag==0) {
        SetCapture (hWnd);
        flag=1;
         }
        else {
        ReleaseCapture();
        flag=0;
        }
    break;

    case MSG_LBUTTONDOWN:
    	 ++status;
    	 InvalidateRect (hWnd, NULL, TRUE);
    break;

    case MSG_PAINT:
        hdc = BeginPaint (hWnd);
        if(flag==1)
        sprintf(buff,"capture:%d",status);
        else
        sprintf(buff,"normal:%d",status);
        SetBkMode(hdc, BM_TRANSPARENT);
        TextOut(hdc,10, 0, buff);
        EndPaint(hWnd, hdc);
        return 0;

    case MSG_DESTROY:
        return 0;
    }

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

//注册自定义控件
BOOL RegisterMybutton (void)
{
    WNDCLASS WndClass;

    WndClass.spClassName = "mybutton";
    WndClass.dwStyle     = 0;
    WndClass.dwExStyle   = 0;
    WndClass.hCursor     = GetSystemCursor(0);
    WndClass.iBkColor    = PIXEL_lightgray;
    WndClass.WinProc     = MybuttonWindowProc;

    return RegisterWindowClass (&WndClass);
}

/* main windoww proc */
static int CaptureWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    switch (message) {
    case MSG_CREATE:
        RegisterMybutton();//使用前,注册自定义控件

       	 //创建自定义按钮控件
        CreateWindow ("mybutton", "", WS_VISIBLE | WS_CHILD, IDC_MYBUTTON,
                10, 95, 200, 20, hWnd, 0);

         //创建标准按钮控件
        CreateWindow (CTRL_BUTTON, "", WS_VISIBLE | WS_CHILD, IDC_MYBUTTON2,
                10, 65, 200, 20, hWnd, 0);
        SetWindowText(GetDlgItem(hWnd,IDC_MYBUTTON2),"normal:0");
        break;
    case MSG_COMMAND:
    {
        int id   = LOWORD(wParam);
        int nc = HIWORD(wParam);
         static int num=0;
         char buf[20]="";

        if(id==IDC_MYBUTTON2 && nc==BN_CLICKED) {			//控件的消息处理
           ++num;
           sprintf(buf,"normal:%d",num);
           SetWindowText(GetDlgItem(hWnd,IDC_MYBUTTON2),buf);
         }
    }
    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;

#ifdef _MGRM_PROCESSES
    JoinLayer(NAME_DEF_LAYER , "capture" , 0 , 0);
#endif

    CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
    CreateInfo.dwExStyle = WS_EX_NONE;
    CreateInfo.spCaption = "using mouse capture demo";
    CreateInfo.hMenu = 0;
    CreateInfo.hCursor = GetSystemCursor(0);
    CreateInfo.hIcon = 0;
    CreateInfo.MainWindowProc = CaptureWinProc;
    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 <minigui/dti.c>
#endif
时间: 2024-10-13 11:59:35

MiniGUI鼠标捕获演示程序的相关文章

wpf鼠标捕获与控件交互——UIElement.CaptureMouse

应用场景是这样的,我需要拖动一个元素在屏幕上移动,注册了被移动元素的MouseMove事件,但是当鼠标移到被移动元素的外面时,移动失效,且鼠标的手势变成了普通的箭头形状,于是就找到了以下的解决方案. 本例实现了一个鼠标控制控件移动的简单例子,配合鼠标捕获达成预想效果: 1.新建一个wpf应用程序,为了演示效果,xaml简单修改如下:共有两个圆(绿.黄),下面将要实现如何用鼠标拖动他们移动. <Window x:Class="WpfApplication.MainWindow" x

没有躲过的坑--捕获窗口之外的鼠标消息(钩子还是??)

做一个发送表情的对话框,类似微信和QQ一样的,点击表情按钮,弹出表情框,鼠标点击表情框外时,这个表情框被kill. 说白了 就是在这个窗口上获得窗口外面的鼠标消息. Google百度了一番,很多人说道使用钩子,才能获得窗口外面的click事件,这也未免太小题大做了吧. 还好发现了一个简简单单的函数: SetCapture(*this); 函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一个窗口捕获鼠标

鼠标在某个控件上按下,然后离开后弹起,如何捕获这个鼠标弹起事件

默认情况下当鼠标移出控件外部后控件将获取不到WM_LBUTTONUP消息.以下通过SetCapture函数实现获取. SetCapture 函数功能: 该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一个窗口捕获鼠标.如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口. LRESULT CALLBACK TestProc(HWND hwnd, UINT msg, WPARAM

WPF,强制捕获鼠标事件,鼠标移出控件外依然可以执行强制捕获的鼠标事件

在WPF中,只有鼠标位置在某个控件上的时候才会触发该控件的鼠标事件.例如,有两个控件都注册了MouseDown和MouseUp事件,在控件1上按下鼠标,不要放开,移动到控件2上再放开.在这个过程中,控件1只会触发MouseDown事件,而控件2则只会触发MouseUp事件,鼠标不在控件上他们就收不到对应的鼠标事件.同样的如果某个控件注册了MouseMove事件,当鼠标移动到控件外之后,控件将不会接收到MouseMove事件.但是在很多情况下我们需要在鼠标移动到控件外之后还能接收鼠标事件.例如按住

鼠标消息与键盘消息

在Microsoft Windows 中,键盘和鼠标是两个标准的用户输入源,在一些交叠的操作中通常相互补充使用.当然,鼠标在今天的应用程序中比10年前使用得更为广泛.甚至在一些应用程序中,我们更习惯于使用鼠标,例如在游戏.画图程序.音乐程序,以及Web创览器等程序中就是这样.然而,我们可以不使用鼠标,但绝对不能从一般的PC中拆掉键盘. 相对于个人计算机的其他组件,键盘有非常久远的历史,它起源于1874年的第一台Remington打字机.早期的计算机程序员用键盘在 Hollerith卡片上打孔,以

鼠标事件监听器的创建和使用

鼠标操作是图形操作系统最常用操作,用户使用鼠标单击,双击,右击,拖动等操作实现与软件的交互. 鼠标事件监听器 鼠标事件监听器由MouseListener接口和MouseMotionListener接口定义,分别定义鼠标捕获不同的鼠标操作方法. MouseListener监听器方法说明 mouseClicked(MouseEvent e) 处理鼠标单击事件方法 mouseEntered(MouseEvent e) 鼠标进入组件区域时执行方法 mouseExited(MouseEvent e) 鼠标

界面控件 - 滚动条ScrollBar(对滚动条消息和鼠标消息结合讲的不错)

界面是人机交互的门户,对产品至关重要.在界面开发中只有想不到没有做不到的,有好的想法,当然要尝试着做出来.对滚动条的扩展,现在有很多类是的例子. VS2015的代码编辑是非常强大的,其中有一个功能可以把滚动态变成MinMap,可以通过Options->Text Editor->C/C++->Scroll Bars中的Behavior选项分类进行打开. sublime也有这个功能,但没有VS的好用.变成MinMap后整个代码文档变成一个完整的缩微图,在你对代码比较熟悉的情况下,可以非常容易

win32鼠标

测试鼠标是否在窗口内,以及鼠标的离开 以下给出两种跟踪鼠标是否在窗口内的方法一.使用SetCapture(),OnMouseMove()等判断鼠标位置//设置一个状态量用于记录和标识鼠标是否在窗口内//BOOL m_bOverControl; void C?????::OnMouseMove(UINT nFlags, CPoint point){CStatic::OnMouseMove(nFlags, point); //如果鼠标还在窗口内if (m_bOverControl){CRect re

《Windows程序设计》读书笔七 鼠标

第七章 鼠标 7.1 鼠标的基础知识 fMouse = GetSystemMetrics(SM_MOUSEPRESENT); //判断是否使用鼠标 cButtons = GetSystemMetrics(SM_CMOUSEBUTTONS); //判断安装鼠标的个数 GetSystemMetrics(SM_SWAPBUTTON); //判断鼠标按钮是否被切换 SystemParametersInfo获得鼠标相关的参数信息 7.1.1 一些基本术语 IDC_ARROW IDC_CROSS IDC_W