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

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

源码直接下载地址: https://pan.quark.cn/s/387d7c8f6289 在使用IE浏览器的过程中,偶尔会出现重置为默认配置操作未能顺利完成的现象。这种情况的发生可能源于多种因素,包括注册表项出现偏差、浏览器附加组件之间存在不兼容、操作系统授权设置不当或受到恶意程序影响等。针对这一挑战,我们可以通过一系列系统性的方法来逐一诊断和纠正。首先需要验证当前用户是否具备管理员级别的操作权限。在执行重置配置的操作时,必须确保IE浏览器是以管理员身份启动的。具体操作方式为,使用鼠标右键单击IE程序图标,并从弹出的菜单中选择“以管理员身份运行”这一选项。其次,应当检查是否存在恶意软件。恶意程序有时会非法修改浏览器的配置信息,从而阻碍重置过程的正常进行。用户可以借助Windows系统自带的Microsoft Safety Scanner进行检测,或者选择安装并使用第三方安全防护软件执行全面的系统扫描。紧接着,需要对浏览器的缓存数据以及Cookies文件进行清理。在IE浏览器界面中,通过访问“工具”菜单并选择“Internet选项”,然后在弹出的设置界面中,切换至“常规”标签页,并执行清除浏览历史记录的操作,此过程应包含Cookies和临时互联网文件。倘若上述步骤均未能解决问题,那么可以考虑禁用或移除那些可能引发冲突的浏览器附加组件。相关操作需要在“工具”菜单下找到并打开“管理加载项”,对可疑的插件进行禁用处理,并在浏览器重新启动后再次尝试执行重置操作。再者,修复IE浏览器相关的注册表配置也是至关重要的环节。注册表编辑器是一个功能强大的系统工具,任何不当的操作都可能导致严重的系统问题,因此在进行修改前必须创建系统还原点作为安全备份。用户可以通过按下“Win+R”组合...
内容概要:本文详细介绍了光伏储能虚拟同步发电机(VSG)并网仿真模型的Simulink实现方法,系统研究了光伏发电与储能系统融合VSG技术并入电网的动态特性与控制策略。通过构建完整的VSG控制模块,模拟其在并网过程中的虚拟惯性响应、频率调节能力和有功无功功率支撑特性,验证了该系统在增强电网稳定性、提升新能源并网适应性方面的有效性。模型全面涵盖光伏出力特性、储能系统充放电管理、VSG有功-无功解耦控制、下垂控制机制以及并网点动态响应等关键环节,并通过多种工况下的仿真分析,评估系统在不同运行条件下的动态性能与鲁棒性。; 适合人群:具备电力系统、新能源发电、自动控制等相关专业背景,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制或电力电子系统研究的科研人员、工程技术人员及研究生。; 使用场景及目标:①深入理解光伏储能系统如何通过VSG技术模拟同步发电机的惯性和阻尼特性以支持电网稳定;②掌握虚拟惯量控制、下垂控制等VSG核心控制策略在Simulink中的建模、参数设计与实现方法;③为新型电力系统中新能源并网的动态仿真、稳定性分析及控制策略优化提供可靠的模型基础和技术参考。; 阅读建议:建议结合所提供的仿真模型进行逐步操作与参数调试,重点关注VSG控制环路的结构设计、控制器参数整定及其对系统动态性能的影响,同时可将该模型拓展应用于多机并联、微电网孤岛/并网切换、多能源协同控制等更复杂的系统场景中进行进阶研究。

16,550

社区成员

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

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

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