炫彩界面库聊天气泡

炫彩界面库聊天气泡

使用炫彩界面库提供的聊天气泡组件

完整源码下载

 

//包含炫彩界面库文件
#pragma comment(lib, "XCGUI.lib")
#include "xcgui.h"

class CEditRecv
{
public:
    HELE    m_hEdit;
    USHORT  m_style1;
    HIMAGE  m_hImageAvatar;
    HIMAGE  m_hImageAvatar2;
    HIMAGE  m_hImageBubble;
    HIMAGE  m_hImageBubble2;
    void OnExit()
    {
        if (XC_IsHXCGUI(m_hImageAvatar, XC_IMAGE_FRAME)) XImage_Release(m_hImageAvatar);
        if (XC_IsHXCGUI(m_hImageAvatar2, XC_IMAGE_FRAME)) XImage_Release(m_hImageAvatar2);
        if (XC_IsHXCGUI(m_hImageBubble, XC_IMAGE_FRAME)) XImage_Release(m_hImageBubble);
        if (XC_IsHXCGUI(m_hImageBubble2, XC_IMAGE_FRAME)) XImage_Release(m_hImageBubble2);
    }
    void Init(HWINDOW hWindow, int left, int top, int width, int height)
    {
        m_hEdit = XEdit_Create(left, top, width, height, edit_type_chat, hWindow);
        XEle_EnableKeyTab(m_hEdit, TRUE);
        XEdit_SetRowHeight(m_hEdit, 20);
        //XEle_SetPadding(m_hEdit,50, 0, 60, 0);

        HFONTX  hFont1 = XFont_Create2(L"微软雅黑", 9);
        m_style1 = XEdit_AddStyle(m_hEdit, hFont1, RGB(0, 0, 255),TRUE);
        m_hImageAvatar = XImage_LoadFile(L"image\\avatar.png"); //头像
        m_hImageAvatar2 = XImage_LoadFile(L"image\\logo.png"); //头像
        m_hImageBubble = XImage_LoadFileAdaptive(L"image\\bubble.png",20,15,20,15); //气泡
        m_hImageBubble2 = XImage_LoadFileAdaptive(L"image\\bubble2.png", 20, 16, 20, 10); //气泡2
        
//      XEdit_AddText(m_hEdit, L"\n");
//      XChat_AddChatBegin(m_hEdit, 0, 0, 0x4);
//      XEdit_AddText(m_hEdit, L"系统消息:123456\n");
//      XChat_AddChatEnd(m_hEdit);

    }
    void Recv(edit_data_copy_ *data)
    {
        {
            XEdit_AddText(m_hEdit, L"\n");
            XEdit_AddChatBegin(m_hEdit, 0, 0, 0x4);
            XEdit_AddText(m_hEdit, L"系统消息:123456\n");
            XEdit_AddChatEnd(m_hEdit);
        }

        static int send_left = 1;
        if(send_left%2)
            XEdit_AddChatBegin(m_hEdit, m_hImageAvatar, m_hImageBubble, 0x1 | 0x8);
        else
            XEdit_AddChatBegin(m_hEdit, m_hImageAvatar2, m_hImageBubble2, 0x2 | 0x8);
        send_left++;
        XEdit_AddTextEx(m_hEdit, L"【实习】梦飞(154460336) 2019/1/23 20:30:12\n", m_style1);
        int iCurRow = XEdit_GetCurRow(m_hEdit);
        XEdit_SetRowHeightEx(m_hEdit, iCurRow-1, 40);
        AddData(data);
        XEdit_AddChatEnd(m_hEdit);

        XEdit_AddText(m_hEdit, L"\n");
        XEdit_AutoScroll(m_hEdit);
        XEle_RedrawEle(m_hEdit);
    }
    void AddData(edit_data_copy_  *data)
    {
        //读取样式表
        vector<USHORT>  styleTable(data->nStyleCount, edit_style_no);
        for (int i = 0; i < data->nStyleCount; i++)
        {
            HIMAGE hObj = data->pStyle[i].hFont_image_obj;
            XC_OBJECT_TYPE ty = XObj_GetTypeBase(hObj);
            if (XC_IMAGE_FRAME == ty)
            {
                //HIMAGE hSrc=XImage_GetImageSrc(hObj);
                //const wchar_t* pFile = XImgSrc_GetFile(hSrc);
                int iStyle = XEdit_AddStyle(m_hEdit, hObj, 0, FALSE);
                styleTable[i] = iStyle;
            } else  if (XC_FONT == ty)
            {
                COLORREF color = data->pStyle[i].color;
                int iStyle = XEdit_AddStyle(m_hEdit, (HFONTX)hObj, color, data->pStyle[i].bColor);
                styleTable[i] = iStyle;
            } else  if (XC_ELE == ty)
            {
                if (XC_BUTTON == XC_GetObjectType(hObj))
                {
                    HELE  hBtn = XBtn_Create(0, 0, XEle_GetWidth((HELE)hObj), XEle_GetHeight((HELE)hObj), XBtn_GetText((HELE)hObj), m_hEdit);
                    int iStyle = XEdit_AddStyle(m_hEdit, hBtn, 0, FALSE);
                    styleTable[i] = iStyle;
                }
            } else if (XC_SHAPE == ty)
            {
                if (XC_IsHXCGUI(hObj, XC_SHAPE_GIF))
                {
                    HIMAGE hImageGif = XShapeGif_GetImage(hObj);
                    //HIMAGE hSrc=XImage_GetImageSrc(hImageGif);
                    //const wchar_t* pFile = XImgSrc_GetFile(hSrc);
                    {
                        HXCGUI hGif = XShapeGif_Create(0, 0, XImage_GetWidth(hImageGif), XImage_GetHeight(hImageGif), m_hEdit);
                        XShapeGif_SetImage(hGif, hImageGif);
                        int iStyle = XEdit_AddStyle(m_hEdit, hGif, 0, FALSE);
                        styleTable[i] = iStyle;
                    }
                }
            }
        }
        XEdit_AddData(m_hEdit, data, styleTable.data(), data->nStyleCount);
    }
};

class CEditSend
{
public:
    HWINDOW m_hWindow;
    HELE m_hEdit;
    HELE m_hBtnSend;
    HELE m_hBtnImg1;
    HELE m_hBtnImg2;
    HELE m_hBtnImg3;
    HELE m_hButton;
    HELE m_hBtnFont1;
    HELE m_hBtnFont2;
    HELE m_hBtnFont3;
    HELE m_hBtnColor1;
    HELE m_hBtnColor2;
    HELE m_hBtnColor3;
    int  m_iCurStyle;

    CEditRecv*   m_pRecv;
    void Init(HWINDOW hWindow, int left, int top, int width, int height)
    {
        m_hWindow = hWindow;
        InitBar(left, top);
        m_hBtnSend = XBtn_Create(left + width + 10, top, 80, 30, L"发 送", hWindow);
        XEle_EnableFocus(m_hBtnSend, FALSE);

        m_hEdit = XEdit_Create(left, top, width, height, edit_type_richedit, hWindow);

        XEle_EnableKeyTab(m_hEdit, TRUE);
        XEdit_EnableAutoWrap(m_hEdit, FALSE);

        XEdit_AddText(m_hEdit, L"ABC");

        HIMAGE hImage1 = XImage_LoadFile(L"image\\123.png");
        HIMAGE hImage2 = XImage_LoadFile(L"image\\logo.png");
        XEdit_AddObject(m_hEdit, hImage1);
        XEdit_AddObject(m_hEdit, hImage2);

        HELE hBtn = XBtn_Create(0, 0, 60, 24, L"cc", m_hEdit);
        XEdit_AddObject(m_hEdit, hBtn);

        HIMAGE hImageGif=XImage_LoadFile(L"image\\gif.gif");
        if (hImageGif)
        {
            HXCGUI hGif = XShapeGif_Create(0, 0, XImage_GetWidth(hImageGif), XImage_GetHeight(hImageGif), m_hEdit);
            XShapeGif_SetImage(hGif, hImageGif);
            XEdit_AddObject(m_hEdit, hGif);
        }

        int iStyle = XEdit_AddStyleEx(m_hEdit, L"微软雅黑",16, 0, RGB(200, 0, 0), TRUE);
        XEdit_AddTextEx(m_hEdit, L"123", iStyle);
        iStyle = XEdit_AddStyleEx(m_hEdit, L"微软雅黑", 24, 0, RGB(0, 200, 0), TRUE);
        XEdit_AddTextEx(m_hEdit, L"123", iStyle);
        iStyle = XEdit_AddStyleEx(m_hEdit, L"微软雅黑", 36, 0, RGB(0, 0, 200), TRUE);
        XEdit_AddTextEx(m_hEdit, L"123", iStyle);

        XEle_RegEventCPP(m_hBtnSend, XE_BNCLICK, &CEditSend::OnBtnClick_Send);
        XEle_RegEventCPP(m_hBtnImg1, XE_BNCLICK, &CEditSend::OnBtnClick_img1);
        XEle_RegEventCPP(m_hBtnImg2, XE_BNCLICK, &CEditSend::OnBtnClick_img2);
        XEle_RegEventCPP(m_hBtnImg3, XE_BNCLICK, &CEditSend::OnBtnClick_img3);
        XEle_RegEventCPP(m_hButton, XE_BNCLICK, &CEditSend::OnBtnClick_button);
        XEle_RegEventCPP(m_hBtnFont1, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_font1);
        XEle_RegEventCPP(m_hBtnFont2, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_font2);
        XEle_RegEventCPP(m_hBtnFont3, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_font3);

        XEle_RegEventCPP(m_hBtnColor1, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_color1);
        XEle_RegEventCPP(m_hBtnColor2, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_color2);
        XEle_RegEventCPP(m_hBtnColor3, XE_BUTTON_CHECK, &CEditSend::OnBtnClick_color3);
        XEle_RegEventCPP(m_hEdit, XE_EDIT_STYLE_CHANGED, &CEditSend::OnEditStyleChanged);
        XWnd_RegEventCPP(hWindow, WM_PAINT, &CEditSend::OnWndDrawWindow);
    }
    void InitBar(int left, int top)
    {
        int x = left;
        m_hBtnImg1 = XBtn_Create(x, top - 25, 60, 20, L"img1", m_hWindow); x += 65;
        m_hBtnImg2 = XBtn_Create(x, top - 25, 60, 20, L"img2", m_hWindow); x += 65;
        m_hBtnImg3 = XBtn_Create(x, top - 25, 60, 20, L"gif", m_hWindow); x += 65;
        m_hButton = XBtn_Create(x, top - 25, 60, 20, L"button", m_hWindow); x += 65;
        m_hBtnFont1 = XBtn_Create(x, top - 25, 60, 20, L"字体12", m_hWindow); x += 65;
        m_hBtnFont2 = XBtn_Create(x, top - 25, 60, 20, L"字体24", m_hWindow); x += 65;
        m_hBtnFont3 = XBtn_Create(x, top - 25, 60, 20, L"字体36", m_hWindow); x += 65;

        m_hBtnColor1 = XBtn_Create(x, top - 25, 60, 20, L"color1", m_hWindow); x += 65;
        m_hBtnColor2 = XBtn_Create(x, top - 25, 60, 20, L"color2", m_hWindow); x += 65;
        m_hBtnColor3 = XBtn_Create(x, top - 25, 60, 20, L"color3", m_hWindow); x += 65;

        XEle_EnableFocus(m_hBtnImg1, FALSE);
        XEle_EnableFocus(m_hBtnImg2, FALSE);
        XEle_EnableFocus(m_hBtnImg3, FALSE);
        XEle_EnableFocus(m_hButton, FALSE);
        XEle_EnableFocus(m_hBtnFont1, FALSE);
        XEle_EnableFocus(m_hBtnFont2, FALSE);
        XEle_EnableFocus(m_hBtnFont3, FALSE);

        XEle_EnableFocus(m_hBtnColor1, FALSE);
        XEle_EnableFocus(m_hBtnColor2, FALSE);
        XEle_EnableFocus(m_hBtnColor3, FALSE);

        XBtn_SetType(m_hBtnFont1, button_type_radio);
        XBtn_SetType(m_hBtnFont2, button_type_radio);
        XBtn_SetType(m_hBtnFont3, button_type_radio);
        XBtn_SetGroupID(m_hBtnFont1, 2);
        XBtn_SetGroupID(m_hBtnFont2, 2);
        XBtn_SetGroupID(m_hBtnFont3, 2);

        XBtn_SetType(m_hBtnColor1, button_type_radio);
        XBtn_SetType(m_hBtnColor2, button_type_radio);
        XBtn_SetType(m_hBtnColor3, button_type_radio);
        XBtn_SetGroupID(m_hBtnColor1, 3);
        XBtn_SetGroupID(m_hBtnColor2, 3);
        XBtn_SetGroupID(m_hBtnColor3, 3);
    }

    int  OnBtnClick_Send(BOOL *pbHandled)
    {
        edit_data_copy_*  data = XEdit_GetData(m_hEdit);
        m_pRecv->Recv(data);
        XEdit_FreeData(data);
        return 0;
    }
    int  OnBtnClick_img1(BOOL *pbHandled)
    {
        HIMAGE hImage = XImage_LoadFile(L"image\\123.png");
        if (hImage)
        {
            XEdit_AddObject(m_hEdit, hImage);
            XEle_AdjustLayout(m_hEdit);

            XEdit_AutoScroll(m_hEdit);
            XEle_RedrawEle(m_hEdit);
        }
        return 0;
    }
    int  OnBtnClick_img2(BOOL *pbHandled)
    {
        HIMAGE hImage = XImage_LoadFile(L"image\\logo.png");
        if (hImage)
        {
            XEdit_AddObject(m_hEdit, hImage);
            XEle_AdjustLayout(m_hEdit);

            XEdit_AutoScroll(m_hEdit);
            XEle_RedrawEle(m_hEdit);
        }
        return 0;
    }
    int  OnBtnClick_img3(BOOL *pbHandled)
    {
        HIMAGE hImageGif = XImage_LoadFile(L"image\\gif.gif");
        if (hImageGif)
        {
            HXCGUI hGif = XShapeGif_Create(0, 0, XImage_GetWidth(hImageGif), XImage_GetHeight(hImageGif), m_hEdit);
            XShapeGif_SetImage(hGif, hImageGif);
            XEdit_AddObject(m_hEdit, hGif);
            XEle_AdjustLayout(m_hEdit);

            XEdit_AutoScroll(m_hEdit);
            XEle_RedrawEle(m_hEdit);
        }
        return 0;
    }
    int  OnBtnClick_button(BOOL *pbHandled)
    {
        HELE hButton = XBtn_Create(0, 0, 60, 20, L"button", m_hEdit);
        XEdit_AddObject(m_hEdit, hButton);
        XEle_AdjustLayout(m_hEdit);

        XEdit_AutoScroll(m_hEdit);
        XEle_RedrawEle(m_hEdit);
        return 0;
    }
    int  OnBtnClick_font1(BOOL bCheck, BOOL *pbHandled)
    {
        if(bCheck)  FontColorChange();
        return 0;
    }
    int  OnBtnClick_font2(BOOL bCheck, BOOL *pbHandled)
    {
        if (bCheck) FontColorChange();
        return 0;
    }
    int  OnBtnClick_font3(BOOL bCheck, BOOL *pbHandled)
    {
        if (bCheck) FontColorChange();
        return 0;
    }
    int  OnBtnClick_color1(BOOL bCheck, BOOL *pbHandled)
    {
        if (bCheck) FontColorChange();
        return 0;
    }
    int  OnBtnClick_color2(BOOL bCheck, BOOL *pbHandled)
    {
        if (bCheck) FontColorChange();
        return 0;
    }
    int  OnBtnClick_color3(BOOL bCheck, BOOL *pbHandled)
    {
        if (bCheck) FontColorChange();
        return 0;
    }
    void FontColorChange()
    {
        int fontSize = 12;
        if (XBtn_IsCheck(m_hBtnFont1))
        {
            fontSize = 12;
        } else if (XBtn_IsCheck(m_hBtnFont2))
        {
            fontSize = 24;
        } else if (XBtn_IsCheck(m_hBtnFont3))
        {
            fontSize = 36;
        }
        COLORREF  color = 0;
        if (XBtn_IsCheck(m_hBtnColor1))
        {
            color = RGB(200,0,0);
        } else if (XBtn_IsCheck(m_hBtnColor2))
        {
            color = RGB(0, 200, 0);
        } else if (XBtn_IsCheck(m_hBtnColor3))
        {
            color = RGB(0, 0, 200);
        }
        int iStyle = XEdit_AddStyleEx(m_hEdit, L"微软雅黑", fontSize, 0, color, TRUE);
        m_iCurStyle = iStyle;
        XEdit_SetCurStyle(m_hEdit,iStyle);
        XWnd_RedrawWnd(m_hWindow);
    }
    int  OnEditStyleChanged(int iStyle, BOOL *pbHandled)
    {
        m_iCurStyle = iStyle;
        XWnd_RedrawWnd(m_hWindow);
        return 0;
    }
    int  OnWndDrawWindow(HDRAW hDraw, BOOL *pbHandled)
    {
        *pbHandled = TRUE;
        XWnd_DrawWindow(m_hWindow, hDraw);
        RECT rc;
        XEle_GetRect(m_hEdit, &rc);
        XDraw_SetBrushColor(hDraw, RGB(200, 0, 0));

        edit_style_info_ info;
        if (XEdit_GetStyleInfo(m_hEdit, m_iCurStyle, &info))
        {
            if (edit_style_type_font_color == info.type)
            {
                if (info.hFont_image_obj)
                {
                    wstring  text = L"字体:";
                    xc_font_info_i f;
                    XFont_GetFontInfo((HFONTX)info.hFont_image_obj, &f);
                    text += f.name;
                    text += L", ";
                    text += XC_itow(f.nSize);
                    XDraw_TextOut(hDraw, rc.right + 10, rc.top + 50, text.c_str(), text.size());
                };
                if (info.bColor)
                {
                    wstring text = L"颜色:";
                    text += XC_ColorToHex(info.color);
                    XDraw_TextOut(hDraw, rc.right + 10, rc.top + 75, text.c_str(), text.size());
                }
            }
        }
        return 0;
    }
};

class CQQChat
{
public:
    HWINDOW m_hWindow;
    HELE m_hEdit;
    CEditRecv   m_edit_recv;
    CEditSend   m_edit_send;

    CQQChat() {
        Init();
    }
    void Init()
    {
        m_hWindow = XWnd_Create(0, 0, 800, 800, L"炫彩界面库窗口", NULL, xc_window_style_default);
        HELE m_hButton_close = XBtn_Create(400, 5, 60, 20, L"close", m_hWindow);
        XBtn_SetType(m_hButton_close, button_type_close);
        XWnd_EnableDragWindow(m_hWindow, TRUE);
        XWnd_EnableDragBorder(m_hWindow, FALSE);

        int top = 40;
        m_edit_recv.Init(m_hWindow, 20, top, 600, 500); top += (500+30);
        m_edit_send.Init(m_hWindow, 20, top, 600, 200);
        m_edit_send.m_pRecv = &m_edit_recv;
        XWnd_ShowWindow(m_hWindow, SW_SHOW);
    }
    void OnExit()
    {
        m_edit_recv.OnExit();
    }
};

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    XInitXCGUI();
    CQQChat  MyWindow;
    XRunXCGUI();
    MyWindow.OnExit();
    XExitXCGUI();
    return 0;
}

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
炫彩界面----C语言版 1.C/C++软件界面开发框架,基于Windows平台的Win32开发,不需要其他的支持,从而缩小软件体积,提高效率,增强软件的兼容性. 2.采用DirectUI设计思想,在窗口内无子窗口,界面元素都是一个逻辑上的区域,以方便开发出炫彩高效的软件. 3.界面效果出众,解决了传统UI子窗口抖动,闪烁,效率低,代码臃肿等问题,让您的软件一跃而出. 4.基于炫彩界面框架,可以扩展出更强大的功能,以便实现复杂的应用需求. 5.炫彩界面为您提供了皮肤模块,让您很容易扩展出多套个性皮肤,彰显个性,与众不同. 6.炫彩界面会不断升级,为您提供更加稳定坚固的界面框架,让您的软件坚如磐石. 7.炫彩界面帮助文档,为你提供最新的界面开发文档,帮你解决开发问题! 8.炫彩,稳定,兼容,精小,高效,易扩展,换肤,简单; 炫彩界面,您值得拥有! 支持:VC6.0,VS2005,VS2008,VS2010,易语言,C#,以及支持动态链接调用和回调函数的开发工具和语言. 使用时请导入XCGUI.LIB文件,并包含XCGUI.h头文件. XCGUId.LIB为调试版 在使用中请参考炫彩界面帮助文档: http://www.xcgui.com/documentc/index.html 你们的支持,让我们做的更好! //////////////////////// 当前版本:1.3.5 主要更新如下: 菜单元素功能改进. 菜单条元素功能改进. 工具条元素功能改进. 列表元素,列表框元素,树元素增加复选框功能. 对C++类成员函数注册的支持. 1.3.4主要更新如下: UI设计器对样式表的支持,不足之处会在后续版本中完善. 界面做了少量修改. 1.3.3主要更新如下: UI元素贴图增强 窗口贴图 列表项自绘 列表头项自绘 列表框项自绘 树自绘 Tab元素更名为PropertyPage属性页元素 Slider更改为SliderBar 1.3.2主要更新如下: 窗口居中 设置窗口最小尺寸 修改鼠标点击和双击事件为消息 增强界面设计器 1.3.1主要更新如下: 新增元素:属性网格元素,月历元素,日期编辑框元素,颜色选择元素; 对已知BUG修改 对XML文件定义UI布局支持 增加了界面设计器 在DEBUG调试模式下,增加用户错误报告的支持,以便对界面做更好的改进. 1.3主要更新如下: 对工具条进行了修改 对已知BUG修改 增强了界面设计器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值