游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4013|回复: 1

为HoHo做的一个简单UI,来征求一下大家的意见

[复制链接]

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
发表于 2005-3-18 21:38:00 | 显示全部楼层 |阅读模式
前几天研究过HoHo附带的UI,里面带的控件的确是很多,但是他自身也还存在着很多问题,实在是无法实现我的要求。整个UI界面用的都是同一种字体,大小固定,没有image的控件,类似于MFC框架...... [em10]

所以没办法,只好自己再重新来写过一个UI,这两天已经完成了基本的框架,现在过来征求一下大家的意见。

当初的设计想法
包含有下列控件
Label
Button
Image
剩下的基本不支持,因为我也没有相好怎么做
上面的三个控件并不采用Windows里已有的控件,而是采取自己绘制控件的方法(所以我才说其它控件无法支持),只响应鼠标的消息。如果要加入鼠标响应的代码,需要做的是继承一个基类,然后重载里面的鼠标响应函数。

使用方法
先建立一个于屏幕大小一直的实体
如:CForm form
然后在窗体的消息函数里加入

form.WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
用来处理控件自身的消息
最后在必要的时候刷新一下窗体
form.Draw(SCREENBUFFER);
如果需要往自己的窗体里加入控件,就用
xx = new CLabel
xx.Init(.....)
form.AddObj(xx);

不需要的时候就
form.DelObj(xx);
delete xx;

控件如果不想响应鼠标时间则可以
form.Enable = false;

如果控件暂时不想显示,则
form.Visible = false;

欢迎大家多多提意见 [em24] [em24] [em24]

71

主题

1330

帖子

2585

积分

金牌会员

Rank: 6Rank: 6

积分
2585
 楼主| 发表于 2005-3-18 21:42:00 | 显示全部楼层

Re:为HoHo做的一个简单UI,来征求一下大家的意见

因为CLabel等控件,涉及到一些其它地方代码,所以完整的代码目前还不能给大家下载,这里只是先放出基类的代码,大家稍微的改一下应该就可以编译通过了,大概只需要增加一个引用HoHo头的东西就可以了
#pragma once

#include <windows.h>
#include "..\pic_res_manage.h"
#include "..\..\..\..\common\Gp_iniset.h"
#include <List>
using namespace std;
class myui_CObject
{
public:
        virtual bool WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){return false;};
};

class myui_CControl:public myui_CObject
{
public:
        //virtual bool WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


};

//        鼠标的按键:左键 中键 右键
const int BtnLeft        = 0;
const int BtnMidle        = 1;
const int BtnRight        = 2;

class myui_CWinControl:public myui_CControl
{
private:
protected:
        int m_x, m_y;                                //        自己x,y坐标,相对于父窗口控件的
        int m_width, m_height;                //        宽和高,象素单位
        HFONT m_font;                                //        控件自己的字体
        DWORD m_FontColor;                        //        字体颜色
        LP_BITMAPX m_image;                        //        内部图形的显示图片
        char * Text;                                //        控件附带的字符串

        myui_CObject* ClassParent;        //        自己的上层类,如果是顶层的类,则没有上层为空(NULL)
                                                                //        通过该属性可以得到自己依附于那个控件上
        list <myui_CWinControl *> m_ObjList;        //        附属控件列表,用来保存那些控件依附与自己
                                                                                       
public:
        bool Enable;                                //        是否响应消息
        bool Visible;                                //        是否显示控件
public:
        myui_CWinControl(void);
        ~myui_CWinControl(void);
        int getParentX();                        //        递归取得父控件的坐标
        int getParentY();                        //        实际上取得的是控件在窗口上的坐标
        int getX(){return m_x;};                                        //        取得自己控件的坐标,相对应依附控件的
        int getY(){return m_y;};

        RECT getRect();
        bool setFont(HFONT font){m_font = font;return true;};
        bool setFontCSolor(DWORD color){m_FontColor = color; return true;};
       
public:
        bool WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);                //        消息处理函数
        virtual bool Draw(LP_BITMAPX image);                                //        绘图,传入的是父控件所拥有的界面
        virtual bool AddObj(myui_CWinControl* obj);                        //        给自己加入一个控件
        virtual bool DelObj(myui_CWinControl* obj);                        //        删除一个属于自己的控件
        virtual void OnMouseDown(int x, int y, int botton, int ShiftState = 0){};        //        响应鼠标消息的函数,使用的时候需要继承本类
        virtual void OnMouseUp(int x, int y, int botton, int ShiftState = 0){};                //        然后再重载这些函数就可以响应鼠标消息里
        virtual void OnMouseMove(int x, int y, int botton, int ShiftState = 0){};        //        这里的x y坐标是鼠标在自己范围内的坐标
                                                                                                                                                                //        botton        传入的是鼠标的按键:左键 中键 右键        在上面定义有相关的常量 BtnLeft BtnMidle BtnRight
                                                                                                                                                                //        ShiftState        传入的是虚键状态 就是是否按住了键盘的 Ctrl Shift 相关的内容参照 win32sdk 对 鼠标消息 wParam的解释
};


//////////////////////////////////////////////////////////////////////////////////////////////////
实现代码
#include ".\myui_windows.h"
#define _INRECT(X) X.x >=0 && X.y >=0 && X.x <= m_width && X.y <= m_height

myui_CWinControl::myui_CWinControl(void)
{
        m_x = 0;
        m_y = 0;
        m_width = 0;
        m_height = 0;
        Text = NULL;
        ClassParent = NULL;
        m_image = NULL;
}
myui_CWinControl::~myui_CWinControl(void)
{
        if (m_image)
                GetGraphics()->RemoveBitmap(m_image);
}
//        这里通过取得父类的x y坐标,然后再加上自己的相对坐标
//        才能作为屏幕上显示的相对屏幕的坐标
int myui_CWinControl::getParentX()
{
        if (this->ClassParent)
                return m_x + ((myui_CWinControl *)ClassParent)->getX();
        return m_x;
}

int myui_CWinControl::getParentY()
{
        if (this->ClassParent)
                return m_y + ((myui_CWinControl *)ClassParent)->getY();
        return m_y;
}

RECT myui_CWinControl::getRect()
{
        RECT re;
        re.top = m_x;
        re.left = m_y;
        re.right = m_x + m_width - 1;
        re.bottom = m_y + m_height - 1;
        return re;
}
//        最基本的消息处理函数
//        这里只是处理鼠标消息和键盘消息
//        如果自己还存在往下的消息链,则把当前消息传入消息链里
bool myui_CWinControl::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        if (!Enable)                //        如果该控件被限制处理消息的话,则不运行下面的消息处理
                return false;                //        包括不再往依附于自己的控件里传递消息

        //        先把消息传到下属控件,等处理完毕后自己才处理
        if (!this->m_ObjList.empty())
        {
                list <myui_CWinControl *>::iterator m_MsgIndex;
                for(m_MsgIndex = m_ObjList.begin(); m_MsgIndex != m_ObjList.end(); ++m_MsgIndex)
                {
                        (*m_MsgIndex)->WndProc(hWnd, message, wParam, lParam);
                }
        }

        POINTS out;
        int Button;
        switch(message)
        {
        case WM_LBUTTONDOWN:
                Button = BtnLeft;
                goto _MouseDown;
        case WM_RBUTTONDOWN:
                Button = BtnRight;
_MouseDown:
                out = MAKEPOINTS(lParam);
                out.x -= getParentX();
                out.y -= getParentY();
                if (_INRECT(out))
                        this->OnMouseDown(out.x, out.y, Button, wParam);
                break;
        case WM_LBUTTONUP:
                Button = BtnLeft;
                goto _MouseUp;
        case WM_RBUTTONUP:
                Button = BtnRight;
_MouseUp:
                out = MAKEPOINTS(lParam);
                out.x -= getParentX();
                out.y -= getParentY();
                if (_INRECT(out))
                        this->OnMouseUp(out.x, out.y, Button, wParam);
                break;
        case WM_MOUSEMOVE:
                out = MAKEPOINTS(lParam);
                out.x -= getParentX();
                out.y -= getParentY();
                if (_INRECT(out))
                        this->OnMouseMove(out.x, out.y, wParam);
                break;
        default:
                break;
        }

        return true;
}

bool myui_CWinControl:raw(LP_BITMAPX image)
{
        if (!this->Visible)
                return false;
        if (m_image == NULL)
                return false;

        //        先把自己的图片清理为一种颜色,透明色
        //        然后调用依附于自己的控件进行绘制
        GetGraphics()->ClearBitmap( m_image, 0);
        if (!this->m_ObjList.empty())
        {
                list <myui_CWinControl *>::iterator m_ImgIndex;
                for(m_ImgIndex = m_ObjList.begin(); m_ImgIndex != m_ObjList.end(); ++m_ImgIndex)
                {
                        (*m_ImgIndex)->Draw(m_image);
                }
        }
        //GetGraphics()->DrawBitmap(getX(), getY(), m_image, image, true);
        return true;
}

bool myui_CWinControl::AddObj(myui_CWinControl *obj)
{
        if (obj == NULL)
                return false;
        this->m_ObjList.push_back(obj);
        obj->ClassParent = this;
        return true;
}

bool myui_CWinControl::DelObj(myui_CWinControl *obj)
{
        if (obj == NULL)
                return false;
        list <myui_CWinControl *>::iterator m_ObjIndex;
        for (m_ObjIndex = m_ObjList.begin(); m_ObjIndex != m_ObjList.end(); ++m_ObjIndex)
        {
                if ((*m_ObjIndex) == obj)
                {
                        m_ObjList.erase(m_ObjIndex);
                        obj->ClassParent = NULL;
                        return true;
                }
        }
        return false;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-5-13 11:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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