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

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

16,548

社区成员

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

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

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