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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题$ x) j- Y8 D' ~
a.可以编译,不能执行的
2 W! |4 E$ f# D# qAfxInitRichEdit();# y$ M: t6 u2 L9 i* X$ D1 F* \8 M
& A$ C' m2 E6 P0 W' _+ k) z: H
b.升级默认的Riched版本(默认的有一些bug),如
$ s% F" c8 b$ I4 z9 {" H/ G可在InitInstance中添加
" q7 f% e4 C3 o; L, b: mLoadLibrary("RICHED20.DLL") / C' N( F" B2 N  z0 U8 `
最后注意 FreeLibrary4 ^7 u, _: ^- ~2 N9 E0 \) S
# I2 i+ z8 ~" k. n; ~8 w
如果是CRichEditView基类的可用
7 u+ ^) Z4 V, w. _% c3 E/ }BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
% D. }9 R5 F. v{
6 s' X; Y9 O, D6 f; a//装入rich edit version 2.0$ k" ?3 x- I/ V0 I
if (LoadLibraryA("RICHED20.DLL") == NULL)( \1 B4 S' Z4 c6 o- u* y, r
{1 M0 I5 Y( Y3 M8 V
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
4 T) t- l: S7 ~. h! Z+ t/ {PostMessage(WM_QUIT,0,0);, D) `2 K* {' A& |; r& R# a
return FALSE;
# ?1 e( ^  z" O2 _; S0 S' ~}
$ ?8 T0 z  L( p5 }; n6 c0 X7 D& E4 k4 i+ h& n' O; A
m_strClass = RICHEDIT_CLASSA;//for 2.0 class
; K) R, z2 v9 p5 s: K
. c' N* U0 b. u& M6 Creturn CRichEditView::PreCreateWindow(cs);
- C" ~+ L& O5 ?}
. U+ `4 F1 t0 w( ]1 r# l0 W2 D3 m/ {
c.最后追加行
4 ^0 C+ a- {1 Z5 v1 {richeditctrl.SetSel(-1, -1);
' \' X1 F/ \7 S" T/ V( Mricheditctrl.ReplaceSel( (LPCTSTR)str );+ k, z: Z( {' O  U+ q, `; k- o

3 i" Y1 P( j' g/ @' E1 Ld.字数限制* Y! C1 Q% I* B
CRichEditCtrl::LimitText(long nChars)
. b. m6 w& R7 C' {
% f6 v( }8 J8 ce.换行切换6 j9 E; J  S8 }' Y% H6 F
CRichEditView的OnInitialUpdate()函数中加入下面两句:" l+ L. R0 k9 O: e
m_nWordWrap = WrapNone;" U6 d8 E4 R$ }, I) m3 O5 }
WrapChanged(); , T7 g. m) ~2 T3 I
WrapChanged实际上也是调用
+ i% k1 J- L9 p  lctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone- M. I  ^! g) B1 _
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
0 V, G& x) L3 ~. b% O# A4 ?还有不常用的 m_nWordWrap == WrapToTargetDevice  J( a6 m5 G) a" V9 O0 x
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());! s6 X  o) m* y  q9 t0 y
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
/ B+ B$ d7 ?( m0 X0 t* ^! p6 O
# z, Y$ [- y7 V+ b3 a. r! d' yf.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
3 C. Y0 W1 y, I/ m; K, Q2 k! rpmyRichEditCtrl->PasteSpecial(CF_TEXT);# _! [0 S* |. ?' A
, z- n' b; E) B/ P
g.随着输入随着自动滚动条滚动到最后一行$ s" ^/ B; ~/ L. V
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
$ B; J- F7 G' I, n7 Iif (nFirstVisible > 0)$ V0 N3 |1 R5 q6 Q7 [, j! ~  ?
{
0 z, t+ l5 R& o1 Q. a   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);1 i% m3 w6 ]; s+ L  ]7 l+ \: j2 r2 b# E
}
" K2 M, k3 T2 [1 g1 I+ ]* q
4 e: s5 o8 j5 X1 h( k# Zm_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
+ c, {. u- {  M* ]/ _$ ?7 U' `  C6 U  t6 h- N, w
9 v3 E! _' m: j3 z
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)
2 D" G6 E/ Y5 l' {SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);4 l% `# t% M$ @  e% x
TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 , N% M1 \6 _' g# J1 {
SendMessage(EM_SETUNDOLIMIT,100,0);
7 R9 m6 d0 f1 h  {* C3 f- g' d. l, T7 K9 f& s+ ]
i.响应OnChange
( i% |& H+ g2 ~2 Y4 K' a% SEM_SETEVENTMASK 设置 ENM_CHANGE
# p2 H! j( h' Z$ Qlong lMask = GetEventMask();
7 G8 A) x. B- J; WlMask |= ENM_CHANGE;+ c6 h1 f. p0 U5 e& ~( m
lMask &= ~ENM_PROTECTED;
5 {. Z8 S# q1 t) [7 q2 H* L  V+ LSetEventMask(lMask);  m- |/ x2 e* O+ ~

4 i. B- ~' V7 R) Rj.设置只读
- o3 V( R4 t/ W# Z% ]  O4 [CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );4 b( O  S- ^- ]! Z( Z- t
通过设置PROTECTED实现选中的文本只读,参见
' Q3 E0 J7 j- r- W0 O1 Shttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/1 B7 ~% \( a+ T0 g! _8 \9 f3 a
6 g% h1 k% W; H2 {
二.函数应用
- N; ^) ]9 {7 @% fa.设置字体(主要是通过SetSelectionCharFormat)3 c) p3 X4 M- G: [- O
CHARFORMAT cf;
% V7 K, N5 h8 `( S9 L9 frich.GetSelectionCharFormat(cf);
3 b9 {0 M' d$ T( O7 ccf.dwMask|=CFM_BOLD;
2 |" j# o' J5 Scf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
/ D. v$ R! _2 A  N# bcf.dwMask|=CFM_ITALIC;
- Q" Y5 Q. W/ V3 v3 Q! V9 ecf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;: E5 M5 ^7 X; o) |: ^
cf.dwMask|=CFM_UNDERLINE;" p' K+ t0 h/ d8 l6 h+ l2 \
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
/ o/ ]6 t' z9 V- B, bcf.dwMask|=CFM_COLOR;
/ @$ Z) v0 H# v$ E5 Z! o, S4 kcf.crTextColor = RGB(255,0,0);//设置颜色
6 V3 w" A& Z2 J/ Y) [8 @  Ncf.dwMask|=CFM_SIZE;0 O7 X  m/ l7 a3 M- q1 U
cf.yHeight =200;//设置高度
/ @8 c/ w' d. Q% Mcf.dwMask|=CFM_FACE;
) S3 N8 b/ W! |, G( Kstrcpy(cf.szFaceName ,_T("隶书"));//设置字体' @! T7 {8 k6 {! b. l9 m
rich.SetSelectionCharFormat(cf);
6 M3 O4 ]  |" g6 O  g4 F- u* O6 B1 L( @* S) z  G) ?3 d9 c
b.设置字体的行间距
* A+ f- @3 Q3 B4 q1 ]' f要用richedit2.0以上! P! o, m/ G$ j5 p  T
试试
$ m  p9 C0 G3 A3 ~- i* aPARAFORMAT2 pf;9 i! K# f2 Y8 {1 {  E
pf.cbSize = sizeof(PARAFORMAT2);
' G( x. r5 q$ S8 Qpf.dwMask = PFM_NUMBERING | PFM_OFFSET;% [; X9 x1 p1 u8 K/ U, w% ~
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING 3 @6 C& E# r) {* o) {
pf.dxOffset = 10;- ]* X' A0 Q: j5 c
VERIFY(SetParaFormat(pf)); ! c+ q3 P; o9 P: r9 A
常用的dwMask有
. a& M# |# o( n1 qPFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
' Z/ H/ Q6 w% |  H# `! d2 使用阿拉伯数字 (1, 2, 3, ...).  
( ~2 n  ?; V5 o# ?7 ]3 使用小写字母 (a, b, c, ...).  
- d0 T2 z6 @- c4 j4 使用大写字母 (A, B, C, ...).  5 Q7 x2 O1 d5 ^( p; l+ s$ \
5 使用小写罗马数字 (i, ii, iii, ...).  
% G: K' [4 ?* k6 _6 t" O1 l) B* n6 使用大写罗马数字 (I, II, III, ...).  # |5 z4 {% y( e5 [, X+ O
7 自定义,字符见成员 wNumberingStart.  9 L  d. l+ X2 V, }+ A/ j0 v3 r9 m4 u
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
9 Y! c  N' v* P$ tPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进3 H$ b" t1 h0 e7 @# _; z
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距) q. Z6 L+ I  ?- T- C; K$ v3 D
PFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
8 i9 T4 a9 J  }( p: l; E& k& H/ H) ~) A9 f+ y* o8 i' m
c.设置CRichEditCtrl(2.0)背景透明
/ D5 K3 P& O# F5 X* ^long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
& _# K; L# a  x* J3 V! y2 \' Xstyle &= WS_EX_TRANSPARENT;9 v- J  `2 _% L/ P
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
0 v1 W! I3 S. `  U. H# v) a: D或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
7 a" `5 S9 j) y: c/ Q/ u+ i1 z! Y4 _) X6 N6 |
e.得到内容有三种9 ?, t$ j: w, R4 ?* _/ p! O/ {5 f8 n
1)GetWindowText
' z, x0 t5 _% w. y/ N' I$ S9 g2)使用EM_GETTEXTEX( ]8 Z+ V* P" W. |- |* e3 D5 U
GETTEXTEX gt;
+ r) h! B0 d  f" H2 @* |* E3 kgt.cb = 200;
+ T2 Y7 ]- E! _gt.flags = GT_DEFAULT;5 I* [8 |8 Q! i' Z
gt.codepage = CP_ACP ;
/ {% ]" q# n* c, j2 s9 Q1 D4 jgt.lpDefaultChar = NULL;
% N5 j1 F" y/ l0 [' W, l" X. D, mgt.lpUsedDefChar = NULL;
6 T. @3 A: T% `9 K; ~% o$ t$ RSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);1 d. l% |  k8 }; f
3)StreamOut(主要用于RTF等格式输出)
# g) i1 Z- R2 v$ r: Gstatic DWORD CALLBACK , I/ t/ y+ i" B& c: H
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)* [% z; a% `. Y% [- z  v
{
1 S# N0 ]& D& G" s   CFile* pFile = (CFile*) dwCookie;& n; @  d' l2 b; ^6 [

) ^" E# E7 n( X. I% R( T3 D   pFile->Write(pbBuff, cb);* h. Y# U7 v. ~9 X
   *pcb = cb;
* G1 v! N& n9 k
- R+ p/ Z$ `. Y( F) L   return 0;
5 G/ x' E6 f& X6 I' y4 c}) ?( s% w% ~1 q; h% A5 ?

' f  F" a" |3 t$ V! X. A& E
  E3 V1 h! f* W" d! A   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
6 Q6 v( M4 u( J   EDITSTREAM es;5 r: ]9 B+ _7 V6 z. F$ I! x
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用0 B; R  ]; p+ k; @
   es.pfnCallback = MyStreamOutCallback;
! |, f& D( j. H* }) L   pmyRichEditCtrl->StreamOut(SF_RTF, es);
/ ?* ?' ~$ b: n3 {) i3 ]4 e7 i7 D读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn
" V6 ~1 Z1 @" r# y( I
1 A6 E/ r# r0 Z; t5 |' vf.查找字符串5 N& @0 D$ @+ D3 z& X9 `
FINDTEXTEX ft;
3 c6 s0 `* N1 o% _ft.chrg.cpMin = 0;- ]; L+ _7 Z4 g; J* t# i+ g
ft.chrg.cpMax = -1;) M+ h) N% K% C' ]% j
ft.lpstrText = "|";
; d* U* W! w1 C, K* V1 R7 ^long lPos = FindText(0, &ft);" X9 I% w1 R* b0 s

( c7 ?3 w6 ~$ c! t( p% x) C5 y& E如果要继续查找,修改cpMin,如
. ^( L/ O# y# {. y2 \int nCount = 0;
  B9 H5 _9 a" Q* m# Mdo4 m7 ?& d& p3 r2 A9 ~% p
{
8 U8 I+ \0 o4 @4 A* m5 w' C, E long lPos = GetRichEditCtrl().FindText(0, &ft);% I1 W4 T7 Q' l* W% i
if( -1 == lPos) break;
4 b) N' Z9 f9 k ft.chrg.cpMin = lPos + strlen(ft.lpstrText);; Y" |* C$ n* ~  K
++nCount;; e+ Q% F1 I+ C7 ~: A
}while(TRUE);. Z: i- h9 a$ ~8 V5 G# ~

# G/ _3 R4 r( K( J' e4 W  V1 @g.以Html格式保存
: g- ]1 o& b: C* T& _" x8 h. Y目前做法可先转为RTF格式,再通过RTF-to-HTML Converter
+ [- K  A$ L4 `. Ohttp://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/& j1 k* b  J/ A4 J
) I6 Q( M( X& e( V  w
h.重载OnProtected函数得到对应的消息,如粘贴等
& V' g4 I- h3 ^1 o* ^void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult), Q% N4 i7 y( M" j7 K
{& U, e7 J8 c9 @, W
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;# E' h4 [4 f4 b5 b
. D6 j. {' T- y  n: Q" U
switch (pEP->msg) {
# b3 A: T/ G6 z3 V, V case WM_KEYDOWN://按键,判断pEP->wParam
# k" ^+ a, ]# b1 Z' I case WM_PASTE://粘贴6 h5 h8 N; g: R# t, }1 Y
case WM_CUT://剪切
- H  d2 p) `  J0 z9 |" X case EM_SETCHARFORMAT:
, z6 o# o$ |; v* {( l/ V% ?- s1 x default:$ Y+ p. N$ Z" C* }6 Z' ~
  break;- A# E$ E9 B; Y. T
};
  R7 i  z8 B, C + e8 m3 K$ o$ H8 X" u6 q
*pResult = FALSE;) _- W! k. k  U
}; W3 l4 N, i- F. `
$ p! j, }* I" O* m
三.聊天常用  5 k9 a! }- p' a* S# ?" i2 X
a.LINK 链接功能% r5 }7 @4 J7 e1 Q; u7 x$ B
1.  LoadLibrary(_T("Riched20.dll"));" M! ?8 U  P" e6 w6 o/ s9 n' B1 W! Z
2. 创建RichEdit2.0控件& _3 L' v0 ?8 u& X' D& C7 m
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP& o& e4 \# V0 G
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
# |4 t% T" Q5 a/ c; q7 ?; ^          rect.left, rect.top, cx, cy,
0 T* U  L: }7 @- o1 x9 \+ T! C! v  pParentWnd->m_hWnd, (HMENU)nID, NULL);/ n3 d. Z  w! C7 Y+ L. ~" H
3. 设定选中的文字为链接显示
5 M. C1 `. R& x# w1 V: r) h7 n3 ]CHARFORMAT2 cf2;  Q  v& h, Z1 ^: {! P
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
# q6 V) h0 x% {cf2.cbSize = sizeof(CHARFORMAT2);
( b) J( V1 x: n: L) {( Icf2.dwMask = CFM_LINK;; t' E7 p) U" A. l& u- m
cf2.dwEffects |= CFE_LINK;
/ B0 C1 q, l. v  w. X) O' Nm_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);9 U& ]/ V% q% X) ]) v
4.支持链接的点击响应
, e! a1 n8 _# D- u7 S( em_cRichEdit.SetEventMask(ENM_LINK);; K2 l, X( B' w
5.响应链接的点击EN_LINK
& P2 i. L# [7 b+ |' w$ I$ S0 U. P) v
BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
* D- p: u& o- Q- v8 cON_NOTIFY_REFLECT(EN_LINK,OnURL)
/ P# |9 K$ O* H$ f5 R8 YEND_MESSAGE_MAP()
1 k4 d. ~, z; [1 s3 g" q4 l......2 z6 Z" S2 ]1 Y0 d) x3 Y) p

* i. A6 c+ @( v8 t7 q; }: zvoid CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
+ b9 ^7 P8 h( t# ?$ M0 H{
% d1 J; _+ v8 E, Z6 ETCHAR LinkChar[512];
% E* N) Q+ k" \" D- `1 c8 G) YENLINK *pLink = (ENLINK *)pNmhdr;/ ~" ]0 }! L+ Z7 r: ]: I7 @/ z
if (pLink->msg == WM_LBUTTONUP)' K6 ~$ A( [% f0 }8 X
{2 T/ g1 `/ d% I
SetSel(penLink->chrg);//这是链接的文字范围
% U' J1 o# X# k3 k% v2 K* Klong Res = GetSelText((char *)LinkChar);//这是链接文字# f/ a2 R) `* {7 ^
                  //后面是你的处理过程; C8 e4 r1 Z! i( D6 e1 Y4 N0 N
                  ......4 k, K  e, [4 d2 O2 F( O3 T
         }
# x. O7 n  C) ~. x, k- h}
% |2 q- D# o) [% r9 n& w; }; T3 b
* i) e. g8 q( R  a, Rb.插入位图
( F) q5 V' D! d+ g' B6 zhttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
# q! }4 j( F! p& m* q+ k3 chttp://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/. U+ ]$ `6 Z5 f9 L' B
$ [! D2 q% r0 K5 [; C* F6 {
自定义在RichEdit中插入对象的图标
1 U2 d* s6 U! n3 |6 w- f* Ahttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html3 K6 z4 I2 B$ {0 {. k8 f3 _+ `
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
. V" A+ m* H% g! z& j  v) d- ~( Y只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片; z; c6 ]. E5 v; k' G4 b( _
1 ~) ~+ S( J; _
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
% `( v3 x/ W8 b8 W' H5 r5 Z另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
4 N5 c. J. U, h" G% G* H7 v! g- e. V# g2 R; l
c.显示GIF动画
# Q5 E' U- V3 ]$ B" X! l常用的是通过qq的imageole.dll(也有用Gif89.dll的)' e& w4 i% M  P# Y& @
http://www.xiaozhou.net/cooldog/blogview.asp?logID=822 [6 G/ D) F! T8 I( s* R" v
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
( ^3 L/ R$ H1 |" @% v; {
* t( k$ Z1 e, V9 V0 p% R在richedit控件中插入动态GIF (Native C++版)
5 D7 B$ m- f. {" C7 b9 f9 nhttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx& a; C5 D* k8 q4 k9 f
' `+ g4 b7 W8 O, V. o) u
d.IRichEditOleCallback的使用
1 @! P3 F, [/ z# Yhttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022
; W) U+ x& C9 w; c2 t
5 r; c& b, ^+ u! D1 J7 I8 q0 J类似 MSN 信息发送框的制作(上)0 A2 d; o) j7 }' o4 {* k  E: X6 k
http://www.vckbase.com/document/viewdoc/?id=1087
$ y( p- J; K, H1 E0 \内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
4 x3 E; r* y1 D/ M
& p* }/ L) p4 m" Q! A$ @, P# q自定义 CRichEditCtrl 控件. M% Z: g, o( e) R+ S2 T
http://www.vckbase.com/document/viewdoc/?id=328
0 Z3 v- O6 @. i) s; l内容包含:鼠标右键消息,消息映射,字体变换
* @* f! e; p. Z- p3 g5 Q- c
" e5 S# t+ p$ j/ A' Y* M( k% xPS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母, u; V# J3 g/ \. f+ O) |
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778 7 N2 R, A1 K% G; R
----------------------
0 g6 Q/ u# d, z$ _; b  y比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:19 , Processed in 0.020214 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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