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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
% x- T, v7 w" [* k) z( ], w, D' _$ ha.可以编译,不能执行的) f& G' x' s: I1 P( W* }* {3 V0 S# u
AfxInitRichEdit();' m# `3 \6 A8 v& e+ o( m# Y
9 `" @* d6 O4 k8 O# \# D
b.升级默认的Riched版本(默认的有一些bug),如
0 N/ @2 W% X$ t" \; @2 S: l8 G可在InitInstance中添加  Y% r' r5 u" H' X2 f2 e
LoadLibrary("RICHED20.DLL") ) b' N  ~9 v3 d5 _! m* J+ d
最后注意 FreeLibrary
6 F( o8 E; F3 a/ B( [" i" {7 j6 i5 i# J
如果是CRichEditView基类的可用
. @+ Q% b" @1 z6 c) V. z  p  l. @# SBOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
5 h' f9 Z& z* |0 H6 N5 }4 t# K{
* w% B7 f# b7 X//装入rich edit version 2.0% r$ L0 }$ T7 i1 K9 U
if (LoadLibraryA("RICHED20.DLL") == NULL)# s2 Z( |6 E+ u. P& [# D
{
( l+ C0 E, [5 y# zAfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);8 Y) F" h+ u2 z( l; F# u
PostMessage(WM_QUIT,0,0);
, ^# v% w% m0 q4 n' Z( e; Creturn FALSE;1 F0 [6 J0 l' h: }5 X' K) }* U
}, ^# ]  T* y" _2 V
% M2 J  b6 ?4 w6 r& ]  S6 |, E
m_strClass = RICHEDIT_CLASSA;//for 2.0 class
, s4 V( N- O) M# Q* \' k1 P$ U+ I+ |) q2 v( O
return CRichEditView::PreCreateWindow(cs);
. h! G. U, `; E+ }/ O2 k}0 n% e) d3 I, K; H! _- ]/ m  k* k
9 F5 I% T# b- d4 d
c.最后追加行, `5 u8 i! q" \& s( l* u
richeditctrl.SetSel(-1, -1);
- x* a2 Q7 |$ M9 @7 c3 qricheditctrl.ReplaceSel( (LPCTSTR)str );' I% g5 m) P: g! s. e, g( @6 b

# S& Z' c& i* K- Pd.字数限制
4 X$ }7 f& I2 r; ECRichEditCtrl::LimitText(long nChars)
* c. F+ l/ L( D1 a% h8 h& A* O2 E( _3 ?( z( L2 X2 K: x  d! `/ l3 H
e.换行切换
' [5 l! m2 K2 ^8 M5 JCRichEditView的OnInitialUpdate()函数中加入下面两句:
, V2 I$ d. a2 d7 Z+ {- S  um_nWordWrap = WrapNone;( `7 L* \7 ?  ]$ I8 Y
WrapChanged(); ' N9 j6 ?0 P, ^) W; L
WrapChanged实际上也是调用4 z3 _* h, }& o! d0 a5 B9 h8 Q
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
9 f! j9 @7 b/ Jctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
; W1 l& F/ ~, M& Q/ e还有不常用的 m_nWordWrap == WrapToTargetDevice# U. `! X# V3 E5 V2 N
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
  H) R$ Z0 s% V, m& `9 T, E2 e如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return; O1 W& J- b9 M* Y5 L( f' x, N' @5 P

. E$ j! b  h  S, L+ U2 Lf.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
$ a* x+ ^  Q7 C% LpmyRichEditCtrl->PasteSpecial(CF_TEXT);( X+ h2 c# p% e9 r

5 e) T6 g' z6 S7 cg.随着输入随着自动滚动条滚动到最后一行2 |- c5 W( p8 V# C8 s, q
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();' g- U9 z% \' X9 z& ~4 P) y
if (nFirstVisible > 0)
/ H4 g0 q+ l9 Y, q, z$ p. {{0 G9 j  F, l/ I
   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);* p* z) d6 v  [' g  x
}  z+ h* ]3 r/ i6 R! ~

- h8 `* E! J* xm_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
  g( d/ R2 P: E( M0 D0 e8 N, c4 f) B
6 r' ]; A* T& {9 L8 |4 ?, W' R
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)
' a9 Q# c" g: X7 Z- K0 m& hSendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);2 i; @3 }; P+ f
TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数
" b% k4 J# x9 d  GSendMessage(EM_SETUNDOLIMIT,100,0);4 c' C2 m- f) ^2 Z; W9 ]9 @

% d- }# T$ q* m: {  ci.响应OnChange* I5 a1 Z$ g2 k% Y
EM_SETEVENTMASK 设置 ENM_CHANGE
+ @+ d0 Y9 N: _+ Llong lMask = GetEventMask();" M6 }( P1 M2 J' _* R. w$ ?  o, ^
lMask |= ENM_CHANGE;( J, g7 _5 \. F/ a" B0 v2 b/ u
lMask &= ~ENM_PROTECTED;1 l  h* [: ^0 C
SetEventMask(lMask);
* ], d/ W2 \) ?: r3 J, [
" j1 x; }) \. l" [5 X5 Zj.设置只读
1 `+ M; `' l( n3 dCRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
% X0 ^7 [: _2 o( [( I9 L8 i$ g' i. {. Q通过设置PROTECTED实现选中的文本只读,参见5 L4 `' n9 q- l4 u- U% t
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/! C$ _% C* g5 w

, {/ f$ \7 [& [1 [" B二.函数应用- R1 ?' J+ w- v6 {! t8 M' U
a.设置字体(主要是通过SetSelectionCharFormat), G/ F9 }5 k7 Y1 A5 C
CHARFORMAT cf;7 C; F) }, Q8 c$ C% f  i
rich.GetSelectionCharFormat(cf);
6 Q, a' I3 `* A- Vcf.dwMask|=CFM_BOLD;
7 ^0 \! Z/ N8 Ccf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;# B2 Y6 Q4 E% n  M
cf.dwMask|=CFM_ITALIC;( B: E/ }6 X2 q5 `
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
. o  s$ Y) ?& ^* [$ z# Gcf.dwMask|=CFM_UNDERLINE;6 l5 _% ~# N: T0 I& V; ^: T
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
0 e3 L! b* l) Z& R! w1 x) Icf.dwMask|=CFM_COLOR;' {+ d4 N5 x$ K
cf.crTextColor = RGB(255,0,0);//设置颜色3 v# B  o1 Y' K( z) ^, U
cf.dwMask|=CFM_SIZE;3 |( k9 Z$ b& ^. a+ ^
cf.yHeight =200;//设置高度
+ `% k- j+ U1 t) y& n- Ncf.dwMask|=CFM_FACE;
6 l' g+ A' O  W. G  W" t  y6 ustrcpy(cf.szFaceName ,_T("隶书"));//设置字体- ~0 Z8 y/ O4 D6 N; y/ Z8 `4 D
rich.SetSelectionCharFormat(cf);# W9 F4 a1 e2 D+ G

; q' \) b$ l8 E  Y9 a% F, I; ib.设置字体的行间距! r% q; }  L8 V& k5 R
要用richedit2.0以上
0 e* ~! p8 d1 a: U+ g( r试试
0 J: v5 S% g1 PPARAFORMAT2 pf;
0 Y- c+ I( E- Mpf.cbSize = sizeof(PARAFORMAT2);
  |. V9 K% Y3 g. y1 U) Spf.dwMask = PFM_NUMBERING | PFM_OFFSET;
& h8 u: v& n6 w+ t( Upf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
/ J* G: w  K/ Spf.dxOffset = 10;; e6 ]& r, P2 X( C7 R
VERIFY(SetParaFormat(pf)); ; ?, o+ `& L: y( ?2 o; K
常用的dwMask有* L# ~9 p& L4 i) _% L4 G
PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET( x9 ?1 l8 K3 }8 j. p
2 使用阿拉伯数字 (1, 2, 3, ...).  
* r, h# S! E- k3 使用小写字母 (a, b, c, ...).  " z5 y$ {8 {1 {$ G8 ?2 p) n$ n, M
4 使用大写字母 (A, B, C, ...).  
6 G  j+ ?/ B- u& z: q0 K! ~5 使用小写罗马数字 (i, ii, iii, ...).  
5 f& z  x0 P" b- R- Z6 使用大写罗马数字 (I, II, III, ...).  # z3 m" a0 Q% c" ^: y3 o' I; J3 y
7 自定义,字符见成员 wNumberingStart.  
5 T5 {: y: v  Z# [0 A3 Q5 ?0 Y1 MPFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
& D. [- k8 ?; E* }/ t' s' u5 }4 H  kPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进! Y8 A! u+ h# B* M- j9 Y3 D/ `
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
5 ^$ @2 V! b2 o5 ]" V9 NPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
& }* E7 A5 A  q$ U0 X& V9 x( }
c.设置CRichEditCtrl(2.0)背景透明 * I$ u- S8 X7 G
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);: Q. T  _* k2 x8 a
style &= WS_EX_TRANSPARENT;8 a$ A0 C) e7 O3 s" [( w" [
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);! @4 P4 a+ `( r- W( x- A
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
8 w( |6 l: h9 u/ K7 e
6 M- ], i* A) X, K; De.得到内容有三种
3 ]5 f8 H9 ^+ l% L2 i: A) B* n6 x1)GetWindowText
& I4 @0 Y, g6 v9 r, o2)使用EM_GETTEXTEX/ @6 r$ D  o. U% m' d) ^
GETTEXTEX gt;3 F: D+ e/ R& [
gt.cb = 200;
% X$ H% Y# a* W" `gt.flags = GT_DEFAULT;
' ?2 h* G4 O6 H. tgt.codepage = CP_ACP ;4 j! X" O. z/ g# Q+ @( C2 `
gt.lpDefaultChar = NULL;
: O% d1 g" f4 b# `. {( K0 l# n0 pgt.lpUsedDefChar = NULL;
4 F/ k' x7 r" s: o1 g& T! @+ N9 eSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
4 y: @, r9 Y2 I3)StreamOut(主要用于RTF等格式输出)
2 k$ ]+ c( c0 b+ ]3 \static DWORD CALLBACK
+ X; q% c9 b( p* BMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)8 y+ }( r0 s0 Y
{
% p& H" J3 N$ w; e9 S   CFile* pFile = (CFile*) dwCookie;
! X5 K; x, ?4 ~5 y4 Q
# X# I- y! i$ W& j   pFile->Write(pbBuff, cb);
9 E( P* W8 _) i; d$ A; ?7 l   *pcb = cb;
0 a5 H) I9 O  f; v' y6 p! K* {7 `9 O- e
   return 0;
3 r* m. I0 y# @" V1 N}6 G: d9 L  G  p7 H/ c

; V* W9 ]# c( R& P2 t" D* B7 f! {
& Z1 I5 O$ L  N' ~0 Q   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);
5 ?$ V9 V( ~7 W( I, [   EDITSTREAM es;
" T9 x; N* p, J. b. L$ D' I   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用
9 N0 B% L; B; h& A) X% b. R( W" |8 E   es.pfnCallback = MyStreamOutCallback;
2 I1 Y1 E  [. R3 H: |6 _   pmyRichEditCtrl->StreamOut(SF_RTF, es);
" H2 u& I5 ?9 l9 G* ~/ U% `6 r读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn
* E( q+ T0 E2 \5 @9 D) D3 }/ b3 R5 s; ~% o1 \9 R) h- R; w% l
f.查找字符串) L$ x& v8 l, }; q9 ?
FINDTEXTEX ft;
' U! @1 S! }7 Z! Xft.chrg.cpMin = 0;
8 E4 C# r0 A" k5 gft.chrg.cpMax = -1;
0 k* n3 N& T4 P6 J& rft.lpstrText = "|";( O- `1 s. ?5 E
long lPos = FindText(0, &ft);
$ b0 _1 j/ G) _" h7 F3 X' D9 m9 ^) i" ?1 h6 M+ y2 W+ G
如果要继续查找,修改cpMin,如" \) Z3 m! A8 [& S6 g* `
int nCount = 0;
2 f7 R* N, y9 d) Ndo
+ W% z# q4 o; J: c( S/ T) x- ~{( s) h- V* a% C0 s
long lPos = GetRichEditCtrl().FindText(0, &ft);
; m, h& b+ ?; e) [+ g! T* O, `# Z if( -1 == lPos) break;
. U" _$ Z7 d1 v# [" L( L ft.chrg.cpMin = lPos + strlen(ft.lpstrText);7 e- Y5 t8 E+ W0 m3 l1 }4 X) u
++nCount;; F0 D. P) g! O2 D6 Z1 {$ Y. V
}while(TRUE);8 n4 u+ D2 @7 f/ i  x8 g

% B6 S% s2 c! b4 y4 jg.以Html格式保存
  A8 y1 m- W( S目前做法可先转为RTF格式,再通过RTF-to-HTML Converter
* e% L3 {, N+ o% G9 u, ~- |http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377// Z9 p( L" Q7 i$ E( o0 S
' t: M" [- D! W2 @
h.重载OnProtected函数得到对应的消息,如粘贴等! T' j+ Y  J7 B7 Z7 B$ K
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult); o; T* d2 `3 r* p' z- j
{
3 m: C( \! N* q0 M8 Z6 Y' I ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
: Q6 Z5 ^" J" Z, Y4 k1 L- q. }# ~" x" L. Q; p7 ~$ n% @
switch (pEP->msg) {  Z( Y  `$ D& g) @' X
case WM_KEYDOWN://按键,判断pEP->wParam' g/ p( r5 |7 x% ~% f* m- c1 V% p- M0 z
case WM_PASTE://粘贴7 Q% }+ A( d5 v; [; P- |& W9 c
case WM_CUT://剪切$ R% }( _; U# z% C
case EM_SETCHARFORMAT:4 i) q7 I6 r; q  c% a4 m5 X- f! b0 x# ]
default:
9 n6 S% G- |: o. @  break;
6 s; b+ n3 R3 G* L9 [* z) w };
% ~& K, x' ^6 i3 { ! \1 S, t5 k5 E1 w" e6 q
*pResult = FALSE;  `6 w! y5 E7 D5 _
}
0 w2 r! G" J5 I7 [/ M% g3 r; P* ^8 x6 i
三.聊天常用  
: Z, i" y6 O1 q& y; V/ }8 ga.LINK 链接功能
. u/ w1 G* v% Y$ R4 S1.  LoadLibrary(_T("Riched20.dll"));
' v1 L! x* o, `% j2. 创建RichEdit2.0控件, n% W1 q$ u8 a6 W* K) }8 I, }
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP' o) q9 g3 s8 t8 v6 V. W; x
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,( u' E$ H# a  F! e
          rect.left, rect.top, cx, cy,
. o9 n2 f) u# }, Y- f8 M/ z  pParentWnd->m_hWnd, (HMENU)nID, NULL);$ R. I* F' y+ K2 X1 y% N
3. 设定选中的文字为链接显示
, N! o# k% r8 ^" aCHARFORMAT2 cf2;
4 L6 P  X7 b8 I$ CZeroMemory(&cf2, sizeof(CHARFORMAT2));//8 ~" c% S, R4 I' P1 K" B# p3 [
cf2.cbSize = sizeof(CHARFORMAT2);
# l; w- M+ W' icf2.dwMask = CFM_LINK;- N4 I/ P! Q: w! K8 Z( n
cf2.dwEffects |= CFE_LINK;, L" P5 w" ~* y
m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
' R) y& P, s. M' d3 w4.支持链接的点击响应
5 g  `7 C8 t# I5 @: R! K2 H+ Rm_cRichEdit.SetEventMask(ENM_LINK);+ ?; _' {8 z! F) Y1 [
5.响应链接的点击EN_LINK
( e/ [. t" D' q$ k* S: N6 c$ A( Z
: }% B/ n% E# g* VBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
1 X& }6 j2 L' xON_NOTIFY_REFLECT(EN_LINK,OnURL)! _3 g! J3 K+ u1 T
END_MESSAGE_MAP()
; _1 t! _8 w4 \1 [) N0 I......
4 m! B0 l0 {0 {4 u$ h! ]" s2 `% R( g0 _  h; H: [& b0 v& v
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)+ m  \/ m4 z# |4 C. e; X: F2 H, I
{$ L! g% O. y  b
TCHAR LinkChar[512];
8 @' Z' Z6 ^$ f/ IENLINK *pLink = (ENLINK *)pNmhdr;
- J' k, ^! j% F7 s/ |( P0 `if (pLink->msg == WM_LBUTTONUP)  E. q" S) ?8 j) W. x2 U
{  y7 N, t8 }2 c# C! \9 I( h2 K6 k
SetSel(penLink->chrg);//这是链接的文字范围
- c2 N# l" J3 d8 e6 k! v) i+ tlong Res = GetSelText((char *)LinkChar);//这是链接文字
7 f( y! B% t: K! m1 k                  //后面是你的处理过程
. _% C9 ]4 B: }( ]" |5 v( U                  ......
- L. r6 n/ b* [! P3 K5 a         }
) l5 A$ s+ b7 r4 Z}
" c: }  k1 G3 w8 @( s3 L2 ?* ~9 Q
7 F9 O* j. e8 Y: f; Fb.插入位图  E" N9 R9 D( i6 u
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
  q$ D# s# l, B4 f) ?' Fhttp://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
6 [3 A" J& S* f& J' z4 H; O
- B# @- j8 n) h+ n3 m8 X) T5 S( e自定义在RichEdit中插入对象的图标- N; o% x" a' b8 r+ y
http://www.blogcn.com/user3/jiangsheng/blog/1319738.html5 f/ g: y) v9 E: W) U
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
+ H9 p. X/ E5 Z5 I; ~/ y只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片( Y2 @! H, }1 w# |; R3 H: F

2 N9 c$ P$ H% Q# @  o2 J使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
% _5 m! e, s- q另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。 3 r; l0 D) E- w: {0 |+ F
( q2 i9 A; |" ^( B0 e# c! G1 ~
c.显示GIF动画
/ J! y# `; E  w8 F常用的是通过qq的imageole.dll(也有用Gif89.dll的)- G* X" I! n9 d$ ~2 e! b% q
http://www.xiaozhou.net/cooldog/blogview.asp?logID=821 G4 V8 M/ C$ @& c5 _( h
http://www.codeproject.com/richedit/AnimatedEmoticon.asp
8 ?/ H' \9 b' p. Z1 g* l, m! z+ `# n0 A7 e! r- K
在richedit控件中插入动态GIF (Native C++版)
* Y! @8 k: H7 U6 N) [% Y5 M1 }1 jhttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
* p6 [; z0 x4 r" O* V9 j- A5 m  D3 R- C4 d# `- Y5 Q
d.IRichEditOleCallback的使用
. s7 @% A- C3 e7 E# T- O/ Whttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022
+ p8 q' v' a' N2 h& B( f& L: C2 G; @. g. L4 v
类似 MSN 信息发送框的制作(上)
/ E# [: R: k' Q; f3 J3 U( Fhttp://www.vckbase.com/document/viewdoc/?id=1087
% g* o/ B3 W# Z; n* C内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串1 o3 W  ]& y* s$ P1 W' C( C* g

# G1 v1 e) b  C4 ?8 g4 {% z) [自定义 CRichEditCtrl 控件
% T" H: H# {. o5 A3 {" e$ T6 i; thttp://www.vckbase.com/document/viewdoc/?id=3281 v1 S  T5 `  I" q. @
内容包含:鼠标右键消息,消息映射,字体变换
! {# g6 o$ S  z- a  l, W+ |3 X* I" Z! ^7 G- k
PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母1 N/ ~% S6 w) h8 D& a& `- z% B
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
; `( W& M1 r2 V, b6 N----------------------- }% U- [& M9 d
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 08:06 , Processed in 0.026389 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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