聊天程序的编辑框实现?图片/默认表情,如何传送的问题

gdstcwl 2010-01-07 09:18:38
最近在做一个类似聊天程序的东西,聊天窗口用richedit来做,参考网上的代码已经大体实现了自己想要的功能(字体\超链接\插入位图图片等),但是遇到一个难题,不知道如何将编辑框的内容传送出去,尝试使用转换成rtf格式再写入,但是图片却无法显示,请教一下该如何解决呢?
...全文
249 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gdstcwl 2010-01-09
  • 打赏
  • 举报
回复
感谢楼上各位的关注和帮助,已经基本上实现了.
目前的做法是将richedit中的文本读出来,再遍历其中的图片并转换成对应的字符来表示.接受之后再根据字符解码成表情.
bilt719621 2010-01-07
  • 打赏
  • 举报
回复
学习
还没走道这一步
gdstcwl 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wwgddx 的回复:]
引用 3 楼 gdstcwl 的回复:
引用 2 楼 hongya6088 的回复:
可以为每个表情符号定义指定的符号,显示的时候再把符号转换为表情图片

谢谢先,这个在本地输入的时候倒是可以做到,但是对于传送到另一个显示框就没有思路了,能否给个具体实现的例子呢?


用这个的前提是传送到另一个显示框也是你的程序.
[/Quote]

是同一个程序,程序里面也做了表情跟特定符号组合的对应,比如 :) 会转换成一个笑脸在编辑框中显示,但是就是对于如何组织成字符串传送到另一个显示框中显示出来
wwgddx 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gdstcwl 的回复:]
引用 2 楼 hongya6088 的回复:
可以为每个表情符号定义指定的符号,显示的时候再把符号转换为表情图片

谢谢先,这个在本地输入的时候倒是可以做到,但是对于传送到另一个显示框就没有思路了,能否给个具体实现的例子呢?
[/Quote]

用这个的前提是传送到另一个显示框也是你的程序.
gdstcwl 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hongya6088 的回复:]
可以为每个表情符号定义指定的符号,显示的时候再把符号转换为表情图片
[/Quote]
谢谢先,这个在本地输入的时候倒是可以做到,但是对于传送到另一个显示框就没有思路了,能否给个具体实现的例子呢?
hongya6088 2010-01-07
  • 打赏
  • 举报
回复
可以为每个表情符号定义指定的符号,显示的时候再把符号转换为表情图片
sandyandy 2010-01-07
  • 打赏
  • 举报
回复
关注
许文君 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 peachbrandy1 的回复:]
参考 “关键字高亮”
C/C++ code
#include"editcolor.h"
#include<stdio.h>
#include<ctype.h>
#include<list>
#include<string>
#include<map>
#include<iterator>usingnamespace std;#define LEN 256struct ToKen
{string word;int start,end;
};//全局变量list<ToKen>ToKenList;//保存源码中的单词int IChar[LEN]={0};//常量返回是否是_ 数字或字母char szTEXT[MAXWORDS];//保存可见的源码map<string,int>KeyWordMap;

LRESULT CALLBACK(*pProc)(HWND hWnd , UINT uMsg, WPARAM wParam, LPARAM lParam);void init(HINSTANCE hinst,HWND hWnd)
{
ReadKeyWordFromFile();
HWND ChildhWnd= CreateWindow("richedit20a","", WS_CHILD|
WS_VISIBLE|ES_MULTILINE|WS_BORDER|WS_HSCROLL|WS_VSCROLL,10,20,350,350,hWnd, HMENU(IDC_EDIT), hinst, NULL);

pProc=(LRESULT CALLBACK(*)(HWND, UINT, WPARAM , LPARAM))
SetWindowLong(ChildhWnd,GWL_WNDPROC,LONG(EditProc));//*pProc函数指针保存 richedit 的callback
IChar['_']=true;for(int i='a';i<='z';i++)
{
IChar[i]=true;
}for(int i='A';i<='Z';i++)
{
IChar[i]=true;
}
}

LRESULT CALLBACK EditProc(HWND hWnd , UINT uMsg, WPARAM wParam, LPARAM lParam)
{static PAINTSTRUCT ps;
POINT pt;static HDC hDC;
RECT rt;
HFONT font;switch(uMsg)
{case WM_PAINT:
{
font=(HFONT)GetStockObject(SYSTEM_FONT);
SendMessage(hWnd,WM_SETFONT,(WPARAM) font,0);
pProc(hWnd,uMsg,wParam,lParam);
GetShowWords(hWnd,szTEXT);
}break;default:
pProc(hWnd,uMsg,wParam,lParam);

}
}//得到正在显示的所有字符void GetShowWords(HWND hWnd,char*szTEXT)
{
TEXTRANGE tr;static POINTL pt;static RECT rt;static DWORD wordpos;static DWORD linepos;
DWORD firstcharpos,lastcharpos;
SendMessage(hWnd,EM_GETRECT,0,LPARAM(&rt));
pt.x=rt.left;pt.y=rt.top;
wordpos=SendMessage(hWnd,EM_CHARFROMPOS,0,LPARAM(&pt));
linepos=SendMessage(hWnd,EM_LINEFROMCHAR,WPARAM(wordpos),0);
firstcharpos=SendMessage(hWnd,EM_LINEINDEX,WPARAM(linepos),0);
pt.x=rt.right;pt.y=rt.bottom;
lastcharpos=SendMessage(hWnd,EM_CHARFROMPOS,0,LPARAM(&pt));
tr.chrg.cpMin=firstcharpos;tr.chrg.cpMax=lastcharpos;
tr.lpstrText=szTEXT;

SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&tr);

ReadToken(szTEXT,firstcharpos,lastcharpos);
SetCharColor(hWnd,szTEXT,firstcharpos,lastcharpos);
}//设置关键字的字体通过drawtext 画上去盖掉原来的字体void SetCharColor(HWND hWnd,char*szTEXT,int start,int end)
{if (start>= end)return;
HDC hdc=GetDC(hWnd);
RECT rt;
GetClientRect(hWnd,&rt);
DWORD ppt;
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(255,0,0));
HideCaret(hWnd);for(list<ToKen>::iterator it=ToKenList.begin();it!=ToKenList.end();it++)
{if(KeyWordMap.find( it->word)!=KeyWordMap.end())
{
ppt=SendMessage(hWnd,EM_POSFROMCHAR,WPARAM(it->start),0);
rt.left= LOWORD(ppt);
rt.top= HIWORD(ppt);
rt.top+=2;
DrawText(hdc,it->word.c_str(),it->end,&rt,0);
}
}
ShowCaret(hWnd);
ReleaseDC(hWnd,hdc);
}//把代码分解成单词int ReadToken(char*szText,int begin,int end)
{
ToKenList.clear();int k=0;int len=end-begin;
ToKen Temp;while(k<len)
{if(IChar[szText[k]])
{
Temp.word.clear();
Temp.start=k+begin;while(IChar[szText[k]]&&k<len)
{
Temp.word+=szText[k];
k++;
}
Temp.end=Temp.word.size();
ToKenList.push_back(Temp);
}else
{
k++;
}
}
}//从keyword.txt 中读取关键字void ReadKeyWordFromFile()
{
FILE*fp=fopen("keyword.txt","r");if(NULL==fp)return ;char szKey[LEN];string strKey;while(fscanf(fp,"%s",szKey)>0)
{
strKey=szKey;
KeyWordMap.insert(map<string,int>::value_type(strKey,1));
}
fclose(fp);
}
[/Quote]

关键字替代
vclongking 2010-01-07
  • 打赏
  • 举报
回复
关注 学习
peachbrandy1 2010-01-07
  • 打赏
  • 举报
回复
参考 “关键字高亮”

#include"editcolor.h"
#include <stdio.h>
#include <ctype.h>
#include <list>
#include <string>
#include <map>
#include <iterator>
using namespace std;
#define LEN 256
struct ToKen
{
string word;
int start,end;
};
//全局变量
list<ToKen>ToKenList;//保存源码中的单词
int IChar[LEN]={0};//常量返回是否是_ 数字或字母
char szTEXT[MAXWORDS];//保存可见的源码
map<string,int>KeyWordMap;

LRESULT CALLBACK(*pProc)(HWND hWnd , UINT uMsg, WPARAM wParam, LPARAM lParam);

void init(HINSTANCE hinst,HWND hWnd)
{
ReadKeyWordFromFile();
HWND ChildhWnd= CreateWindow("richedit20a", "", WS_CHILD|
WS_VISIBLE|ES_MULTILINE|WS_BORDER|WS_HSCROLL|WS_VSCROLL,
10, 20,350,350,hWnd, HMENU(IDC_EDIT), hinst, NULL);

pProc=(LRESULT CALLBACK(*)(HWND, UINT, WPARAM , LPARAM))
SetWindowLong(ChildhWnd,GWL_WNDPROC,LONG(EditProc));
//*pProc函数指针保存 richedit 的callback

IChar['_']=true;
for(int i='a';i<='z';i++)
{
IChar[i]=true;
}
for(int i='A';i<='Z';i++)
{
IChar[i]=true;
}
}

LRESULT CALLBACK EditProc(HWND hWnd , UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static PAINTSTRUCT ps;
POINT pt;
static HDC hDC;
RECT rt;
HFONT font;
switch(uMsg)
{
case WM_PAINT:
{
font=(HFONT)GetStockObject(SYSTEM_FONT);
SendMessage(hWnd,WM_SETFONT,(WPARAM) font,0);
pProc(hWnd,uMsg,wParam,lParam);
GetShowWords(hWnd,szTEXT);
}
break;

default:
pProc(hWnd,uMsg,wParam,lParam);

}
}


//得到正在显示的所有字符
void GetShowWords(HWND hWnd, char *szTEXT)
{
TEXTRANGE tr;

static POINTL pt;
static RECT rt;
static DWORD wordpos;
static DWORD linepos;
DWORD firstcharpos,lastcharpos;
SendMessage(hWnd,EM_GETRECT,0,LPARAM(&rt));
pt.x=rt.left;pt.y=rt.top;
wordpos =SendMessage(hWnd,EM_CHARFROMPOS,0,LPARAM(&pt));
linepos=SendMessage(hWnd,EM_LINEFROMCHAR,WPARAM(wordpos),0);
firstcharpos=SendMessage(hWnd,EM_LINEINDEX,WPARAM(linepos),0);
pt.x=rt.right;pt.y=rt.bottom;
lastcharpos=SendMessage(hWnd,EM_CHARFROMPOS,0,LPARAM(&pt));
tr.chrg.cpMin=firstcharpos;tr.chrg.cpMax=lastcharpos;
tr.lpstrText=szTEXT;

SendMessage(hWnd,EM_GETTEXTRANGE,0,(LPARAM)&tr);

ReadToken(szTEXT,firstcharpos,lastcharpos);
SetCharColor(hWnd,szTEXT,firstcharpos,lastcharpos);
}

//设置关键字的字体
通过drawtext 画上去盖掉原来的字体
void SetCharColor(HWND hWnd,char *szTEXT,int start,int end)
{

if (start >= end)
return;
HDC hdc=GetDC(hWnd);
RECT rt;
GetClientRect(hWnd,&rt);
DWORD ppt;
SetBkMode(hdc,TRANSPARENT);
SetTextColor(hdc,RGB(255,0,0));
HideCaret(hWnd);
for(list<ToKen>::iterator it=ToKenList.begin();it!=ToKenList.end();it++)
{
if(KeyWordMap.find( it->word)!=KeyWordMap.end())
{
ppt=SendMessage(hWnd,EM_POSFROMCHAR,WPARAM(it->start),0);
rt.left= LOWORD(ppt);
rt.top= HIWORD(ppt);
rt.top+=2;
DrawText(hdc,it->word.c_str(),it->end,&rt,0);
}
}
ShowCaret(hWnd);
ReleaseDC(hWnd,hdc);
}

//把代码分解成单词
int ReadToken(char *szText,int begin,int end)
{
ToKenList.clear();
int k=0;int len=end-begin;
ToKen Temp;
while(k<len)
{

if(IChar[szText[k]])
{
Temp.word.clear();
Temp.start=k+begin;
while(IChar[szText[k]]&&k<len)
{
Temp.word+=szText[k];
k++;
}
Temp.end=Temp.word.size();
ToKenList.push_back(Temp);
}
else
{
k++;
}
}
}

//从keyword.txt 中读取关键字
void ReadKeyWordFromFile()
{
FILE *fp=fopen("keyword.txt","r");
if(NULL==fp)
return ;
char szKey[LEN];
string strKey;
while(fscanf(fp,"%s",szKey)>0)
{
strKey=szKey;
KeyWordMap.insert(map<string,int>::value_type(strKey,1));
}
fclose(fp);
}

ThinkOX 1.5.0 主要的改进有: 修正:修正内核一处安全隐患 修改:nginx伪静态配置 修改:query_user,fields默认值 新增:nginx伪静态规则配置 修复:用户组权限保存问题 修改:后台-》商城-》热销商品阀值配置和货币配置,将标识信息描述为“固定不可改动” 修改:微博渲染修改 修改:七牛附件修改 改进:去除论坛内的默认组 改进:去掉论坛标题的格式 修改:修正url错误 修改:后台微博-》设置-》提示文字 新增:加入默认首页配置项 新增:在导航栏加入 我的头衔 入口 修正:修正帖子回复数量统计 论坛:新增论坛版块 论坛:新增板块分类 论坛:论坛sql调整 新增:表情后台新增删除功能 修改:移动ExpressionModel位置。将getSmile放到Home/Index下 论坛:论坛版块模板 改进:更改安装时用户名的提示 修改:表情补丁修改 新增:表情扩展。表情后台配置 改进:调整用户中心的侧边栏机制 修改:远程图片路径修改 新增:新增补丁 修改:图片处理命名修改 改进:更新手册 修复:修复我的收藏错误 改进:模块在安装的时候清缓存 改进:补充专辑权限 新增:水印 修改:同步绑定开启后页面错位 整合:整合同步登陆绑定解绑设置 修复:修正话题导语提示 修正:修复话题中的bug 新增:话题:新增话题插件 安全漏洞修复:修复缓存getshell漏洞 修正:修正space_link无法获取问题 修复:昵称长度要求不统一,注册不要求但修改资料要求 补丁:加入公共部分的权限 微博:完善微博安装机制,加入权限 改进:加入权限节点删除 改进:改进网站主页模块名称 修改:微博帐号绑定 修改:图片附件url修改。 修改:表情包修改、聊天添加表情 修改:群组修改 改进:模块安装改进 改进:微调样式 改进:加入行为日志清理提醒 改进:增加前台权限节点的编辑功能 新增功能:批量转移用户组功能 nginx伪静态:建议要用的用户先在一个不重要的系统进行配置测试,成功后才在要用的系统中进行配置使用,出现问题请及时反馈 修复:url路径出错修复 修复:微信分享文字超出框 改进:注册用户加入默认用户组 评论插件:新增:增加本地评论前台管理员删除评论的功能 权限:前台权限的检测函数 权限:后台权限管理加入前台权限的分配 文档:补充lazyLoad部分 微博:去掉右侧热门的lazy 资讯:lazyload 微博:更新lazyload 修复:showRegError改为public 改进:完善模块管理 修复:修复模块安装判断,放宽判断 改进:模块禁止未安装访问 改进:补充各模块安装卸载文件 加入模块管理的sql: 模块装卸:完成模块装卸 广告位:优化:修正默认不显示的bug 修正:xss:修正微博搜索xss漏洞 修复:资讯:与微店的模型冲突 修正:邮件订阅插件:修复邮件订阅插件的 论坛:修复:修复统计数量   ThinkOX 内容管理是基于OneThink的轻量化社交解决方案。实现了讨论区、微博、会员中心功能,优化了SEO,便于二次开发。是一款php的论坛源码。 适合:弥补Onethink对用户中心的不足,让开发人员能够快速构建需要论坛和微博的应用程序。或者让普通站长搭建轻量级论坛和微博的网站。     相关阅读 轻量级社交系统ThinkOX正式版发布

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧