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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
% \# {7 G/ a6 B& ~3 L6 M( la.可以编译,不能执行的8 k- @/ A* g+ O; ^7 `
AfxInitRichEdit();+ J( o" t: @+ K* ], P% B1 y0 q
6 ^$ `! N5 p. ^8 _* L' E
b.升级默认的Riched版本(默认的有一些bug),如; k- P/ A) l; [( i& v. ^
可在InitInstance中添加
: z8 c) ]  M; Q0 E3 ?$ m( ]5 c2 i8 gLoadLibrary("RICHED20.DLL")
, C; R5 G- d6 g最后注意 FreeLibrary5 R( c* [5 y5 k  }

$ K! c: j, E+ k3 t% P如果是CRichEditView基类的可用! U+ K7 X0 T. G% J8 H$ z
BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)9 Q, F  \0 {, e/ O6 w' r
{
' a7 p& i& c4 S3 f9 o//装入rich edit version 2.0% \) E; r+ Q, N- a
if (LoadLibraryA("RICHED20.DLL") == NULL)
  k' e! q0 ^# l, t{
9 `6 L4 A: S& I( L- w& eAfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
: p# k! z# g; P8 L  RPostMessage(WM_QUIT,0,0);) m& R! f4 I% P: i  w
return FALSE;
. f4 y2 J7 @- `& W1 a+ V9 M: L4 a6 a: k}
4 f+ q2 ?# U7 N
4 c: D  X3 g9 m: y2 I5 Q" Zm_strClass = RICHEDIT_CLASSA;//for 2.0 class' ^- `  X' s& g9 l! i1 V6 t
7 `5 W; P, c, b- J6 V
return CRichEditView::PreCreateWindow(cs);
! M& V( |3 M3 j1 i9 r" F9 R. N, P}3 H4 x  a; ^, ~- d9 f' l9 f
; r* D% g* |9 c) A0 y( b2 S
c.最后追加行
9 Q$ E! [, q8 _6 `7 S' p5 ericheditctrl.SetSel(-1, -1);' J9 T" i, k% h$ {6 x# r
richeditctrl.ReplaceSel( (LPCTSTR)str );
- }$ _5 D/ r$ q. @1 D) ?8 r
3 S% E, M3 }' ~; Sd.字数限制5 y- k$ g# }2 r! I
CRichEditCtrl::LimitText(long nChars)/ z/ Z9 z7 ]. M: _

7 f, j: S$ D5 t) ge.换行切换
! Z6 [0 ]- V+ e0 T9 kCRichEditView的OnInitialUpdate()函数中加入下面两句:
8 P% B' T5 d2 f( I; ^' ^m_nWordWrap = WrapNone;$ u( N9 l7 S; s( C+ b, y0 |9 |/ o; ~
WrapChanged();
. K$ M) F" {: j& t6 DWrapChanged实际上也是调用
; ?. y$ J% N6 k/ [" k7 k+ ?% Tctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone1 b' {: `2 Z( g' V
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow# n9 J8 K5 q( t
还有不常用的 m_nWordWrap == WrapToTargetDevice
0 u1 ]& P6 I" w) Lctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
3 K( ]8 |- h- D1 p! \, D$ \; U如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return; q+ C$ y  R7 |

1 q" N, T! i/ F1 jf.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
; B- }& a) w8 m0 ]$ RpmyRichEditCtrl->PasteSpecial(CF_TEXT);3 z2 U# J$ J  A4 l- q4 t8 H

7 N' Z5 C" J: G2 `1 `- j8 kg.随着输入随着自动滚动条滚动到最后一行
& x' m/ I5 }+ s7 g; {) zint nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
. u& m3 u1 |: q# x9 `% {if (nFirstVisible > 0)
4 \) C7 ]) z7 E8 }+ {$ B4 n0 p5 v{
1 x% O, i! U- ~+ K8 |   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);6 }- j5 f- p4 K7 `
}
1 U. t# a6 Q9 @; f) e- ^) [) j4 s; w" w% t& `' G4 u- E3 y
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);. v% O# D6 b- d& r# T$ y
5 M& E8 K' g! p  c7 N0 H; u  r

( n5 Q* U* M! d0 ], n# n, H7 vh.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)0 s0 b( F6 M% |
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);9 [) z- F4 k, K  a' y
TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 / k# A8 J: z3 p6 y" S3 `6 u# R6 F0 R% q
SendMessage(EM_SETUNDOLIMIT,100,0);
7 \, V3 m! J  _  q, f
' m7 l- Q) c4 i) [, o. ai.响应OnChange1 v# G2 `$ C7 z5 l3 h0 @
EM_SETEVENTMASK 设置 ENM_CHANGE
( N8 M$ O0 C2 N. U& along lMask = GetEventMask();
1 W' Y6 f, [" h/ N8 w  |8 ~lMask |= ENM_CHANGE;
3 }. ^$ e0 r: H& XlMask &= ~ENM_PROTECTED;
; |1 j& {" k; R2 M( S  vSetEventMask(lMask);! ]$ s" F0 k! m0 c/ Q

* J8 ]0 a8 {1 H! C0 k; gj.设置只读8 G. r, d( w1 s: o2 N  @1 ~! X' r
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );9 p0 g5 d3 e" r; K# j4 s- z0 T3 s* ?
通过设置PROTECTED实现选中的文本只读,参见
) e) G5 S# t' o2 `" [" ahttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
5 f, \, I$ S- G4 R  p' o4 r
/ _' c! |6 B+ p  Q: p二.函数应用& U. T- l4 b: j* s+ b
a.设置字体(主要是通过SetSelectionCharFormat)
/ _1 w" O- w: @8 Z# h' O# jCHARFORMAT cf;# K7 @: `* t* h& ~5 t( x8 r* j
rich.GetSelectionCharFormat(cf);
" a2 ~/ }: t2 L, Q( g: _: N: Kcf.dwMask|=CFM_BOLD;
( L( ?& [6 b% w" P% |3 Lcf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
) ~9 q1 S  P8 }! I- O; H0 T$ Mcf.dwMask|=CFM_ITALIC;
+ a$ j( h* y6 e, Z; ucf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
0 S7 h; Z( v) x* [0 \5 P6 B  V0 Ncf.dwMask|=CFM_UNDERLINE;
0 z2 c9 P+ V; m; acf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;  U, A6 _( z; Y
cf.dwMask|=CFM_COLOR;" p. [! G3 U; ?4 S3 K8 T
cf.crTextColor = RGB(255,0,0);//设置颜色% z0 X/ L  f; \! o
cf.dwMask|=CFM_SIZE;
. l: M8 F5 a) X3 ycf.yHeight =200;//设置高度4 A0 q& z8 U) }2 U" l( G
cf.dwMask|=CFM_FACE;! O3 s- m, K' y5 W9 h0 X5 x+ d- n
strcpy(cf.szFaceName ,_T("隶书"));//设置字体
" J( W5 z: A' ?% E% Brich.SetSelectionCharFormat(cf);  h8 E3 K( v- U
4 J( `  J9 q  C) F( U
b.设置字体的行间距0 M3 j. }. c& b' `6 t7 y
要用richedit2.0以上
; I. n, S" q) q% [# [( |8 @试试
  N5 p- U8 ?  P7 |4 c0 J3 Q5 f0 jPARAFORMAT2 pf;5 X2 I7 r% u7 t3 S$ a- _, s# q% }
pf.cbSize = sizeof(PARAFORMAT2);
9 ]8 f! T/ Q2 ~, d- n! ?' tpf.dwMask = PFM_NUMBERING | PFM_OFFSET;
' s3 i) C8 b, W! y7 zpf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
- X- \- p; t# ypf.dxOffset = 10;) o! ~; O, G/ \4 j" g9 h
VERIFY(SetParaFormat(pf)); $ a+ _% E: K* G4 l
常用的dwMask有
% ?) V6 h! E: @1 BPFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET; c' e$ I$ h' T6 K" P+ a0 N3 n
2 使用阿拉伯数字 (1, 2, 3, ...).  / K3 U+ Q! A; x. z; |$ o& [1 r
3 使用小写字母 (a, b, c, ...).  " c2 e* A/ @) N$ |: H( ]) v
4 使用大写字母 (A, B, C, ...).  
1 Z  [" b% Q, S, J4 T8 B5 使用小写罗马数字 (i, ii, iii, ...).  
0 ]. s  j. k! o& L; {8 A6 使用大写罗马数字 (I, II, III, ...).  + w$ |) f5 q% s
7 自定义,字符见成员 wNumberingStart.  
, a7 d1 e0 m' f3 ]! \: c, nPFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips' Q! M2 N. ~5 F* g- f7 c7 d' Y2 w
PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进
& h, i1 I( }) W5 d* p. |4 R7 aPFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
% @- b$ j, I; E2 rPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距! R# w: F% u: B2 t% W8 D# u" S

1 G# o3 u% ~8 }; H: y, @) mc.设置CRichEditCtrl(2.0)背景透明
0 G) a$ d. ^2 P) Clong style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
) ]$ a* F8 q0 U7 q7 s# B7 t5 [style &= WS_EX_TRANSPARENT;
$ y, v* P& f1 w, ]/ w% t/ n::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);  `* d) s* p( z) w5 K
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上) M; @- x. q5 p; D, |6 v. o" h5 a0 B- Q
. g# M% r' Y- ?0 J, d  F
e.得到内容有三种
" y- X* {' g" f& z1)GetWindowText6 c5 A1 a5 s) J/ v5 J. H
2)使用EM_GETTEXTEX
; A" S7 F8 n4 W0 k8 AGETTEXTEX gt;2 q6 c# Z  Q2 M9 q
gt.cb = 200;
1 o$ ]! R, m2 h" `7 ngt.flags = GT_DEFAULT;/ G! G! |6 d. z9 q# w6 Y
gt.codepage = CP_ACP ;
& e3 H+ j9 D' ^# F5 d7 ]0 N9 `# Jgt.lpDefaultChar = NULL;
" y# X! K  M7 U& A3 _gt.lpUsedDefChar = NULL;
: s, H9 E* q! U0 X) F5 NSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);( S0 d* E' u9 |7 j$ c: o9 k) q; k
3)StreamOut(主要用于RTF等格式输出)
. ^- B" ~; Z6 @$ n4 G" p5 l( Zstatic DWORD CALLBACK
  n$ p8 H4 ~1 R2 {2 u) r# q& EMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
) |% ^+ \3 t$ k% }3 O& o% c3 o{4 `; b! h6 T, v3 j- n
   CFile* pFile = (CFile*) dwCookie;! A9 r- U4 J2 ~
9 }* R# }+ A5 d8 W; d; a# H
   pFile->Write(pbBuff, cb);
/ {% W' `3 t# ?- x1 D' f  L   *pcb = cb;5 `" F; y2 z& ?2 F. e

* u. S3 R; X$ R% R+ L   return 0;. q# h/ A' T* i6 I2 m) j7 m
}
# ?' r5 A9 d; Y& T; V9 k9 @: z  F. ~+ @7 {3 D- V

& T8 M/ w! ?0 i9 T% |# y   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
& O2 |+ ?8 Z: w8 h" c9 h- d5 f. l) ~   EDITSTREAM es;" r7 }3 x/ c" n  A
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用0 m, c) j, H. B; D: c
   es.pfnCallback = MyStreamOutCallback;
: [* E- h$ H( ^7 S% y# x6 b   pmyRichEditCtrl->StreamOut(SF_RTF, es);. [2 X9 d. A8 R" @
读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn9 k3 y* v, Z0 q' i
5 _7 ^" G& q, s) c% U
f.查找字符串1 W* T% y. o) w& m
FINDTEXTEX ft;% X2 m2 X1 n0 W3 P
ft.chrg.cpMin = 0;6 a: g. P! Y8 u! {5 C5 A
ft.chrg.cpMax = -1;  o% `1 x1 w5 J- k
ft.lpstrText = "|";7 w# S) W4 T0 V
long lPos = FindText(0, &ft);, H1 V4 d8 i) l, C

, B; Q% E' @. b+ ?. A4 |- _如果要继续查找,修改cpMin,如
, e: A8 _* h! V! V# h4 a" Cint nCount = 0;; E. F# b( r" U/ T3 J) K# I7 k
do! D8 W' [, L) i
{
- }5 W& R7 P0 ^: R# U long lPos = GetRichEditCtrl().FindText(0, &ft);6 k0 M" _3 S3 Q$ t
if( -1 == lPos) break;
+ B0 b. m2 ?; d5 ]! u ft.chrg.cpMin = lPos + strlen(ft.lpstrText);
# D  A+ i9 L; C7 { ++nCount;
% Q6 q$ a+ y2 R6 T0 a+ B% I2 a}while(TRUE);
8 Y7 r0 \) M8 D" F  o9 j+ G( q
& P. {& K$ q" X8 w+ K0 H0 u( ag.以Html格式保存9 J6 ]7 s4 x" H* ^
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter/ T1 o- u; u0 G: d) I8 n3 _
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/7 V' S, Q$ o" p/ L/ {2 V  J

, z( Q, Y/ c+ Ph.重载OnProtected函数得到对应的消息,如粘贴等
0 z, h: P+ u6 d2 J0 H, J! R/ [void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)+ e; f* d: J) l% G. D
{* b3 C& \$ }3 x& B# i0 q6 V; s
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
# O5 ?* E9 K- ]; b. O7 i
! e+ S* _: i2 j1 T/ M switch (pEP->msg) {& N: D1 r9 G$ Y+ B6 c7 X8 Q, E
case WM_KEYDOWN://按键,判断pEP->wParam
! T; i1 d! f1 X1 S% s case WM_PASTE://粘贴7 E  i% L+ R8 e3 Y. N/ n5 \
case WM_CUT://剪切# G) y0 U. o; ^* q& k
case EM_SETCHARFORMAT:
* m6 `9 }6 |; M* j1 F7 y default:( u- _* |/ z3 P" X1 i
  break;
% {) \0 H9 H& v" I1 F };; u7 d- i  I# ], h# T' X+ p

+ _9 u5 O* B% |; t  u% ]3 X- C/ X3 \8 { *pResult = FALSE;
+ y% ]( h4 p3 M2 U1 }; a5 r- w4 h}
7 g% L$ b( T2 e# E8 e! C
+ [8 t& \* D' J3 g三.聊天常用  
. X0 {- S& Y2 A; t$ f' aa.LINK 链接功能  T$ b* K6 Y0 `& `, @
1.  LoadLibrary(_T("Riched20.dll"));/ e9 O3 b3 U  @" s
2. 创建RichEdit2.0控件
1 ~/ }) j) r! b/ ^' ]/ S. i- c# s CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP1 h1 s$ y0 @$ w; G- g
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,  F* @8 E8 i6 {% S0 Q
          rect.left, rect.top, cx, cy,; O# g  |1 q" ~# |# ?: h1 B) O
  pParentWnd->m_hWnd, (HMENU)nID, NULL);7 B; }: p3 J8 J0 o
3. 设定选中的文字为链接显示" r. j- f  T" z$ P0 Y! `& }
CHARFORMAT2 cf2;
. Q* N; ~' G$ u  M" v/ m3 Q+ }ZeroMemory(&cf2, sizeof(CHARFORMAT2));//' B! c" z( r" f+ \: w/ j
cf2.cbSize = sizeof(CHARFORMAT2);9 H" U' V7 G& z6 B9 c& b
cf2.dwMask = CFM_LINK;1 a8 q6 F4 i& k& ^, ~% w
cf2.dwEffects |= CFE_LINK;& C+ M, Z2 h) r, X) ?+ O) H! I
m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);1 \. O3 p+ G6 s2 g: z7 x! \
4.支持链接的点击响应
2 s( o, o6 ?6 m4 km_cRichEdit.SetEventMask(ENM_LINK);
, P' g/ H) P" y( I1 v% ^. Q+ P5.响应链接的点击EN_LINK- g- c  w& i0 i- O

6 d  ?( A5 O9 r- z, p# u0 ^4 i# NBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
: X% H) V$ _7 Q, pON_NOTIFY_REFLECT(EN_LINK,OnURL)
* m5 ?0 G7 w: Q% _END_MESSAGE_MAP()
5 F& n4 A; j, w4 Z+ Q......
) n/ S/ D" Z. _0 \2 s. H9 ]
; Y* f: e7 P' X3 ^( vvoid CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
6 J, h* d7 V- n/ r2 x6 W{
- E: K, u( G" P" R2 T! q8 B! RTCHAR LinkChar[512];) {: r, K7 Y. l( T3 R; |$ E: h# S
ENLINK *pLink = (ENLINK *)pNmhdr;
- q' c+ u& _7 vif (pLink->msg == WM_LBUTTONUP)
2 g0 k- H8 T& Q2 z' m6 t{2 b; f3 K2 s0 ?4 T, J7 V" z! f( u
SetSel(penLink->chrg);//这是链接的文字范围
: e0 Q- ^7 `1 k3 ~2 u/ x) klong Res = GetSelText((char *)LinkChar);//这是链接文字. u  M. d' j! k) @' h
                  //后面是你的处理过程# A6 d; V& G0 A
                  ......4 R( v' D) p$ L( l" G
         }9 V# `3 g9 n+ u& q2 w$ ]; S
}* @' f8 d. ]" K- ^0 N9 v

& j, e- {" d( N+ Lb.插入位图
7 C  J7 x5 q3 V! y  J, Yhttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
5 a6 t. z  V* l/ d% d2 e" e/ N: @& H7 `http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/8 ?; i1 ~* C1 p$ O6 x( E

, \! H0 n: S' A- b# ^4 }  d自定义在RichEdit中插入对象的图标' R9 s7 h- D6 x5 s/ D4 e' e4 q" v# @
http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
0 A1 [( ^1 x: p方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
" O+ f. \' i0 Z. C  g  {7 t只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片
, ~, V0 Q6 \) G. U4 z9 R" Z' ?5 V0 P# Q' R2 w
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。. k$ f2 I: \5 b: {
另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
$ G4 E8 H+ g& g
/ G6 j' Y7 o9 i# m) u$ C7 rc.显示GIF动画( \2 ]; t* Q* R0 c: H2 Y  n
常用的是通过qq的imageole.dll(也有用Gif89.dll的)
- `: z+ b* r# x, ?: Q; x  D) @7 @http://www.xiaozhou.net/cooldog/blogview.asp?logID=82$ A% d, y2 i% Q1 T# |( {) T( Q
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
4 e1 _. a* _5 z  B( u2 V3 V$ x6 F( O! W- ?( o9 c5 u
在richedit控件中插入动态GIF (Native C++版)0 b" {7 B, Z& a% j- J& I
http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
4 s& b! ]  w& G8 c
# E8 u+ {$ T7 S2 m8 Jd.IRichEditOleCallback的使用* t; b- i7 E" l. ~* Z
http://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022, b" \, O3 A. Q9 n( b; A# o

7 l' a0 C3 C8 {; X类似 MSN 信息发送框的制作(上)
( P4 t! H" {  ^# h$ x. [2 Thttp://www.vckbase.com/document/viewdoc/?id=1087
4 ]/ f% @  s  U: B' X内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
0 K- _, l! b7 J4 s& r$ e1 ^! V7 D7 G; h( p; A
自定义 CRichEditCtrl 控件& R& j3 f! L7 d8 z3 \
http://www.vckbase.com/document/viewdoc/?id=328# ?! Z% {3 n- e9 D- H' G
内容包含:鼠标右键消息,消息映射,字体变换6 H, \2 {6 z) A
/ _+ ]& |) U( |1 {. E% g
PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母
- \" R) w  _5 |3 \% e是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
' D9 t' a' d" H/ h----------------------7 a. f% j! j* C: _/ b4 q! z. x
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 09:00 , Processed in 0.021556 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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