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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
  A( S$ l' v' L) va.可以编译,不能执行的
/ p3 Z/ H$ S" [! dAfxInitRichEdit();
& k& K$ l. i5 {3 u7 B# o4 x) X) p8 Y
& u- y3 K' `+ b$ c) j* w9 Jb.升级默认的Riched版本(默认的有一些bug),如
( y2 S) b, \/ f! W4 s+ {可在InitInstance中添加
" T! u' ~7 m& Z! hLoadLibrary("RICHED20.DLL")
, a: n4 t5 q, q1 b5 W最后注意 FreeLibrary
$ C% |& x* x# a; ^# M
0 \( w5 R5 Q* }/ I如果是CRichEditView基类的可用4 A1 D- g5 X, {+ M) w
BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)7 b/ A; S9 Z6 n3 x/ b' j5 b
{
# r  a3 e( I. n% j, y//装入rich edit version 2.0
; q& N$ {( t' H: gif (LoadLibraryA("RICHED20.DLL") == NULL)
+ Z$ B6 i7 t1 k  y+ b. v' L& K{" O9 J; Y) s* J* |& ]* v$ o" @
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
* ]( C/ k  ?9 V; s! iPostMessage(WM_QUIT,0,0);& t' u; j* t1 @; v' q9 X# o, ?$ \
return FALSE;
4 l" p6 ^) [6 u' ~+ ^. X- O}+ m7 c0 M1 T) _% G0 t

' g- B" R4 J3 h1 u4 e4 r! Ym_strClass = RICHEDIT_CLASSA;//for 2.0 class$ i. t: g! X6 H) r9 ?, X+ E

6 z4 P4 x* I* Y  U( @  Dreturn CRichEditView::PreCreateWindow(cs);
% @3 q7 B  a+ h6 u9 m4 Y}
5 o% \9 F1 I- w# {) n# k9 D: s6 j! b' W! h" [- ?* B5 R. u; \" S- \7 `
c.最后追加行7 o) f7 `7 m/ G( ?+ G
richeditctrl.SetSel(-1, -1);( C1 G- I  U; K  i
richeditctrl.ReplaceSel( (LPCTSTR)str );
; H# w) E6 V2 ]1 \- Y( y  X6 P+ Z. b5 u% t2 Z& p
d.字数限制
6 a' _9 ?" a0 e( JCRichEditCtrl::LimitText(long nChars)
# I% P% \4 }' s& C% J$ {# t6 A1 C+ ]4 _  o
e.换行切换
3 l; \; g$ _& ?( S7 `CRichEditView的OnInitialUpdate()函数中加入下面两句:
; g3 [+ U: v# Sm_nWordWrap = WrapNone;# `& }$ _" |9 |+ a
WrapChanged();
4 v5 r8 T$ `. L* t3 t9 HWrapChanged实际上也是调用- e3 f+ N& W8 b# G
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
. R" @" w. L2 q$ ~0 [) Hctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
/ K9 t5 E; b4 O, @. O0 J, j4 e' X还有不常用的 m_nWordWrap == WrapToTargetDevice1 V$ [6 s4 u8 f8 H4 g, F0 p* R& `! g$ T
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());+ ]5 p7 p, r3 O! U1 J2 Y
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return% g2 a. x8 j1 j" G! r5 L
" \" @" s) B7 b9 `# S% t3 Z3 S# U
f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
" [: F% Q. ?. H6 Y8 F" {% I; opmyRichEditCtrl->PasteSpecial(CF_TEXT);2 E8 a4 ?/ a( H) l+ k# Z1 f* n8 u

5 B( ]! M: S$ m% _! q& L  Og.随着输入随着自动滚动条滚动到最后一行
; v8 C- y5 b3 R* B/ e& |' x7 Jint nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();% H. s6 D4 K' [7 w2 d* m1 z7 M$ H
if (nFirstVisible > 0)
* C4 }6 y! r& n# w7 i{
/ h( c! B' S# N: {' ~   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
; ?# g& C: F' S/ b: k}
9 X# F, F/ y! ?2 g
! {. i6 H3 H6 e3 {m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
) }2 C0 |5 t- [! s
2 C$ j9 Z% \# P# z5 s/ H  ~/ b$ P2 O8 B# q! c7 B: c
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)1 d  H8 H: i9 Q( d0 t- c& |
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
  c+ C7 R9 f; A5 E% S4 wTM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 % T# I# p4 n4 P  n1 K
SendMessage(EM_SETUNDOLIMIT,100,0);& R% \' U6 w2 C4 M3 X
5 f/ n3 d- H4 ?+ U$ t% W4 p# y
i.响应OnChange8 e( o4 X" H) C
EM_SETEVENTMASK 设置 ENM_CHANGE + c4 R( U+ N+ s2 Z1 A' Y0 s
long lMask = GetEventMask();
# ]; g# k: U1 y' tlMask |= ENM_CHANGE;* v" k# H* e! ~% a' c( B. |
lMask &= ~ENM_PROTECTED;
# Z' d/ `9 m* @: R; V3 @) USetEventMask(lMask);
& v7 B  s; [- _) B. D( Q- @2 K2 V- P: r4 a8 C* ~4 F
j.设置只读$ J* k; N7 s# N1 h( F4 i* Z" \
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );- Q' g$ |( w/ n" P' U
通过设置PROTECTED实现选中的文本只读,参见( s* `6 ~2 I3 E) E- z
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
# `6 S6 G* K1 q$ ]6 Q" u5 y7 O  t& ?4 @
二.函数应用
; V+ E3 K# [6 A/ N5 m- v! Ga.设置字体(主要是通过SetSelectionCharFormat)& |& N0 `1 M7 \. I( {
CHARFORMAT cf;
# ~6 f2 V, s6 B* jrich.GetSelectionCharFormat(cf);& J1 l8 T! A  X7 q9 ~. r) C; _5 b
cf.dwMask|=CFM_BOLD;" A9 D% Q' X5 Q& u
cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;  \, G! n: {5 _
cf.dwMask|=CFM_ITALIC;
" p& l( h3 E+ T. Wcf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;! a* z, t6 ]6 l5 H/ u* ^# a4 N
cf.dwMask|=CFM_UNDERLINE;
$ F$ P1 d. Y' a( j- G7 v6 S9 |cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
& k1 M6 r- G. e& M4 I7 Gcf.dwMask|=CFM_COLOR;
) e9 L7 h% d/ x; j) Gcf.crTextColor = RGB(255,0,0);//设置颜色, q; X" k2 H; q2 j4 M5 r& _
cf.dwMask|=CFM_SIZE;% J1 ]7 @) t& v0 h  i& s' S, R0 N- ]
cf.yHeight =200;//设置高度* j* S4 I& G2 F% Q" U  k' r4 r* u
cf.dwMask|=CFM_FACE;
- @  ^( l5 C3 F+ {strcpy(cf.szFaceName ,_T("隶书"));//设置字体
3 y, K: X3 b+ Y( Prich.SetSelectionCharFormat(cf);
/ t; _& ^3 r; n8 d/ s3 ^$ h7 V; P" N! b. S+ n
b.设置字体的行间距3 P' k! d' l2 v: E" T: p8 b7 {8 [! ?
要用richedit2.0以上. V# S( ]- i& W4 I* i
试试
8 w8 e$ \  y- E. xPARAFORMAT2 pf;
9 N( y! Z8 z0 k3 a" U( O" \pf.cbSize = sizeof(PARAFORMAT2);
" L; r- @: z$ D& [- z$ spf.dwMask = PFM_NUMBERING | PFM_OFFSET;2 s2 ~4 p* a6 S8 d
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
0 I9 Q. i1 b! |4 Cpf.dxOffset = 10;, P$ c9 g8 j" l8 [
VERIFY(SetParaFormat(pf)); 1 c2 Z! g' w2 K3 x4 r7 y1 d+ l
常用的dwMask有
2 X- t% n4 s# }PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
# X% c& \% c6 Q+ c2 使用阿拉伯数字 (1, 2, 3, ...).  
+ S% R: W6 v: @8 @, {) s; L3 使用小写字母 (a, b, c, ...).  
8 \- `! S2 t. _" p1 [4 F* D6 M4 使用大写字母 (A, B, C, ...).  
* @( E$ [4 T) ^+ G- ?" F& S5 使用小写罗马数字 (i, ii, iii, ...).  8 }  p/ w& B7 D/ H
6 使用大写罗马数字 (I, II, III, ...).  
5 _  H1 q  @1 B' Q# y7 o7 自定义,字符见成员 wNumberingStart.  / H: a& H3 ?7 J' u/ F6 P
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
9 o8 Q. Z4 Y1 @  \* X3 P! BPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进; U, s; n  D! J1 _( M, e
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距$ T# @! f" ^" b7 r
PFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
1 u/ T; _# K. g: V& }+ d# V, q
) `7 U% v1 W; G3 pc.设置CRichEditCtrl(2.0)背景透明
4 y; V& u! ^, V  }# f: e; }0 |( S- `long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
( ~; B; Z& R7 ^' g  X7 J: A: @style &= WS_EX_TRANSPARENT;
+ e& m5 M) y, D% z::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);) B' d7 p0 O" H& V2 K$ z3 j( n- {5 @
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
/ n! v8 o) h' b0 x& n. z% \# e4 _4 ?0 m  u/ E* Q- w9 z
e.得到内容有三种! I! U* z+ ^4 m* |. I+ r+ H
1)GetWindowText
4 r. w  M" m$ T7 F& H2)使用EM_GETTEXTEX( |: i' X1 a( `% Z: t9 S1 U; J
GETTEXTEX gt;: E- [! `9 Q' I( T. s: e% Y; @9 N& {
gt.cb = 200;% S/ W! ^: _- S& t3 v
gt.flags = GT_DEFAULT;
; j8 ?3 X% N* S: k* _gt.codepage = CP_ACP ;& o1 T& J4 F/ Z+ }; {
gt.lpDefaultChar = NULL;
6 ?9 h7 t2 F  b: K3 P2 Ngt.lpUsedDefChar = NULL;
" E. y* E8 p0 y& u. Q6 l: J$ X+ PSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);+ k" s2 G9 C) z. b3 C' R. C) T( V
3)StreamOut(主要用于RTF等格式输出)
7 f2 G* F% V6 w! ]static DWORD CALLBACK
* E) N* \. d/ L' X+ LMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)  s2 p5 j5 ~5 [/ Q; t' p3 o5 P8 {
{
, Z* ]- v4 y1 v+ r. B   CFile* pFile = (CFile*) dwCookie;
) Q3 \, e( s7 A# T1 L. q
7 J4 H' }0 D% A   pFile->Write(pbBuff, cb);
0 s7 X$ ]8 L: y4 H4 Z   *pcb = cb;
. }( p9 A) Q* P( \$ c
" A1 T8 L0 D% R: F: p5 L   return 0;# z' g8 V. B* y! M0 R: C1 U% F
}, \) D; z* D6 u& X' Q

; _* {) t$ E* u6 [0 L" {: j1 F1 ], _  A
' J7 B7 Z% x: q% a' y; H  w  J   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);: h& {2 t2 ~8 h9 g0 B" k+ W
   EDITSTREAM es;4 t& m8 ]8 ^) m! m' d, A
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用
5 t* M$ A8 ?: S$ Q# U6 [$ x   es.pfnCallback = MyStreamOutCallback; 9 ^) r8 p5 r4 a  g
   pmyRichEditCtrl->StreamOut(SF_RTF, es);
6 N8 H) J5 [" i: ]读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn
6 D( w" Q: f  H" _0 v
: P0 ]% ~& \( B3 H6 O+ gf.查找字符串( N3 c; Z! b9 \' Y
FINDTEXTEX ft;( I' J& ^! Y) @0 J% Q
ft.chrg.cpMin = 0;
  h  Z; e  I2 V& Tft.chrg.cpMax = -1;% N6 w: P* U( R2 z' d* m
ft.lpstrText = "|";
5 A3 [8 t1 o0 f( f- Q8 |1 Mlong lPos = FindText(0, &ft);
6 R" y& B% H9 v" n8 W, Y
- m  o% p- `5 |: q如果要继续查找,修改cpMin,如
' p: r& Q' @5 Hint nCount = 0;$ D% p# Q9 N9 Y
do
$ F' O9 n: c; z{, @/ w* I) `5 q3 @* D
long lPos = GetRichEditCtrl().FindText(0, &ft);. C; N/ `7 Q  ?! \* Y. Z; o& C& N) L
if( -1 == lPos) break;# m# K+ _) E8 f" [/ R/ O- x! l
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);9 y3 @4 ^3 e, C5 L" L# y8 _: v7 L, _
++nCount;
9 O" k9 m3 v& H' O}while(TRUE);
2 l- I7 \$ L  a
9 x) c& D! m& P% [% X5 @$ p" I* c# Kg.以Html格式保存
* n: t. v: G5 z+ {4 `; s# ~! B目前做法可先转为RTF格式,再通过RTF-to-HTML Converter
7 y$ @/ M, V: J  s7 phttp://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/: x* C7 q$ o! a# _! M# ^

/ J1 E, R3 H; m3 qh.重载OnProtected函数得到对应的消息,如粘贴等
8 i3 {) l, R3 L. Rvoid CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
7 p2 B3 K4 T+ [/ M8 d% a. X{
" u" |8 h6 t. V& D: T ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;. g6 M3 B8 p) L+ r2 E1 D% A1 Z

. N' |7 {3 c9 A8 |3 D6 g8 z6 j switch (pEP->msg) {2 i/ \* g  O- h4 @: {, S
case WM_KEYDOWN://按键,判断pEP->wParam% b& i# k* D7 v7 K6 c. v8 a# x# J
case WM_PASTE://粘贴4 m, q0 L( \/ r0 w5 m: k
case WM_CUT://剪切
( Y% G0 f/ S  G2 P case EM_SETCHARFORMAT:* Z: {/ Q/ \; v; i
default:
0 N6 I3 K: j; C9 ^) N  break;* G1 n+ _* V3 z: C
};& R6 \; ?' m6 a' }' \( t

2 F% D6 u: G4 P% I& ^5 i *pResult = FALSE;* \* H% n1 Y; Y7 T
}* Z6 J: j0 W) M

. M1 S& K+ R4 C, W( {, {三.聊天常用  # a* B, @9 q, w7 n
a.LINK 链接功能, c; U9 n5 f6 Y& R) a5 c
1.  LoadLibrary(_T("Riched20.dll"));# s. Q% r; A0 J3 P3 L
2. 创建RichEdit2.0控件% j1 e) ~; e9 q. e, Z
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP! i0 O( T4 p2 ?8 j- Z% @5 |  u
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
2 _- C# n0 B3 a8 O; I6 c          rect.left, rect.top, cx, cy,# r) A) p+ X( l, l( j
  pParentWnd->m_hWnd, (HMENU)nID, NULL);
7 E' u5 o2 M5 ?) V' h0 {, i3. 设定选中的文字为链接显示. ~( y3 S" m8 \: x' z5 s: ^9 o
CHARFORMAT2 cf2;0 L! `) k9 A: N$ e& f
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//# h' }/ ?; F& z$ ~
cf2.cbSize = sizeof(CHARFORMAT2);7 f7 }: p) ~7 s$ H, w% [8 I: S" l
cf2.dwMask = CFM_LINK;, P/ A( J8 `0 S
cf2.dwEffects |= CFE_LINK;
2 N/ ]# i+ @2 `/ L& @6 {2 u# r; rm_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
8 c+ s- y2 Z; e( H. I& }0 w+ Q4.支持链接的点击响应) A6 H0 o$ X6 U; {! g9 f( l9 B
m_cRichEdit.SetEventMask(ENM_LINK);0 z6 X2 W+ n& O
5.响应链接的点击EN_LINK
) G& v4 h, v7 O# W5 o5 _3 A
- f3 C  b$ O5 D3 i3 G- DBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
& F9 D. V. _, MON_NOTIFY_REFLECT(EN_LINK,OnURL)
1 G% q% h( M0 G  E" CEND_MESSAGE_MAP()- P- S( {. `2 w4 g! i* |
......2 o) M. n9 z0 T( l

+ A7 T+ _' C& p. k% [3 o1 _8 A. Xvoid CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
4 [, ?6 l, @. _$ Y+ f{; i6 \( j- N& h  W% _! a
TCHAR LinkChar[512];, l% \, v" `7 h' s
ENLINK *pLink = (ENLINK *)pNmhdr;
$ X2 T* d" P. a5 `9 f! O( fif (pLink->msg == WM_LBUTTONUP)
+ X+ @0 [) K: x4 `9 |) Q{
5 s6 |( _" M6 h5 NSetSel(penLink->chrg);//这是链接的文字范围$ A1 ]+ B: z. ?7 z% S
long Res = GetSelText((char *)LinkChar);//这是链接文字
" f2 m# b2 t1 C- [4 @- F# R0 m                  //后面是你的处理过程
2 ^" a+ }5 A. i$ C                  ......
7 i% ?0 m" S' t4 k5 n         }0 ^/ e/ R- H' m% k9 J9 b" L- F  B
}4 G) m+ p: v! B8 W
7 Z% M' w, A+ b: y% R, S2 x
b.插入位图6 [* ^/ e& W, [# [5 p
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/* `6 T8 C/ }( [5 g9 z6 u% D# M
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/8 U" y6 u9 w9 u2 w

% G+ _. M" f, e9 S3 F自定义在RichEdit中插入对象的图标
% c; o1 c* J1 F8 e' ]http://www.blogcn.com/user3/jiangsheng/blog/1319738.html2 Y2 o! j* ]& ]9 i6 w
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control7 j" c" |* G0 h/ K
只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片
* @, M) l" S- X8 d7 S0 g3 y2 j" R/ s9 J: O7 f
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
* D$ w  d6 [; [7 S4 [; s另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。 , I0 @, S; f, W) W

! N6 Z. C% g7 K5 wc.显示GIF动画
9 U2 H+ m* q* [6 W' B1 f5 E0 R" q常用的是通过qq的imageole.dll(也有用Gif89.dll的)
9 d, g  E4 j( E( ohttp://www.xiaozhou.net/cooldog/blogview.asp?logID=821 h5 A$ F1 I! R: F+ p# F- Z$ P
http://www.codeproject.com/richedit/AnimatedEmoticon.asp+ G- V( @; v8 f3 \4 Y( x: H
1 i3 D; V5 ]$ V7 \/ J
在richedit控件中插入动态GIF (Native C++版)
  M4 e+ Y! |7 i% l; ?# s4 H9 khttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
2 d1 \8 |2 m, m
3 J. u7 }* Z9 f, E0 v* f( {d.IRichEditOleCallback的使用
) J* R) M, |7 h: ?1 xhttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.83790221 G$ F. J. d" A

# ?& \( F. `( X! `4 T4 W2 n类似 MSN 信息发送框的制作(上)4 `4 Z' s3 J( V4 P
http://www.vckbase.com/document/viewdoc/?id=1087
% v* |' ?7 u2 q7 v4 M内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串! v2 O. H: }/ x$ Y

* _8 _( H$ {3 T7 o自定义 CRichEditCtrl 控件
4 O, r0 S  X" l# o/ Ohttp://www.vckbase.com/document/viewdoc/?id=328- N0 k6 G8 a$ m/ E
内容包含:鼠标右键消息,消息映射,字体变换0 h% Z- c# G, ?, R6 Z4 r

: |. `4 `' ]  J& j( w3 VPS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母
: Q  I# r/ C* K是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
/ }- _- X/ ]# T5 z1 b----------------------
9 I  e( i' j0 O3 Y+ u比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 11:47 , Processed in 0.017614 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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