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

gdstcwl 2010-01-07 09:18:38
最近在做一个类似聊天程序的东西,聊天窗口用richedit来做,参考网上的代码已经大体实现了自己想要的功能(字体\超链接\插入位图图片等),但是遇到一个难题,不知道如何将编辑框的内容传送出去,尝试使用转换成rtf格式再写入,但是图片却无法显示,请教一下该如何解决呢?
...全文
306 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);
}

数据集可视化效果可参见下方展示。 【数据集概况】 · 检测类别(中文):[保龄球(bowling)] · 训练集:594 张 · 验证集:75 张 · 测试集:74 张 · 总计:743 张 该数据集聚焦于室内保龄球馆场景,系统性采集了多角度、多姿态下保龄球在不同运动阶段的视觉特征,为保龄球运动过程中的球体识别与轨迹分析提供了高质量标注样本,具有明确的体育训练与智能辅助系统开发价值。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 100 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9938** mAP50-95 | 0.6966 Precision | 0.9740 Recall | 0.9974 train/box_loss | 0.9113 train/cls_loss | 0.2862 val/box_loss | 1.1516 val/cls_loss | 0.3116 【训练过程分析】 100 轮训练后 mAP50 达到 0.9938,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6966,和 mAP50 差距 0.30,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9740、Recall 0.9974,精召双高,模型对保龄球的检测能力强。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖保龄球,置信度整体偏高。 【改进建议】 1. 丰富场景多样性:补充不同光照、背景和遮挡条件下的样本。 2. 提升输入分辨率:640 ...
PaddleOCR 与YOLO目标检测 HTTP 服务。 项目通过 PaddleOCROnnx 原生库集成 OnnxRuntime加速能力,围绕 ONNX 模型部署, 以统一接口提供图像文字识别、YOLO 目标检测和 Tensor 数据输出。 功能概览 文字识别:支持图片 Base64、multipart/form-data 上传,以及文本和 JSON 结果。 目标检测:支持 YOLO 图片检测,返回检测框 JSON 或原始 Tensor。 浏览器演示:访问服务根地址,上传图片并切换 OCR、YOLO 模式。 健康检查:通过 /health 查看服务及 OCR、YOLO 引擎初始化状态。 并发处理:通过 OCR 引擎实例池处理并发请求,可调整实例数量。 体验与调用 启动后访问: 入口 地址 浏览器演示 http://localhost:5000/ 健康检查 http://localhost:5000/health 原生依赖 Windows:优先从 runtimes/win-x64/native/ 加载原生 DLL;该目录没有 PaddleOCROnnx.dll 时,尝试从可执行文件所在目录加载。主 DLL 与对应后端依赖应放在同一原生目录中,不要将同一组依赖分散到多个目录。 Linux:原生运行时位于 runtimes/linux-x64/native/,程序使用相对于可执行文件的运行时搜索路径查找随包部署的依赖。 后端选择:CoreOCROnnx 支持 ONNX Runtime、OpenVINO、TensorRT 后端。请使用与平台、进程架构、硬件和后端匹配的一整套运行时,不要混用不同后端或版本的依赖。

16,550

社区成员

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

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

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