|
楼主 |
发表于 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;
} |
|