炫彩界面库聊天气泡

炫彩界面库聊天气泡

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

完整源码下载

炫彩界面库聊天气泡_第1张图片

 

//包含炫彩界面库文件
#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  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;
}

 

 

你可能感兴趣的:(炫彩界面库)