win32 绘制超酷界面(二)

来源:互联网 发布:可靠韩国代购淘宝店铺 编辑:程序博客网 时间:2024/06/07 02:05

继续着上次的界面,完成类按钮功能的实现和界面文字显示。
1. 存储类按钮的信息【所在区域和对应的事件】
2. 设置对应的鼠标事件【放到上面时,显示手形图标,其他部分显示箭头】

因此,我们需要设计一个存放按钮区域的数组、存放按钮相关信息的结构。本项目设计如下结构:
1. 按钮信息结构

struct _CLICK{    _CLICK(const WCHAR *txt, RECT A) {        done = txt;        area = A;    }    const WCHAR *done; // 存放控制信息[作为唯一值]    RECT         area; // 存放按钮区域};

2.存放的数组和全局变量

static const WCHAR *gClick = NULL; // 获取点击事件的ID【结构体中done :存放控制信息】static std::vector<struct _CLICK> g_click;

3.获取当前是否是按钮

const WCHAR *GetClick(std::vector<struct _CLICK>& link, int x, int y){    for (std::vector<struct _CLICK >::iterator it = link.begin(); it != link.end(); it++)     {        if((*it).area.left < x && (*it).area.right > x &&   (*it).area.top < y && (*it).area.bottom > y)         {            return (*it).done;        }    }    return NULL;}

4.获取当前鼠标在窗口内的坐标

bool GetCursorPosInHwnd(HWND hwnd, POINT& posOut){    POINT pt;    if (!GetCursorPos(&pt))        return false;    if (!ScreenToClient(hwnd, &pt))        return false;    posOut = pt;    return true;}

5.在消息处理函数中添加变量和事件

const WCHAR *cmd;POINT pt;case WM_SETCURSOR:            if (GetCursorPosInHwnd(hwnd, pt))            {                if(GetClick(g_click, pt.x, pt.y))                {                    SetCursor(LoadCursor(NULL, IDC_HAND));                    return TRUE;                }            }            return DefWindowProc(hwnd, msg, wParam, lParam);        case WM_LBUTTONDOWN:                        gClick = GetClick(g_click,  ((int)(short)LOWORD(lParam)), ((int)(short)LOWORD((lParam))));            break;        case WM_LBUTTONUP:            cmd = GetClick(g_click,  ((int)(short)LOWORD(lParam)), ((int)(short)LOWORD((lParam))));            if (cmd && cmd == gClick)                if (cmd == L"exit")                    SendMessage(hwnd, WM_CLOSE, 0, 0);            break;

工程代码随后附上,也可以去我的下载看看项目代码

0 0
原创粉丝点击