当前位置:C++技术网 > 资讯 > 使用等待光标正确引导用户使用软件

使用等待光标正确引导用户使用软件

更新时间:2016-01-10 17:16:08浏览次数:1+次

    在之前我一直都没有用过等待光标,在我之前的软件里,等待光标似乎成了摆设。然而,一个体验良好的软件,等待光标需要用上。
    或许是我们还没有形成这个习惯。有的任务处理时间比较长,而我们并没有在意光标的应用。感觉光标只是一个摆设罢了。当用户看到光标还是可以点击的,然后点击了界面。马上,你的界面开始出现了危机,标题栏上面显示了“未响应”的字样。这个未响应表示的是界面没有响应。然而程序内部忙得很,正在处理用户的上一个操作。
    此时用户多半是要强行关闭程序了。因为用户觉得,这个程序已经卡死了。这是不是很悲催的事情。这个能怪用户吗?不能!这是程序员的问题。因为程序员没有按照标准的Windows操作习惯来设置程序的状态,从而造成了假死状态。这样被用户干掉了,程序员脱不了干系!
    所以,你只需要让光标换成等待的状态,提示用户不要点击啦!此时看来平时没用的东西,发挥了很大的作用呀。用户不仅不会点击,还会多一些等待的耐心。至少用户知道,程序正在忙,没有死掉。
    等待光标的样子,有沙漏,也有环形的转圈图等。我们使用SetCursor来设置光标,用LoadCursor来加载系统光标。表示等待光标的宏为IDC_WAIT。我们使用一个空循环来模拟处理时间较长的任务。如果只是切换当前的光标,设置好光标即可。如果要隐藏光标,使用ShowCursor(FALSE)即可,如果再需要显示出来,就要使用ShowCursor(TRUE)。
    注意,隐藏多少次,就要显示多少次。如果隐藏的次数比显示的多,将看不到光标。如果显示的次数比隐藏的多,将隐藏不了光标。次数需要对等哦。
    下面是全部的代码:
#include "windows.h"
#include <tchar.h>
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    switch (message)
    {
        case WM_KEYDOWN:
            {
                SetCursor(LoadCursor(NULL,IDC_WAIT));//切换为等待光标
                for (int i=0;i<1000000000;i++)
                {
                    //模拟长时间处理任务
                }
                SetCursor(LoadCursor(NULL,IDC_ARROW));//恢复光标
                ShowCursor(FALSE);//隐藏光标
            }
        return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
        break;//跳出到默认处理
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,350,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}