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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
% B# c6 K8 `; j- J& k7 I  k! ka.可以编译,不能执行的
) `# G" X7 t2 n8 h$ BAfxInitRichEdit();
- V: O3 C, k9 N: ?4 v0 O6 H) {- D! p/ D
b.升级默认的Riched版本(默认的有一些bug),如
  N4 v) A+ {3 ~0 a2 M可在InitInstance中添加; c1 v6 a3 C; U" t1 p- S+ p5 _
LoadLibrary("RICHED20.DLL")
9 Z& v' Q7 D7 y, K最后注意 FreeLibrary
9 l5 U+ L8 x  {) _9 o, c2 I4 F: k6 Z+ \
如果是CRichEditView基类的可用
6 M6 D6 W, ?3 N5 c: C- ~BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)8 G+ |1 H9 V$ i! U; H
{
# a5 a" n/ ~) p2 A$ c) P//装入rich edit version 2.0
0 Q. g' `9 Y3 s) Yif (LoadLibraryA("RICHED20.DLL") == NULL)
# E! ~! h) B1 j8 J; T{
$ a* c1 m8 u0 {2 |AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);/ }& O& y' |: _/ \) o( |2 ?
PostMessage(WM_QUIT,0,0);
1 C; _! z- B+ |! p% \, nreturn FALSE;
: z; O& W$ J6 r/ Y}( d" \" G# s. `4 L- i" d

* z5 o. M. ~* d$ d5 im_strClass = RICHEDIT_CLASSA;//for 2.0 class3 t8 v$ i9 ~) P8 F* }7 m( M

# t7 r- M* Y$ F5 I2 hreturn CRichEditView::PreCreateWindow(cs);
2 k! a1 s! ]7 `# Y& G- p2 B) w}# o( t( w% X+ d5 [3 h* ?
  V8 f6 |. r: }3 s/ @$ g- v  G& H
c.最后追加行
" C9 y$ L4 ^: H8 E; lricheditctrl.SetSel(-1, -1);2 t) r, p) [  X: _* d) E$ O  @
richeditctrl.ReplaceSel( (LPCTSTR)str );- K% G1 f; g5 @- W0 ^% G$ S
( @4 f: l; S& H7 |# F
d.字数限制
/ l  Y- p6 ]. {  T5 s/ D! J. Z8 ^CRichEditCtrl::LimitText(long nChars)  F  N) t+ r5 R1 r2 K9 N* D2 C2 L8 ^
' ~( D9 `! v  `5 o6 X
e.换行切换1 Q9 y) U0 P$ S* h0 M  A% ?, z
CRichEditView的OnInitialUpdate()函数中加入下面两句:
6 r1 r* S3 [9 Z; P( Um_nWordWrap = WrapNone;
. A2 V1 {+ f& ^8 s2 H& KWrapChanged(); 2 e! T5 T5 u) j* @
WrapChanged实际上也是调用# y' X  }  `6 m0 ?
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone# h, o. t$ ^$ J( Y
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow9 m8 G+ P. d3 k! s
还有不常用的 m_nWordWrap == WrapToTargetDevice/ ^$ W( |8 R2 g& f9 J
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());1 G% @3 l+ |6 F
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return" ]7 A) b- a3 c7 ]
) u' b+ X+ @1 F4 l
f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
* r6 ]9 L& C3 v% ]2 p0 `* r6 a: K3 hpmyRichEditCtrl->PasteSpecial(CF_TEXT);
. _3 K6 B. \: P' n1 u
( z0 V: B% c' j* ~g.随着输入随着自动滚动条滚动到最后一行* `  j: n! z; T+ f
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();% T1 z: _/ @8 D4 H
if (nFirstVisible > 0)% N5 a9 h% x9 U1 P. F
{
' T, E9 k" s3 M: A% v   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);5 Z7 m7 X7 p; J2 }
}
" d$ Z% P8 e! `0 @1 k3 m4 p+ |7 E2 O, n2 A# {
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
; j  i' U, |$ s& f6 @" c9 P" f) @
. t1 M4 v8 \$ }; S3 t+ j* v" x
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)7 E% Q* ]; ^& x
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
4 Z* k8 t0 F: ]TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数
/ m# L+ O; f% r9 r- XSendMessage(EM_SETUNDOLIMIT,100,0);. R1 m- I* v0 }2 s

& j3 {6 }  l6 J, x: j: Vi.响应OnChange3 _' f/ R& n# q
EM_SETEVENTMASK 设置 ENM_CHANGE
9 k3 v. G2 P4 k. h. V' Dlong lMask = GetEventMask();
! _+ Z+ T% N! V+ j3 ~  |) llMask |= ENM_CHANGE;8 `& C* v* f! ^: f+ [5 J) O5 z& w5 n
lMask &= ~ENM_PROTECTED;
: n( P5 i7 @) O% n8 ZSetEventMask(lMask);$ s5 W& x: @5 k0 n4 \) w
# U/ M4 P5 y) B
j.设置只读9 \. g7 U9 O8 `( z( T
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
, [, b: S. ~8 f9 \1 q( l通过设置PROTECTED实现选中的文本只读,参见
6 J" ?; E/ k8 [# B4 d8 T6 u& @http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
- A3 e0 O% p1 ?( i" ?- f3 i9 X- }8 r/ O& B
二.函数应用
/ p1 l3 b1 k- pa.设置字体(主要是通过SetSelectionCharFormat)
( o5 D: t/ x1 n% DCHARFORMAT cf;
6 S- _2 b- Q0 |( X7 w4 u: Yrich.GetSelectionCharFormat(cf);8 Q$ j8 X1 j  R/ p- T
cf.dwMask|=CFM_BOLD;* O7 G, [" I7 h4 E7 ]+ j
cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
7 |$ K0 x( J5 M+ f; k# d: ^cf.dwMask|=CFM_ITALIC;
" y- X. Q& _6 E9 d7 S! J3 P0 l7 ?cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
3 i7 o& J; m1 [" o" ?" Z) Hcf.dwMask|=CFM_UNDERLINE;+ V# c6 c) G! f* @/ d  I: u+ L$ ?
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
3 _# N5 J3 g1 U; B- S) [( Lcf.dwMask|=CFM_COLOR;
, m1 [; M/ `$ v, ?: v  [+ `cf.crTextColor = RGB(255,0,0);//设置颜色
4 y% @3 k! j1 P+ ?% lcf.dwMask|=CFM_SIZE;
3 ]! m- P. Z' o2 r$ tcf.yHeight =200;//设置高度
: ?0 ~( i3 D; I# `cf.dwMask|=CFM_FACE;
: h' e6 d! w3 e: [strcpy(cf.szFaceName ,_T("隶书"));//设置字体" l# z# W8 A# A2 O. D
rich.SetSelectionCharFormat(cf);6 p' ^2 O' b; K& r0 a, W

' F) A; P5 S: i: |2 N" J% Rb.设置字体的行间距$ k' j' u1 L# a9 a8 w) ]$ q
要用richedit2.0以上5 r3 N6 Y' t( F, V0 ~0 N" ]% }3 o
试试
( N5 r/ _+ R2 LPARAFORMAT2 pf;
" ]6 O4 }8 T; Z2 F( ~2 E+ ipf.cbSize = sizeof(PARAFORMAT2);
3 u# e+ \, y2 c, X3 apf.dwMask = PFM_NUMBERING | PFM_OFFSET;* O: _8 A4 Y& o/ v5 b2 m
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
1 w+ @- T: O. H2 {+ D0 O( |2 ipf.dxOffset = 10;+ S( d; T. O6 u9 L
VERIFY(SetParaFormat(pf));
7 j3 W1 r2 M( S7 A' Z! i0 J常用的dwMask有
1 L' R/ B3 |/ z! S( T6 K3 u+ r2 QPFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
! Z8 F0 }! a4 X$ u! e# g2 使用阿拉伯数字 (1, 2, 3, ...).  $ _+ m9 t5 Z5 ^* R$ z
3 使用小写字母 (a, b, c, ...).  
/ d" }% m1 f, v1 I4 使用大写字母 (A, B, C, ...).  % s$ }3 K; c4 G9 ~
5 使用小写罗马数字 (i, ii, iii, ...).  * D$ ]7 a7 m5 h) k
6 使用大写罗马数字 (I, II, III, ...).  8 F0 h8 @( b3 l3 D1 b' o& V' F
7 自定义,字符见成员 wNumberingStart.  
; i' {3 `5 N3 {! b: [5 \PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
/ m5 F7 Z1 }* b9 V, s* y  N. |PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进
! @* B7 z+ @3 a4 s! l. BPFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
$ Z8 i5 S% O: M' ZPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距) F. j5 o# J7 r4 ?  P
! ~- g: w' g: z/ p
c.设置CRichEditCtrl(2.0)背景透明 % e% r  W9 Y! U" d
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
) \1 u: L, J( k2 g# F; k  vstyle &= WS_EX_TRANSPARENT;
) Y( Q+ t, c4 a) C::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);: t2 J0 A) c  d9 R7 y, _
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上: w2 A5 _! n8 j5 S9 |8 s
8 c9 g8 b4 n8 m0 C
e.得到内容有三种
* ?. q8 G" O' f$ x. x7 X. c' x2 [1)GetWindowText% i5 A$ b; g: E7 ?4 L6 x# u
2)使用EM_GETTEXTEX7 o5 ~5 X& q& f( t* ^
GETTEXTEX gt;( z3 T' v; W, L
gt.cb = 200;% ^- h, i; H' \/ _" K
gt.flags = GT_DEFAULT;8 ^4 h3 F& |% `% z8 q
gt.codepage = CP_ACP ;
+ L: Z4 c+ v( p6 D$ qgt.lpDefaultChar = NULL;
! t# n0 l0 {# pgt.lpUsedDefChar = NULL;
: w$ E  u! n$ T/ C4 L. ySendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);0 T6 d) A' i8 _& w
3)StreamOut(主要用于RTF等格式输出): V3 V) V9 ^) W# T
static DWORD CALLBACK & v' t1 w& u  a  T6 X& \
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)7 q& t1 k  z& N# q! X- G# Z# u
{2 v: e# F+ v4 v* G9 C' U. _
   CFile* pFile = (CFile*) dwCookie;
- h7 Y3 T0 `9 |& M+ @/ ?2 x: C5 H% o& v4 `: b6 Q
   pFile->Write(pbBuff, cb);
+ F% h$ k0 w' W- |1 K* V6 V$ i   *pcb = cb;( d# Q, I# o0 y" N
1 A( ]1 `8 t0 ~- Y* `( r
   return 0;
) g7 J9 Q; \/ a$ I$ N& O0 X7 |}& {! Y% x  N: A
5 l0 K9 |( G1 L" ?' M$ S& v

0 d, _; }) ^$ N   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);! z% f- N) ^( f: y) V
   EDITSTREAM es;3 K( V* g& ?9 \7 d. `# d* ?
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用: X( E$ g5 J9 V" y: F8 q  L
   es.pfnCallback = MyStreamOutCallback; 3 k) x2 L6 r" r' A" b) a7 g1 C
   pmyRichEditCtrl->StreamOut(SF_RTF, es);
6 T/ w# J2 c! i2 R读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn( b1 A' ~: l& C8 O2 [$ A: g8 n
2 W0 J1 L7 g) x$ {# A5 a9 A
f.查找字符串
4 P& U7 c9 [$ o% C) _# g  R) c( KFINDTEXTEX ft;4 x) O+ Y7 Z8 M
ft.chrg.cpMin = 0;: Y# @  K5 x7 u
ft.chrg.cpMax = -1;
! ^5 f5 r4 Y% s8 Lft.lpstrText = "|";
. e) {# I7 |& N; Slong lPos = FindText(0, &ft);5 A# v& o& _0 Y
& ^& o4 ^5 C, ~. x# B$ b4 ^' ^# ]
如果要继续查找,修改cpMin,如) p; f7 x) V5 z5 I% o
int nCount = 0;2 J5 B6 m) `- u
do
* S+ {$ r* R' g! i+ i{
5 B& b  q( h& C long lPos = GetRichEditCtrl().FindText(0, &ft);
. J7 B( M: v8 i  x; M$ ?6 A if( -1 == lPos) break;
2 B9 F( S7 [7 d6 w0 ]) h8 Q8 N4 d ft.chrg.cpMin = lPos + strlen(ft.lpstrText);+ P( g# c7 [8 D0 k6 a6 K
++nCount;  k7 t& n$ L/ C& r+ R% n/ X
}while(TRUE);
5 ^8 Y  W. W  u/ t9 n
: V  ^( j& u( t; X$ @0 ^g.以Html格式保存) ~3 o! I, l$ H3 Q' v3 b; ~
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter: k2 Q; Y4 y) F. B, q- L7 f8 `
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/
* Z7 g( i9 n- `) x" w
5 L$ C0 b/ r6 \3 wh.重载OnProtected函数得到对应的消息,如粘贴等" [: s+ }3 N% x* [
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
7 K$ O! V* o8 I9 G8 K% e{
  d: I8 i/ n3 [6 ?+ Y ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;  A" c, T6 o3 S" X% G" T
- R2 }% t% i, l' \; R9 f2 |: _
switch (pEP->msg) {) _3 i: w: h% N5 j, Z
case WM_KEYDOWN://按键,判断pEP->wParam# |& z  ~+ }  G* o2 V' I, q/ F! t5 m
case WM_PASTE://粘贴- \9 {" u( N, [0 g
case WM_CUT://剪切
5 ?" t8 |6 |3 j8 E" Z: T7 P9 j! ` case EM_SETCHARFORMAT:# w6 S) P& t/ V8 c
default:
4 k: {9 }3 u- m1 `( s$ b  break;) A3 B3 e( H8 U4 x- w4 @) W
};
, U" r; |5 S* T3 Z9 L % Q! D2 A' y+ i; x! T/ Y9 T
*pResult = FALSE;
- ]" d+ x  ]* O0 G9 H! N) e1 T}& y& q* R- C$ m

3 M% i/ E. D; Y  U三.聊天常用  8 p' a" o& W3 i$ y. p0 I7 o  `
a.LINK 链接功能
# c7 h2 ^$ D2 p; @# f1.  LoadLibrary(_T("Riched20.dll"));
  y0 g# N1 K( ~% o/ X( R/ T2. 创建RichEdit2.0控件
, q5 Y' ~$ Y3 i CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP7 f4 J/ i( x- O2 R
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,  M9 |" U7 G$ F& p5 Y) \* H* b" t  T: w
          rect.left, rect.top, cx, cy," t/ \, x( d1 n! A4 @4 i
  pParentWnd->m_hWnd, (HMENU)nID, NULL);9 L3 a& }" n6 G* ?" K. ~" X) T
3. 设定选中的文字为链接显示) V1 ?  G5 Y8 q% ~2 L0 F9 Z& o
CHARFORMAT2 cf2;
" P9 j1 J! e( q1 M( K$ E6 YZeroMemory(&cf2, sizeof(CHARFORMAT2));//
; U/ m1 ?4 x& S$ Lcf2.cbSize = sizeof(CHARFORMAT2);
1 }7 b; z' `" ]% f, U; zcf2.dwMask = CFM_LINK;  U1 B5 I; X! _! L
cf2.dwEffects |= CFE_LINK;
6 _* u7 Q7 ]5 [2 B& I  |5 Ym_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);8 D$ \0 f7 I7 @+ r0 f1 ^( E0 p
4.支持链接的点击响应
9 Z6 k0 x5 q. s3 B! V/ O& Um_cRichEdit.SetEventMask(ENM_LINK);
3 o( R0 t. U- y4 G  p3 X5.响应链接的点击EN_LINK
- x6 B# w: Q) a6 ?' W
/ s9 G" h* s2 h- f0 W0 L7 yBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)$ p  @. u; e5 c2 ^6 `
ON_NOTIFY_REFLECT(EN_LINK,OnURL)
" Q2 S+ v- Y6 V; S+ _2 B( j& Y' REND_MESSAGE_MAP()! m3 K  }0 z5 ]' }! f
......
, b! S8 w* x1 x& P. z' Y9 K0 w) x6 i7 ^6 \, w7 d. D* n: F! |  C$ [
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)% M$ Q8 o. r( e' f' F: H) T5 G
{+ f. v, m' V& ~  d* r, R& S
TCHAR LinkChar[512];4 V3 t, k" g8 `. V5 x; Q- r
ENLINK *pLink = (ENLINK *)pNmhdr;9 U1 n( H4 C0 c7 t0 Q
if (pLink->msg == WM_LBUTTONUP)
/ g. e5 t. b; p{
  r3 C+ \0 R: P; F7 l( V+ O+ rSetSel(penLink->chrg);//这是链接的文字范围+ n$ l( Y; O) [7 ?+ W9 I
long Res = GetSelText((char *)LinkChar);//这是链接文字
  f  c% [/ T4 B  f2 j+ ~% U: R1 F" F                  //后面是你的处理过程
) N5 A9 C% t8 ?+ X) Z9 [4 h" n                  ......' S3 f7 ?8 b' |0 t- J6 y. `) O
         }
7 A; Y) k* @$ r% C3 p& v7 d* A}
, ]( z' ~! @( i7 ]2 ?; c6 I: \; R3 L
b.插入位图
) F/ b; I8 e! m. |  Qhttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/+ S! f2 o, B  n6 Q
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/- ~/ s6 ], X4 D! Q; [; W

' v/ r2 W2 f+ ^: e7 _自定义在RichEdit中插入对象的图标
- X9 S' a0 a. U3 T1 }http://www.blogcn.com/user3/jiangsheng/blog/1319738.html$ j% X5 ^7 N0 j/ r+ I7 C
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
/ M7 D! w' w! \* e; |) _' t2 k只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片
  s0 f. k7 E* z. W6 v$ g& R
5 a0 X4 p/ O+ A6 ^5 L) V使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。6 ?* U) i! |& e9 @
另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
( V) u9 X/ D3 q- ?
! }( w; V3 g2 ?8 S9 A; W6 bc.显示GIF动画* G. j9 ~4 {; n- Q7 q
常用的是通过qq的imageole.dll(也有用Gif89.dll的)
5 ~' Z& }/ u4 ^  o  }3 q5 j# r* Uhttp://www.xiaozhou.net/cooldog/blogview.asp?logID=82# T$ W1 @# A0 @
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
/ C/ D. O, s' @$ e2 w5 g6 E, Y3 H; @) K0 E$ u/ ?1 A( p) U
在richedit控件中插入动态GIF (Native C++版)
* i2 @% H( E& J; Xhttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx2 {7 h5 n( z" F5 o+ B
8 f" J; J+ {  E0 e/ e: W
d.IRichEditOleCallback的使用. e5 u/ n) H/ C% l, U' u) M0 {9 u
http://61.186.252.131/Expert/topic/905/905844.xml?temp=.83790229 h9 o/ p! R+ C7 S
* |6 K- ]' r8 D) N
类似 MSN 信息发送框的制作(上)
  q4 \7 s( Z. a& a+ s, t: \http://www.vckbase.com/document/viewdoc/?id=10870 h# L3 |8 J0 A' k
内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串) J7 y& c' u) F2 l; o' Q4 @9 W

, Y- d& J* t1 Z0 B3 u5 X自定义 CRichEditCtrl 控件+ D. `' E" y+ O% F0 x
http://www.vckbase.com/document/viewdoc/?id=328
8 U) y5 H& e/ }' K5 k. A内容包含:鼠标右键消息,消息映射,字体变换
2 Z! l9 ?6 Y. X1 u
% m+ I3 P- \2 Q) e7 j" _PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母. O! Q; t6 f1 ]
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778 6 i( a8 {9 m1 j5 n5 i. L1 p; t; _
----------------------
' X1 v. P6 k! I3 x/ ^比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-20 04:16 , Processed in 0.038298 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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