找回密码
 注册
搜索
查看: 6888|回复: 0

CRichEditCtrl 超文本编辑(MSN/QQ常用控件)

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
" d& V! M' I' e6 H3 L+ U) T% Ia.可以编译,不能执行的
$ \- b- j4 E: {9 x& N% @AfxInitRichEdit();9 L$ P9 o. L" `
' Q5 c# J. C+ z! S' }, G; _
b.升级默认的Riched版本(默认的有一些bug),如
) f$ C- A8 D, I( V4 p可在InitInstance中添加
" \( F# b. i: `8 \LoadLibrary("RICHED20.DLL")
( I9 {5 u6 q5 M# E1 W, g" o4 b最后注意 FreeLibrary
0 x# n5 x$ C0 Y2 I! z6 l. E* _, q. A! B: T# N/ Y$ d
如果是CRichEditView基类的可用
( p' s3 F" `0 T% Z+ ~! mBOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)) X. W% T( }( G  w/ j
{( a0 ]- {/ j9 V2 }+ ^
//装入rich edit version 2.06 h5 d- h$ S2 V0 E* g- q. |, P2 g
if (LoadLibraryA("RICHED20.DLL") == NULL)
# |  l9 K' [0 s  e5 A5 {- q{
, o7 t- y) @/ h+ JAfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);  P! W, M; Q, z4 [; `2 \
PostMessage(WM_QUIT,0,0);& S) ^# D9 O8 H* z5 i7 m2 m  J
return FALSE;* f6 I2 y  F" W( g6 o! E3 j8 x
}  a" N5 ~% q  r/ l; G  s5 `
1 a! S5 |. f9 b4 v# Q' g( V
m_strClass = RICHEDIT_CLASSA;//for 2.0 class6 }( e3 N7 C6 F% ~& u

; _6 M3 @1 e' }4 @7 Y5 \( lreturn CRichEditView::PreCreateWindow(cs);
! _% r' A6 W. Q4 k, F1 [}. t" X$ G" G, J* n

: E5 J7 l; O% D( m9 Zc.最后追加行+ S1 v) X& X& F+ j3 B- a8 W1 r' d
richeditctrl.SetSel(-1, -1);$ ~% ^# |: A' x. [" Q! ]; K
richeditctrl.ReplaceSel( (LPCTSTR)str );8 J" v* W- ^' ?( H- T6 {8 }3 f

& y, h9 j7 }3 t- b9 a6 Fd.字数限制
/ I, _  h! V. `# \& `CRichEditCtrl::LimitText(long nChars)
% I# y9 d+ s4 O% K3 [- o0 R
+ }2 i, c, q2 _& \# H- Re.换行切换. |/ a  V! @* N) P; \/ |3 n, {
CRichEditView的OnInitialUpdate()函数中加入下面两句:  m% D0 E1 ?  D$ [- f5 @3 }
m_nWordWrap = WrapNone;, a0 K/ Q: t6 A  u+ N
WrapChanged();
: G1 H7 v  _# \/ c( iWrapChanged实际上也是调用! u) }+ k& H! [5 k# M1 W9 u7 u. S, p
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
# w1 I' t7 Q' }: |( f- W/ _/ Lctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow; X0 E6 ^' a6 x+ n5 C
还有不常用的 m_nWordWrap == WrapToTargetDevice
/ ?+ \  _% r# f3 r, Uctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
8 b' F+ p) `8 `. g2 ]% o7 F5 L如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
4 i9 E4 Y5 X) K. ?! `* `. s" u+ o! ~* T: x
f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
' W8 y6 [1 c5 `( v' tpmyRichEditCtrl->PasteSpecial(CF_TEXT);
: [% K% n* g: Y. Z* u1 x2 g3 F4 R9 f8 G6 R( x" N
g.随着输入随着自动滚动条滚动到最后一行6 U% x/ X! e; r
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();. t; Y1 N  R' j% s6 x7 ]' Z
if (nFirstVisible > 0)
8 Y- Q  ?9 a8 e; m1 S. s  d2 U{4 s* h- v% A( R# {. l- Z: W
   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
5 `6 C- u( T# d2 C4 C}
0 i) N( H$ W$ V, G+ I" {# d  F; v9 e: y( x$ z
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);9 Z' d# `: k' i0 q* ?5 S+ P
  i' A: m7 u' {1 @- Q+ `% w

; K7 C) P8 h5 N! Ih.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)
4 l( k* s* N8 NSendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
( _3 o3 p9 _7 K5 }; x* V% OTM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 & \% w9 |3 T' x8 q6 W( ^# [. |- u6 w
SendMessage(EM_SETUNDOLIMIT,100,0);3 a* }+ @$ d7 C' I4 \; J% J

; A  m6 _& W& T, H4 v6 u, R8 Xi.响应OnChange! b& t2 E: ?* d& O5 Y9 S0 G
EM_SETEVENTMASK 设置 ENM_CHANGE
; k( m6 e5 C! S, _1 u8 y4 ulong lMask = GetEventMask();( s+ j: f( f+ B! ?/ D
lMask |= ENM_CHANGE;, J* E% Z& }( X' v
lMask &= ~ENM_PROTECTED;
' c5 \8 d4 x9 Y1 G) O: GSetEventMask(lMask);" q( i' J  U' R8 }" t8 m8 g* j) b$ w

% Z7 ?/ C9 ?$ S* q3 Vj.设置只读8 o' S2 q- U  R) F, i  u2 M
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
! j. |  _9 g& g0 T+ `$ f  D通过设置PROTECTED实现选中的文本只读,参见
' G+ n' [1 q2 j7 {http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/- u8 d) Z& R' S% O* p8 \: n

, Y. `( Y) `  W( {二.函数应用
$ h' ]  k: E/ A: `$ ha.设置字体(主要是通过SetSelectionCharFormat)
1 I- |/ O! i+ j1 n1 j$ ECHARFORMAT cf;
+ ^' X& k: f9 B2 ?/ Arich.GetSelectionCharFormat(cf);
) U# H# D( a) K- @cf.dwMask|=CFM_BOLD;
& |" S$ u0 u+ @2 q# t) ^5 icf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
6 M* Z; X7 @0 X+ ^- Dcf.dwMask|=CFM_ITALIC;
/ F9 }7 h. B$ t0 f! V1 y; rcf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
. ]3 ?  o. T1 K$ e4 wcf.dwMask|=CFM_UNDERLINE;+ t, y3 B2 R& ~5 V" g4 Y4 t
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;3 T9 z* N: z4 N/ U7 z+ y0 X, j
cf.dwMask|=CFM_COLOR;# S/ f! j. p5 o
cf.crTextColor = RGB(255,0,0);//设置颜色
/ V6 o1 s# B" G$ lcf.dwMask|=CFM_SIZE;
8 {: x! U6 M: E* v' `! tcf.yHeight =200;//设置高度
& R) O3 [9 D* X; v7 `# Qcf.dwMask|=CFM_FACE;+ I. \) j! ^/ Z. @" J1 F: O
strcpy(cf.szFaceName ,_T("隶书"));//设置字体
, q+ o7 X0 w3 \2 ^2 v0 vrich.SetSelectionCharFormat(cf);$ \1 d+ O- K" ]+ T- y; V

( d" S6 w2 D+ U) G0 Y0 nb.设置字体的行间距: S* [# {$ X1 }- V9 o! T
要用richedit2.0以上' ]2 b2 E' E* Y6 g& R) Y- N! P
试试
8 F. [, o5 t0 m+ y7 Y& @PARAFORMAT2 pf;3 ^* b  t0 c) o  ?/ [
pf.cbSize = sizeof(PARAFORMAT2);2 M: B/ O  T4 z# A1 ?; o, D
pf.dwMask = PFM_NUMBERING | PFM_OFFSET;/ u" r( U" \8 z$ i; C, {; [
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
8 O' E# \# N$ q5 c: x; i2 Lpf.dxOffset = 10;, n- S0 t! `9 ~" T8 Q
VERIFY(SetParaFormat(pf)); % A, `9 X! W  V; r3 ^
常用的dwMask有
6 L( D* Z9 O$ U- f* x8 _PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET- `- C5 h. H. s/ o. x. c
2 使用阿拉伯数字 (1, 2, 3, ...).  
! z7 Z5 u, F; v6 V9 I, I- D) o3 使用小写字母 (a, b, c, ...).  
5 N3 p$ F! O1 V. o) x4 使用大写字母 (A, B, C, ...).  
+ N) g) S9 s  [/ w4 W5 使用小写罗马数字 (i, ii, iii, ...).  5 _/ x7 @+ @* x  h$ l
6 使用大写罗马数字 (I, II, III, ...).  
& w* ~, z& z7 ~7 自定义,字符见成员 wNumberingStart.  ' B+ e1 b6 L- ]. D
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
9 ]8 s( l; A" A) P. BPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进
; a5 A6 u; Y8 L, y& c3 i  n, SPFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
* Q! T, w$ v" x' B" o$ a" |% xPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距6 j$ M6 D+ ~6 t3 K, g$ ~; b
) |% k) s% ?7 ~" I( h5 O
c.设置CRichEditCtrl(2.0)背景透明 / ^+ o8 U# B4 U/ Z( Z+ w, m- F/ X0 y
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);( c  u* E! g: W  ]7 U% F3 b
style &= WS_EX_TRANSPARENT;
8 u+ [/ H3 Z% |::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);. {3 u3 i1 c9 E0 ]
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
0 M$ Z- [) R+ t2 V% C7 v, y! I/ B! h5 e, z$ o, e$ m4 _
e.得到内容有三种
0 V5 c0 b+ Q, b  u: @% g1)GetWindowText* n3 }5 F* `$ ?
2)使用EM_GETTEXTEX2 N! k2 v& _+ i9 Z; E2 f1 A
GETTEXTEX gt;4 y- ~; h  I' A# g' P. T
gt.cb = 200;
; h& D" |( u* W9 q4 qgt.flags = GT_DEFAULT;. w/ F2 f& e: f8 `* b5 K) \$ b9 [
gt.codepage = CP_ACP ;
. c9 m' [6 b7 N" d0 pgt.lpDefaultChar = NULL; / f5 I7 X4 u2 _8 h% q9 q# S
gt.lpUsedDefChar = NULL;
1 Q; l& c" W. W; zSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);  q; U# S# C  o) U
3)StreamOut(主要用于RTF等格式输出)
& h7 K* D; q1 O6 m" w" J! z2 [) ?static DWORD CALLBACK
: ^( }) A3 D2 n5 L" ?9 P' g# Q1 G& WMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)# n5 s4 c, m6 Q  S; j
{+ n' T8 {8 J3 S. F! @
   CFile* pFile = (CFile*) dwCookie;
+ M5 ~3 n5 l$ p
* t" C/ k$ Y" W+ O$ o# x   pFile->Write(pbBuff, cb);/ T# ^2 J; N8 G2 n
   *pcb = cb;/ I0 n& z& \! O

6 h! ~! E" t9 T+ |   return 0;+ z: U! W% R: U' g; {
}
) i$ o7 o# \/ A5 Q. z8 q) D: ?

$ f9 K. v; p, C4 P3 I8 l9 D   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
9 J9 e2 F- V0 T/ j$ g, J   EDITSTREAM es;
$ h- m7 c" L" G0 N6 R   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用
/ U  y. @! k- V9 [/ ]! `% W   es.pfnCallback = MyStreamOutCallback;
! P/ \% p. r% @, }1 y3 V   pmyRichEditCtrl->StreamOut(SF_RTF, es);, h- K& |: O2 T, X' K+ Q! S# z
读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn
/ }& t' `" c/ q' ]0 P6 I: I5 d# f) g8 A# E
f.查找字符串
. i9 h" `! U; m& `8 TFINDTEXTEX ft;, N4 f; D% v. ^% [
ft.chrg.cpMin = 0;
$ N8 j& ?; E5 `% L9 o# Q- X" Zft.chrg.cpMax = -1;
9 u# o' }( q& y* ~4 x8 w/ }ft.lpstrText = "|";
; [  d' P$ G1 along lPos = FindText(0, &ft);# V* Q; h# [# E& ^2 D3 M# y
* f- I1 E* {. A# J* G, d" J0 [7 e
如果要继续查找,修改cpMin,如
& n0 `8 p& }, c. z* D9 ~" ~int nCount = 0;( u# K3 m  C0 x* y
do- c! N7 j. _1 U+ U
{* I6 i9 w0 t/ z
long lPos = GetRichEditCtrl().FindText(0, &ft);
: u2 k% w/ `& ~2 m5 A2 F; C, ^ if( -1 == lPos) break;" c% q$ K9 q1 N; _3 d2 Q8 p
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);- W" `0 H% B% x+ t
++nCount;; `6 c( N1 o$ ]3 O5 M9 V
}while(TRUE);
7 _# h1 L  v8 G& o% l$ {% [; _! `: A$ L% t9 `* X
g.以Html格式保存8 }# _% d) s3 Q  s! d
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter1 {# T& ]8 W1 c7 H6 J3 V1 \
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/5 t" Q  R" W1 B4 I- D  ~1 D% i% \

- B( Y) ]+ U) ?1 Nh.重载OnProtected函数得到对应的消息,如粘贴等7 U$ c  t  v: V5 F
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult). g3 N& M4 j4 O
{" F# ]+ W1 d" W* ]2 B  S
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
, A1 l( d8 Z/ y# j/ E
5 x4 J" n0 B- Z3 `( | switch (pEP->msg) {
, Y. f/ j4 I/ W2 X# f! e case WM_KEYDOWN://按键,判断pEP->wParam6 f# R' H2 Q) O7 w
case WM_PASTE://粘贴
3 u% ^! C- Q$ Q" z* v8 W case WM_CUT://剪切
7 d' f9 I  y" N( b case EM_SETCHARFORMAT:
( I& l8 x- j& t- e. n4 ] default:0 P/ z; ]2 T8 {3 V( V* ]# t
  break;+ D7 A, l, J! t1 V0 }: s) A* \3 y5 ]
};; W6 x5 O7 f9 m% j

2 x4 S. F8 K: u; ^; }6 v *pResult = FALSE;
1 Q, X9 \7 T! n  J8 |}- A. h4 C5 H! W, V5 C' S

( i# I! H7 v0 D1 u3 r/ c2 T. d三.聊天常用  
& Z, V" m6 L0 `  D& c/ za.LINK 链接功能
; x( b/ a+ b3 Z1.  LoadLibrary(_T("Riched20.dll"));
1 b6 A6 l# x' M( }" |) _! H. _- g2. 创建RichEdit2.0控件% ^" Z4 T* O6 _2 Y; F1 f2 S
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP9 e' {" @! ?5 H4 m) ~/ W
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
, O; g% f6 J7 G          rect.left, rect.top, cx, cy,$ o7 j& D1 e+ h2 Y
  pParentWnd->m_hWnd, (HMENU)nID, NULL);
5 \+ \+ K# w+ T2 p& d9 O3. 设定选中的文字为链接显示1 z2 Q# s1 p# Q3 ^/ x
CHARFORMAT2 cf2;
" j( g$ O& E2 p* EZeroMemory(&cf2, sizeof(CHARFORMAT2));//
# a" k% W' v- q' J6 q4 i5 @$ pcf2.cbSize = sizeof(CHARFORMAT2);  g( t3 w% u$ j: `2 _
cf2.dwMask = CFM_LINK;6 H( [& z" [( f9 B% \
cf2.dwEffects |= CFE_LINK;6 @! z" b$ j3 p: x: s
m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
, S$ i* Q) U% h* j- I& S! I1 }4.支持链接的点击响应
0 T0 A: E: N- q% q1 ^4 am_cRichEdit.SetEventMask(ENM_LINK);' z9 u6 J" z& n
5.响应链接的点击EN_LINK
; u2 n1 V6 H$ [  s$ \- M2 N0 j- g$ A
BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)0 @# @0 Z$ `/ P; K0 }# f% m( S! p
ON_NOTIFY_REFLECT(EN_LINK,OnURL)$ _9 i. C  N+ c# U$ D& Y
END_MESSAGE_MAP()
% f! N: P+ P& q3 g1 |......; x# E& K) S( j$ l2 Y7 I  _0 b
8 a0 c, J1 g) Y1 Y4 p; w; B3 Z( E
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
! @" |4 V! n3 F7 S+ z{
9 q: R+ g* T. v# B* g/ k  RTCHAR LinkChar[512];
' B9 r$ V" u, S% d. t$ h/ p% Q3 ^ENLINK *pLink = (ENLINK *)pNmhdr;
2 Z! l/ A/ K; Z2 ]7 gif (pLink->msg == WM_LBUTTONUP)( h. M8 Z8 a8 p6 n( d( C
{
! f+ {* b/ t" [# u# ]- N( zSetSel(penLink->chrg);//这是链接的文字范围% f/ k4 M7 B" g1 |$ b1 @
long Res = GetSelText((char *)LinkChar);//这是链接文字- ?' s' P7 l2 Z4 B! `0 v- X
                  //后面是你的处理过程
8 U% K4 R0 ^( V) ]: A( ?. Y# C                  ......' u8 w+ ^( ?6 Q! O9 V
         }, j* z- S  M5 W  B
}7 L( n5 e; w/ J5 {; V& w' v

/ D' R$ x6 z, g+ K: s  d9 Nb.插入位图0 v* m6 R4 H' w
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/1 S; s8 j+ V6 S4 H2 s7 i
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/2 I9 `# W6 n2 U

, Y9 e6 O4 r, S, y/ W6 S自定义在RichEdit中插入对象的图标
& a/ E: c8 n/ whttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html( B3 J, z4 G2 O/ g) g2 v
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
$ X( F# o0 d' H7 Y" D2 P  m只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片
2 M) _1 V/ t' a6 n. ~9 k$ ^6 j& M0 X, Y2 P& p7 Q7 Q
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
1 J5 R& |  f+ k另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
: g5 [8 {3 M6 G# K+ U+ e, [# H9 T6 l1 E" J
c.显示GIF动画
' V# Y9 g* a) e5 g! ?# O常用的是通过qq的imageole.dll(也有用Gif89.dll的)
2 u3 g  B. A% h- Z1 }- L$ Hhttp://www.xiaozhou.net/cooldog/blogview.asp?logID=82$ T! i9 \( j' H& ]2 N( X- P
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
4 T" M$ \  \4 Q4 j; `3 n* B! z2 d1 [/ a
在richedit控件中插入动态GIF (Native C++版)
3 S! L& m" T) G: X$ n- dhttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx. ]+ w- {% Q+ `! v; W! N
8 s7 P& J+ _; S' V0 C
d.IRichEditOleCallback的使用
( X' u7 \/ H1 v0 |* @3 Ohttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022
$ l! @5 [( K* V, D" U0 [* h6 G9 L- L3 U# z5 U) K8 l% e5 W* N
类似 MSN 信息发送框的制作(上)
$ ~8 Z2 |& e' Y/ F2 uhttp://www.vckbase.com/document/viewdoc/?id=1087& K6 f/ l- z9 ^7 u
内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串# A. x  E9 _8 f4 P
2 J# y" s$ p% h: D* [1 }6 H
自定义 CRichEditCtrl 控件
! O- ~" _0 s6 Phttp://www.vckbase.com/document/viewdoc/?id=328, ?& }3 Q* z# k1 |
内容包含:鼠标右键消息,消息映射,字体变换3 W4 M4 _; H! p& z" y9 A
# f: E0 _/ D+ f& U5 K( L
PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母# U, Z& j/ N& L# \
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778 . P+ v; H, a/ c* r4 N  J5 v
----------------------0 d0 `2 P4 @2 w0 M" R3 q# A$ ^
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2025-8-9 04:26 , Processed in 0.035119 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表