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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
2 g! N! `  {7 k& c. r  J( S7 |a.可以编译,不能执行的
0 ^+ k% t2 X5 K+ H# K% B2 k/ c5 CAfxInitRichEdit();' T5 C4 [# ]0 \- \4 B
: Y# |) f7 i9 m. V9 c/ Y6 s2 L
b.升级默认的Riched版本(默认的有一些bug),如% {. Q# b, `5 {( w# M/ Y
可在InitInstance中添加
7 C: p$ K$ l; }# ?% u! n9 wLoadLibrary("RICHED20.DLL")
( ?$ r7 W) ~4 V- y, N" `  Q1 q最后注意 FreeLibrary
5 b2 n" A4 [& Y+ F) l4 E4 _4 g  H# `0 |: f
如果是CRichEditView基类的可用+ w( a- s; y9 E- B5 d* H
BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)3 ?2 u3 ?5 K' Y+ i: I- _/ B5 s. w; ^
{
1 U6 p5 Q0 n4 ?3 w* m//装入rich edit version 2.0
2 H+ A" \5 H0 _  t6 l$ }if (LoadLibraryA("RICHED20.DLL") == NULL)
& \( y/ e+ y0 x( G, C7 e{
7 P; O/ O: d  YAfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
5 l( R6 G2 `2 d: h7 w# n. W2 [PostMessage(WM_QUIT,0,0);
% v) |3 L( I. E0 P9 b" ^return FALSE;
# a& ?7 G/ e+ c8 O; K; U/ _; ]}1 Z( b8 ^: {" {1 ?

7 h) I9 A6 |! k5 |m_strClass = RICHEDIT_CLASSA;//for 2.0 class4 B6 J: N9 @$ s1 ~3 L% A
8 O3 x% @$ C' Z/ Z( K2 ?
return CRichEditView::PreCreateWindow(cs);' l- p( m7 P  u! o. v  b* L
}
0 B' s& v/ U9 M& b' o' @
; s# y- |" N  g# {% Lc.最后追加行
8 h$ t7 N% V% Gricheditctrl.SetSel(-1, -1);
" [8 I2 s, f, nricheditctrl.ReplaceSel( (LPCTSTR)str );0 q" h6 e: r: T& S
, Q, e1 w. x1 y9 y0 R5 l0 N  D
d.字数限制
  g* g( A; r9 A# B; ]' s# KCRichEditCtrl::LimitText(long nChars)' o- m$ n) T( F; H' H. o3 z

- J* @& k7 q) d7 Qe.换行切换
( Y9 [8 F' {7 I$ N& V& }( O- l; qCRichEditView的OnInitialUpdate()函数中加入下面两句:
3 H- z1 P0 @" L3 u' J2 N: Tm_nWordWrap = WrapNone;
4 B8 m( E) ~1 x$ {" E( e: ]3 ~6 gWrapChanged(); 5 o  k# E& X. G6 b- M6 S
WrapChanged实际上也是调用
/ o( @: e( z/ O9 x2 Wctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone  w; b) L" P! ^7 s+ P" z9 {
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
& J! Z( W& R. k+ l+ e" u0 D, G# n还有不常用的 m_nWordWrap == WrapToTargetDevice
% E  c5 w9 u  b2 \" }( a% ictrl.SetTargetDevice(m_dcTarget, GetPrintWidth());, f9 G) w( k' ?+ F/ E6 C
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
! E4 ]! {0 o% a, l- v* i+ H
; L6 o( F+ ?' J4 e* ^f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
* ]+ h1 L# H  UpmyRichEditCtrl->PasteSpecial(CF_TEXT);
9 S; n0 Q* P8 F9 q
) S; G& v0 `+ t1 U" }4 t' O) hg.随着输入随着自动滚动条滚动到最后一行
2 y7 _( `( b/ N- Aint nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
8 }( _, F5 d/ s' n. rif (nFirstVisible > 0)# t. c; n/ i. C: l. Y
{
0 w7 l' m* |; q& g* M   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
: ?! [; j- p. W9 d, N}
: f) W1 l  b# R' k6 s0 y5 Y' |8 c! W( N: m4 V4 ?. Y
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
. D* a; X/ R2 [. O8 Y) N
6 }& @3 l# e4 y, Y1 M  R7 V5 f4 b# \5 Z; \" r" l9 G
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)! ?' Z  I3 A! T9 N+ K7 o
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);: i& b: N1 z: K( _% a1 x
TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数
+ T8 H, z4 S  M/ ]$ u2 S6 JSendMessage(EM_SETUNDOLIMIT,100,0);- ^- h+ D* h* K7 E

0 K  m+ @: W! r0 w. {& z% a9 gi.响应OnChange" e  ]( I7 k% [, `
EM_SETEVENTMASK 设置 ENM_CHANGE
0 q# m6 t* w4 K6 flong lMask = GetEventMask();+ [, r/ ^" R+ o9 b
lMask |= ENM_CHANGE;* b: h9 g. i, R' t6 [
lMask &= ~ENM_PROTECTED;
3 p8 b' q, N; u( P( a, d8 t: RSetEventMask(lMask);
( m7 Z( h  i  }$ a2 H- d1 P$ Z+ U% ^
j.设置只读' z- i4 y) c+ Q7 f: y" \$ J8 A# C8 I/ P& R  ~
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );# ]/ s" W1 B9 r6 D" T/ E
通过设置PROTECTED实现选中的文本只读,参见
& o, G7 c$ l  E% X( R. Q! whttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
' |- x0 g8 W" F$ u) f$ u9 A
2 B, {6 n% u1 F) i* R- Y二.函数应用
3 h7 @* n8 k) V/ Ma.设置字体(主要是通过SetSelectionCharFormat)- L$ Q/ N9 B! o6 E* j
CHARFORMAT cf;0 n1 ]& E1 P5 b% R$ X& z  y* l0 w6 b# w
rich.GetSelectionCharFormat(cf);
- ~: n# s* s: W1 Dcf.dwMask|=CFM_BOLD;0 t0 _  X& {$ f3 u" r( ^
cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
! W' f$ u+ K2 p, h3 L: `0 Dcf.dwMask|=CFM_ITALIC;: J% i5 q8 {8 M2 c. ~* W- c9 D: \
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;. z* T- I$ n$ M" n$ M
cf.dwMask|=CFM_UNDERLINE;) D* X+ v; ]) T! m% C% {
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;) _) V# k: ~/ U! R* T) [" h- `
cf.dwMask|=CFM_COLOR;5 R' P; W; J8 j+ T, w
cf.crTextColor = RGB(255,0,0);//设置颜色1 J) S5 u4 b  t- f
cf.dwMask|=CFM_SIZE;7 d5 ^4 W; b6 l6 ^
cf.yHeight =200;//设置高度
8 |0 X% d5 u- Qcf.dwMask|=CFM_FACE;
8 S  N) l/ A* {# gstrcpy(cf.szFaceName ,_T("隶书"));//设置字体9 N1 T: l- j# i, U- H
rich.SetSelectionCharFormat(cf);
8 g$ E, b: e! @  @$ X7 n2 f, s8 M+ y# y+ Y) r" k
b.设置字体的行间距* y- ?! U8 a7 Q: i+ E2 s4 c, \
要用richedit2.0以上8 {  _! u' j5 D: w
试试( }5 w7 }% G! a8 T* R! k
PARAFORMAT2 pf;
2 ]0 x; C7 X. X& Kpf.cbSize = sizeof(PARAFORMAT2);
; t" B0 t' O( D) t( x3 Z7 mpf.dwMask = PFM_NUMBERING | PFM_OFFSET;
7 Y0 p4 F) J# F9 M( Bpf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING 2 k9 {0 M/ G% B( C, g' L( e, z
pf.dxOffset = 10;
0 I$ N! e; X: b0 [+ ]VERIFY(SetParaFormat(pf)); & G# R! z5 f- W' H/ l
常用的dwMask有$ ^7 w7 j' D: j: T$ b2 W- j# ^
PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
! F0 A- {# `5 c2 使用阿拉伯数字 (1, 2, 3, ...).  
- h0 ^& r  d' k: I3 使用小写字母 (a, b, c, ...).  5 v' N1 O- G0 v5 j' D5 B
4 使用大写字母 (A, B, C, ...).  . \6 F% K- P! p
5 使用小写罗马数字 (i, ii, iii, ...).  
  r7 k* b. g2 P6 使用大写罗马数字 (I, II, III, ...).  
2 D4 @' H& S4 x6 k+ g( A( ]/ [" U  M7 自定义,字符见成员 wNumberingStart.  " s0 H7 W. ^; U) a4 G1 U8 J
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
, @3 N$ r2 g: G/ k  X  ?PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进: Y6 n( T' a+ C- `2 _2 |
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
  D  A0 K7 D9 W& b' }PFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
$ |: I  k- r  w, H  d
4 @% g# _5 `3 Kc.设置CRichEditCtrl(2.0)背景透明 $ t1 \/ l& G( x& \( N/ K  Q/ [" H
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
" |) h. S4 f3 J; L% u0 D9 P8 \style &= WS_EX_TRANSPARENT;7 O1 z7 x. I/ A* K  g6 n& w' w) B$ h
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);; L: A- E1 A( Z! E
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
; n3 n4 T6 ]( x& }2 R4 Z" n% ?8 ^- G5 u4 A% o; S" ~: H& W
e.得到内容有三种
* N1 ]: k5 y4 n* _- b+ J/ m1)GetWindowText
8 i( H6 g5 X! L- {2)使用EM_GETTEXTEX% U5 T" p0 w6 ^! [
GETTEXTEX gt;- Z5 d: L$ m2 K7 ]
gt.cb = 200;( i: A! N  r3 w: C5 N* Z5 g) a5 N
gt.flags = GT_DEFAULT;
" B9 c9 Z: k% ?/ ?" Qgt.codepage = CP_ACP ;
) K; i$ ]" A$ Pgt.lpDefaultChar = NULL;
) K5 ~  G4 m! M) f1 q( zgt.lpUsedDefChar = NULL;
5 R. K( ^) j+ z: b) [  p) {- iSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
) f2 Q6 t3 h% C* l3)StreamOut(主要用于RTF等格式输出)
1 C. y1 N8 M2 A# o& i  wstatic DWORD CALLBACK * v: [! P% k0 F  N% v5 F$ D" y
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb): {' R. u0 M! I3 _9 ^2 ]! r" @
{) F: ]' T! \" v# b3 F5 j5 `0 V
   CFile* pFile = (CFile*) dwCookie;  R) V2 b; S1 N1 x7 A9 h+ G. ~7 A
0 F1 P; E3 J4 I2 T! i* c
   pFile->Write(pbBuff, cb);1 B2 v3 }( G( h0 }$ W. ^  V5 Y' o/ F
   *pcb = cb;2 _) F4 k3 {+ Z" y9 G$ M' B
# ~+ j: E) {- ~6 T9 T6 a
   return 0;" s  F! e0 E. @# ?3 o: ~
}5 p* G/ \, J9 Q$ I  Q

0 O' @. k7 ]( k) d) p) W, J
% b5 b' N+ h2 K1 L   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
. R* X3 B3 L/ \2 L   EDITSTREAM es;3 q* j, v. j. o9 {
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用3 \2 W. Z. U- U8 P+ @
   es.pfnCallback = MyStreamOutCallback; / s1 I/ |2 P% l# s% o/ k6 Y
   pmyRichEditCtrl->StreamOut(SF_RTF, es);" T5 E0 ?; i6 W) {2 ^% |
读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn/ [% G. H! D( ?& |) s

- O( X6 T& e0 ~1 Z1 Y4 Gf.查找字符串
* r1 i. w/ o" H" Z8 qFINDTEXTEX ft;
; U( ^8 r5 T. @) V$ m7 J$ {8 pft.chrg.cpMin = 0;0 c0 O4 p4 x0 |" M6 n
ft.chrg.cpMax = -1;
4 E. |. T, E: o  V' J- |; I- ^ft.lpstrText = "|";. p8 i, m4 v% L- Z1 W$ |" q
long lPos = FindText(0, &ft);
7 \( e9 @1 X# |( b% ]! L
! `$ M# J. h; y+ M如果要继续查找,修改cpMin,如
+ Y/ E: k6 s3 I4 J+ ]7 I$ Kint nCount = 0;  n" \+ ?* v8 ~
do+ ~- i, ?: n" i% d5 u( Z
{3 \; n4 K4 }9 k/ V2 O
long lPos = GetRichEditCtrl().FindText(0, &ft);8 r+ x& }  M6 b1 n% u# r
if( -1 == lPos) break;
# C, j( U' n# t& K ft.chrg.cpMin = lPos + strlen(ft.lpstrText);
$ a6 ^  \9 M! ]% g5 Y ++nCount;
; L7 u8 L3 w0 \+ o3 \9 n( z! G; e}while(TRUE);1 ?! ^* G( T# C- p) D

0 G1 j; u# V6 B& {0 U1 y* h9 _g.以Html格式保存0 t; }& L# M; g0 U3 v9 c1 o1 g( y
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter1 x; [2 \- q% H6 b3 b- W: Y  ?
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/
0 I1 ~) t& Z" ~6 U' N
: e% t# U+ ?1 D2 A  bh.重载OnProtected函数得到对应的消息,如粘贴等% y5 d" Q" E3 M' \) x
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
" P9 X+ k+ I  ~9 H{
, F4 _7 w8 g  m# _ ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;6 j4 P$ z- @4 Q% S3 G7 Z" {" k& F
  p1 e0 s/ M- E
switch (pEP->msg) {  r% a" D+ q) o2 G( ?
case WM_KEYDOWN://按键,判断pEP->wParam
! j6 C; G6 u; _$ L0 w0 g6 A case WM_PASTE://粘贴. }2 t$ Q. f% f( g
case WM_CUT://剪切, b1 Y! a% M5 a/ I5 V) [" p
case EM_SETCHARFORMAT:
! J' d8 y* }3 P- _ default:
! K0 g( J; ?$ M% p8 t5 q. a2 o2 d  break;
  r3 m, _! S1 Z1 z };
, ]3 V0 o3 A1 I& c6 m % g2 c3 c- H9 D6 x) b1 \6 Z
*pResult = FALSE;, k3 u- E' O; A6 T/ z
}
* a6 s- `: L: |4 B8 c7 `. i5 X3 k
: u# ^9 N- _( `' s% b! T9 d& D三.聊天常用  
+ q1 _3 r9 M( v+ \a.LINK 链接功能% `7 V7 r# }4 Q
1.  LoadLibrary(_T("Riched20.dll"));
! W( w. ~4 S2 g9 w4 J" \2. 创建RichEdit2.0控件8 M8 T. i# _% ?% d0 a
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
+ h, T- p- E9 N' o, p|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,4 @+ E! \( o2 p; ]+ O& X
          rect.left, rect.top, cx, cy,
6 O5 q! t7 t2 k: N* X  pParentWnd->m_hWnd, (HMENU)nID, NULL);# d4 F5 Q9 n1 d- P: x. u
3. 设定选中的文字为链接显示& h, Q9 z9 L6 y7 g2 D
CHARFORMAT2 cf2;
$ J0 }( k9 b4 m5 {$ r* ~6 m0 t9 Z6 RZeroMemory(&cf2, sizeof(CHARFORMAT2));//
2 V6 q+ P3 b8 W& T+ I8 m# tcf2.cbSize = sizeof(CHARFORMAT2);
& n) k; }" b$ M: g" F6 u/ X* wcf2.dwMask = CFM_LINK;
* I- n% X7 t' G, Ocf2.dwEffects |= CFE_LINK;
, K& l9 \3 _! t) O$ j  f* Am_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
1 h0 [+ [% K% o' N! S! M2 C4.支持链接的点击响应
' m; O1 g  i7 Nm_cRichEdit.SetEventMask(ENM_LINK);
: T" V! a* @& l& F6 G5.响应链接的点击EN_LINK0 L& r5 M4 g9 I6 S1 A# J' q. v

2 F$ e. C, T- \& e* e- e: i! ZBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
% A! N3 ]0 u7 L+ `( [! E3 M2 xON_NOTIFY_REFLECT(EN_LINK,OnURL)
0 J* K" x9 c( C5 S7 b- o* p( BEND_MESSAGE_MAP()7 A! [9 F& Q. o6 d+ Z# K
......% F0 O: m/ j( p9 j
0 {. Y4 w9 X8 U; Y+ c/ |
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
" ?4 D) z+ @5 v" V9 h- R{, x- T# C* _' R1 y$ [& z
TCHAR LinkChar[512];9 H$ b6 W0 {* K3 k+ @
ENLINK *pLink = (ENLINK *)pNmhdr;
! u4 V, ^  S. W( Y: w( U5 jif (pLink->msg == WM_LBUTTONUP)( }$ t$ |, S% t5 _$ ?
{5 U& e& l- s) w* ?5 F- c/ @
SetSel(penLink->chrg);//这是链接的文字范围/ N# S/ w8 z! a( I
long Res = GetSelText((char *)LinkChar);//这是链接文字
$ m- z8 a+ U4 {. p- L                  //后面是你的处理过程# t# y- ?0 \+ d2 a
                  ......
( E- q5 ~4 V. V8 b$ `2 c         }
4 F' j( M0 c- Q  v4 |5 j! N# v}9 \3 s- H- B2 q, c0 @" {

/ q: d# U8 U9 K* Qb.插入位图* X# u+ \% d" v& p# A- r; g4 {
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/, g% A: p4 R1 k, Y* [
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
( a+ e9 a( @# Q4 e+ |1 R& S1 i+ m! \( f  ~4 b" |$ {  q
自定义在RichEdit中插入对象的图标
7 W1 }' m! i4 n) s3 dhttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html
" j  v9 L) ?8 ?$ h1 l! _% M+ C2 ]$ K方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control0 x  I8 [/ |8 \# A* ?( i0 ~4 z3 c
只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片( |; \+ J' E" o0 @! O' O- P" A
1 t0 ]. _: P5 H, I
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
- |4 A( \1 k. p. Q/ z9 o9 ?另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
) x* |) ^: O  F0 n: y% P0 y% E, C
9 N3 Y! R2 }0 K) T' Ec.显示GIF动画
& K( s3 l# [5 S2 l# l( v, {2 O3 ]常用的是通过qq的imageole.dll(也有用Gif89.dll的)6 i2 o0 D) Z) @  Q( k0 V; ^* H
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
& a: h+ x& e5 s" C# Mhttp://www.codeproject.com/richedit/AnimatedEmoticon.asp2 A* V+ W$ `) V0 P1 C3 ]% i

0 y" p* e. Q6 q' }. X在richedit控件中插入动态GIF (Native C++版)0 [2 q" s2 x5 {! }2 D7 D
http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx: Y( a- B0 E1 q' N# f% ~* L
, s, ^" S5 c0 H4 F
d.IRichEditOleCallback的使用4 A, R. Q; S4 `" X! _
http://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022  J2 K' ]( c( q: b, ]4 A' }

3 a! f8 |. R( Q# S8 t类似 MSN 信息发送框的制作(上)
* a) N" _0 ^* q4 A$ X8 X& ?6 qhttp://www.vckbase.com/document/viewdoc/?id=1087
9 s1 O" S! e: d$ V: R$ o内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
; S! W5 O# u5 _1 p# y3 U, |3 W% f2 ~, \% x
自定义 CRichEditCtrl 控件5 x" _; P9 M9 D4 x0 {4 u
http://www.vckbase.com/document/viewdoc/?id=328# e! R. E  g" n2 w! t: ?
内容包含:鼠标右键消息,消息映射,字体变换
/ _4 `% v: \+ v* {1 j
+ X3 t" ]1 i7 h0 f8 f+ pPS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母
. k% z5 q0 X9 k3 Y2 L是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
  C, [" _8 J$ n: r----------------------
& D  {/ W" K; u比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-14 02:13 , Processed in 0.019161 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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