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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题  E8 `5 P* Z8 p9 b& g) s" W
a.可以编译,不能执行的
/ ]' W9 E! m! k5 W1 `6 v0 z: b' j* dAfxInitRichEdit();
3 J. ]8 d1 Q  O8 v$ Y
2 u, K8 ^8 R5 r% P" r2 {. cb.升级默认的Riched版本(默认的有一些bug),如, h% A# g: ?) ?; N- K. l. h
可在InitInstance中添加' H3 }+ l: }$ T0 e5 G
LoadLibrary("RICHED20.DLL") - a1 ]2 G2 U; g) k
最后注意 FreeLibrary
) p* G4 Z) E' v
! b# S2 Y( Q9 Y, G6 e" H( I如果是CRichEditView基类的可用6 o  n6 t  o" O9 g% v
BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)! g0 r0 I7 n- q/ Y6 \
{
0 x# {- V8 B  V& {( k2 S//装入rich edit version 2.02 G% C+ k* g  p$ h
if (LoadLibraryA("RICHED20.DLL") == NULL)
: r. b7 g! W4 U3 D7 B; C{
; s! D: e) k3 ~0 W: V$ B- {AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);: K! c+ {! S6 \; W
PostMessage(WM_QUIT,0,0);
6 `1 V: V$ m# E3 T: z0 ~return FALSE;
( [1 S& _6 d4 ?1 n& w# c( I. x}3 o9 R" m2 U1 f. a6 |
% B2 P( `% i9 W7 k
m_strClass = RICHEDIT_CLASSA;//for 2.0 class" {( V2 J' ~4 O0 v2 @: u0 \8 b

6 Y5 U: s5 \8 x3 o' H! p6 creturn CRichEditView::PreCreateWindow(cs);. v) i! n0 J! A- x5 U7 g
}$ ]8 Y) p/ m9 b, ~# U$ I
0 e, m8 \+ g" m; G0 o" |
c.最后追加行
1 O+ z9 |  E0 B2 f# p5 kricheditctrl.SetSel(-1, -1);
7 \6 h  Z# X% U4 f9 yricheditctrl.ReplaceSel( (LPCTSTR)str );7 l+ ~' P( Z/ K1 t6 K) q6 ?
: \, f$ A' P" G9 C2 z
d.字数限制
) F& ?$ j) a# y- h, i# B1 vCRichEditCtrl::LimitText(long nChars)
! x9 Q8 {$ L4 J# \3 n8 {$ b- C+ w( ~
e.换行切换7 m4 r7 J; I& G  a+ e. |: U+ B
CRichEditView的OnInitialUpdate()函数中加入下面两句:
! Q" s/ k0 a: \! o/ ~( i6 `# H) @m_nWordWrap = WrapNone;  B: @5 A; d, z( U1 z; A) L
WrapChanged();
8 u1 q0 `/ C+ T0 Y, J* tWrapChanged实际上也是调用
+ B. m* _, L# l/ }% @) jctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone0 L" o4 C1 u" \7 m: i& U( V" N
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
" a; w! \/ l  f+ h! F  p3 j* C还有不常用的 m_nWordWrap == WrapToTargetDevice
# U5 n7 d7 T, O+ nctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());! |& v9 @6 [& F0 V! w
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
. H# C) y1 _- c- y9 ?* S2 j
8 `: b* O1 N7 L! if.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
3 X0 Z2 ^) l, T- a* l; @4 `/ ipmyRichEditCtrl->PasteSpecial(CF_TEXT);* w* a; e. y. s( d) `, \" }
# Y8 `8 d$ t; m; V3 e. o
g.随着输入随着自动滚动条滚动到最后一行7 z* I; I. O. W+ C
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();% H, [% L) W  u8 Z/ Z
if (nFirstVisible > 0); }: Z! m/ ]2 Q; a7 j+ H
{/ `" \. j0 P6 ~; O0 ]
   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);: W1 S+ V6 ?/ Z) A
}
3 _4 g2 l. H7 J& s3 t/ j+ ]0 r. A8 [9 r
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
( E/ W" d( p" o% o: K+ O: U- a& ]4 M' c, r) Q4 Q% |
4 [; S! t/ g9 _1 W5 J2 P
h.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)
  L, S7 m% {0 U7 _SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
/ K4 j1 O6 A) r  C7 N0 B+ vTM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 * p( x1 t) L# K8 |) r; U% z
SendMessage(EM_SETUNDOLIMIT,100,0);
# x8 T; h0 S9 Q3 K2 x9 ?
# s) G/ @* [' q& t# a/ ^i.响应OnChange
( P3 C; j; O. X% X, dEM_SETEVENTMASK 设置 ENM_CHANGE
# W: B/ ?( n# h5 Llong lMask = GetEventMask();
" ?+ N& j1 {! P! u5 ulMask |= ENM_CHANGE;8 Y  A( N+ E. ~8 |5 b
lMask &= ~ENM_PROTECTED;
$ p7 q' @' |5 E3 @# K5 RSetEventMask(lMask);, |6 U8 _' s$ a; Y

" s7 X2 p% z; f+ `# u! e! cj.设置只读
2 M4 ?$ r$ n" W  R0 v# ACRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );  \* I& O; J: p, _0 R
通过设置PROTECTED实现选中的文本只读,参见: K  I' O8 O% [0 S4 r/ Y! h
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/
( m! u# m7 q* `5 {/ A8 G3 |2 Q# C* U9 R4 K) O% E
二.函数应用' Q1 j  _7 C& N! \7 F+ \
a.设置字体(主要是通过SetSelectionCharFormat)  z+ R( i8 d7 T, d: C: E
CHARFORMAT cf;
; |6 Q, W2 I) z1 @( krich.GetSelectionCharFormat(cf);
$ H$ k1 B/ z3 a2 \cf.dwMask|=CFM_BOLD;
% S" D1 U! T% o+ B3 s  G1 |cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
! {$ }5 b% o. a: v- f9 [& Hcf.dwMask|=CFM_ITALIC;8 K1 R4 k/ B, \: Q
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
: A& F  g) [: V- Rcf.dwMask|=CFM_UNDERLINE;# n: b1 g* i( \# N9 W/ F0 \# b% M4 f6 B
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;* h' ]0 S5 c# D5 j# ~  T9 v0 ]6 O5 l
cf.dwMask|=CFM_COLOR;3 m- c5 I* k. B5 x  x+ p# k
cf.crTextColor = RGB(255,0,0);//设置颜色
" g7 D: J% }, lcf.dwMask|=CFM_SIZE;" c0 P' }: ^+ t) @- ]3 Z& p! d8 |
cf.yHeight =200;//设置高度
% o. C+ h+ w( g5 |# hcf.dwMask|=CFM_FACE;
# o, i. H" k, j& H, tstrcpy(cf.szFaceName ,_T("隶书"));//设置字体
2 f, T1 G7 ?, |  u* Nrich.SetSelectionCharFormat(cf);
& m2 X; f3 \' s7 B+ e
* b! d& C% L7 c( ]; ]b.设置字体的行间距
# f8 |( i, W% x4 W( j% k( o+ t要用richedit2.0以上
' c7 S! X# F9 s' O/ O7 T试试
: [; S0 G; l; d* s6 b1 OPARAFORMAT2 pf;
6 p: Y& M+ d) m% I3 T  g) Ppf.cbSize = sizeof(PARAFORMAT2);
4 r/ F$ E7 O# y8 I* ^pf.dwMask = PFM_NUMBERING | PFM_OFFSET;
+ b' v/ n, K  c  ypf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
/ T$ R' C# f3 ?8 B9 p+ u$ npf.dxOffset = 10;$ x1 _* r$ N+ o! z+ R
VERIFY(SetParaFormat(pf));
5 r( y% Z/ R9 S常用的dwMask有% J- @6 u/ U) q( Q, x
PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET& a# D8 l- G6 ^% P
2 使用阿拉伯数字 (1, 2, 3, ...).  " \7 y' f1 {6 s3 ^
3 使用小写字母 (a, b, c, ...).  $ D+ f) |2 F) {/ N- W; g; {
4 使用大写字母 (A, B, C, ...).  
& B' m9 l1 Y) O$ `- ]$ n5 使用小写罗马数字 (i, ii, iii, ...).  
+ g3 V! `0 H1 c+ a+ [4 ?) j# p" j6 使用大写罗马数字 (I, II, III, ...).  
$ ^2 S7 |$ h" U2 s: k: P7 自定义,字符见成员 wNumberingStart.  7 D; M( s# L0 W, a* j# X
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
" J- Z2 U4 k7 UPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进
& z1 Q9 s) N- f, EPFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
3 J* G# c4 f: O8 W  m& WPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
: H2 a: k  W) z5 w. C5 i# M. ~% s; W2 J( c7 w& k* H
c.设置CRichEditCtrl(2.0)背景透明
5 A& A" {6 v- o: ]: F2 y1 ylong style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);% T. ^2 _8 c# F* q& X# b; Z
style &= WS_EX_TRANSPARENT;
) M: \: ]% D, l2 S- d::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
4 f& c0 t! x1 ]7 y9 B或 CreateEx,然后把WS_EX_TRANSPARENT样式加上- g6 f5 g& L* S
/ a. a# c6 b8 j/ ]0 U% |4 Q9 e
e.得到内容有三种" S/ W& n! m$ {( |6 @& `7 T* a
1)GetWindowText
4 L' X3 N% v" z! P* I4 t2)使用EM_GETTEXTEX
+ ]1 ]$ J) s: ]: E8 y: b2 a! bGETTEXTEX gt;
# a: W6 R4 d1 O# ?gt.cb = 200;( e- N5 F2 p0 {
gt.flags = GT_DEFAULT;. ]2 @+ t( o7 q+ y3 x' {
gt.codepage = CP_ACP ;- ?- U8 B9 {  f5 q+ f2 N/ K( x
gt.lpDefaultChar = NULL;
" C3 Q) O3 Y1 x# z1 y5 S  dgt.lpUsedDefChar = NULL;+ l6 S+ @' a: f# R6 J
SendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
8 I& E0 s( k% Z* _$ c& K3)StreamOut(主要用于RTF等格式输出)
* T  y4 N9 h; F* Y7 F! g$ Ostatic DWORD CALLBACK ; f9 y5 i1 I- H$ f: V1 X
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
! P* o& p3 u3 D4 B$ J9 n, D9 ?+ O{# B6 m( L. q- Y  L0 ?- `7 w$ i8 u
   CFile* pFile = (CFile*) dwCookie;
% r, ~# N4 C- w; K8 s: X# g+ ^% e
3 j8 T- r- s9 b" A. x   pFile->Write(pbBuff, cb);9 u! N1 K& j; S/ \/ k; v
   *pcb = cb;
+ K( R3 h$ d$ E2 o! q* M* v9 C! C; f  F
   return 0;& B6 U$ e$ h7 T/ [/ Z7 h! x
}9 ~7 B* r4 Y7 E6 r
% q8 \  B- A" M) p/ m% ^, W

6 N9 N) I$ L) X" W2 z2 r   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);' K% a3 `4 ~. b/ K* B* {7 r8 f
   EDITSTREAM es;
" G4 ]- ], N5 z* q9 g   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用
" C) F. ^/ A# r4 @# s   es.pfnCallback = MyStreamOutCallback;
; }8 B! d/ y' h: ]. `2 r: w   pmyRichEditCtrl->StreamOut(SF_RTF, es);
  i0 @* J% d! T0 g: m( x读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn
0 y1 g+ k) h4 Q" u, W& R! H( @% k* r% S/ ^3 P
f.查找字符串8 w: P* F! S% U) Z* Q
FINDTEXTEX ft;
8 J+ r3 j% v! S, w* vft.chrg.cpMin = 0;
- z+ c- V  k1 n/ Qft.chrg.cpMax = -1;  G9 B: C* q6 M9 r9 ?% x
ft.lpstrText = "|";
" N8 Y) Z9 j! z: a% Ilong lPos = FindText(0, &ft);8 i  X# G" l; ]8 I' \$ v# e
! n# M0 X  I+ p5 U5 w2 t: B2 S9 K% _
如果要继续查找,修改cpMin,如
/ q0 o+ p! R$ u' W$ z) a  k) Xint nCount = 0;8 J8 I! Y  q# h5 S3 n, @6 g# x
do9 r- u. u( m& S2 B: Q5 F
{$ r+ l% ?& @: o) }+ N
long lPos = GetRichEditCtrl().FindText(0, &ft);
# a. e! z* Y; E0 D# B" P+ j- G if( -1 == lPos) break;% n% w& E) X. f% T* Y
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);. U; D% J# }" K& o% I4 T9 X0 {5 M
++nCount;
4 W& z" ~- h; ~& J}while(TRUE);
; x6 \) p9 B$ p5 ^; \5 Q# R( L0 R4 `7 K0 ]2 L. f* E8 J
g.以Html格式保存3 b# v) @: v! p. ^
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter: L: `' d, y1 L' s/ U% K/ F
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/
8 Q* I* d) j) v' `! c, e" L4 ~
/ w& F, k' H2 g: K+ vh.重载OnProtected函数得到对应的消息,如粘贴等3 w, u6 u8 Y6 ?
void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)9 \# ~, |2 d2 o6 K0 w
{
; S3 a) Q5 I3 b. s2 e; ~/ x ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
3 h, \7 z+ @6 t4 x# z! o- ?  [$ Y# ~2 h5 _+ z9 v- x- Y
switch (pEP->msg) {; N: W( z+ ]& l
case WM_KEYDOWN://按键,判断pEP->wParam
0 m4 i: i4 x4 ^" f* q, F case WM_PASTE://粘贴, i2 j0 m5 K$ V$ j7 ]# v& k
case WM_CUT://剪切' Z9 i" {# j+ \0 ]0 i- |5 V2 A
case EM_SETCHARFORMAT:! N) ~" G. p- K
default:! }, c# }! m4 O% e' @- ~  c
  break;6 {& }( h& S8 m$ M- O
};7 u7 L8 {; z3 m4 M( H+ W
: H" e4 a3 s, m: H7 F5 m: @1 s5 C
*pResult = FALSE;; D* c. P& w8 Q' {
}
5 K! D- B# |- f, F. i! N+ I* a5 H6 X8 U6 S
三.聊天常用  ) ]# {3 B- }; ]
a.LINK 链接功能
- k' e* B1 Y# y4 T# i: E$ T  f1.  LoadLibrary(_T("Riched20.dll"));
! h7 W, v7 l( {" z5 l2 ~( W2 H# O# _2. 创建RichEdit2.0控件2 |& ~; D6 F' D- j8 G1 S- y- O
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP- }$ h: F  F0 j" f) f) N( @
|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
* N, c( E4 f9 [  d9 A( Z8 d          rect.left, rect.top, cx, cy,, F! `- K. w2 R( j# W! d3 E, j+ P
  pParentWnd->m_hWnd, (HMENU)nID, NULL);
0 E* @' Q: O; p* z3. 设定选中的文字为链接显示
+ f4 _" V9 Y9 [9 h$ b, hCHARFORMAT2 cf2;
4 g& ]4 ^' `7 F4 i8 XZeroMemory(&cf2, sizeof(CHARFORMAT2));//
" D1 y, P& O  U% c( ]: x* M: q( Fcf2.cbSize = sizeof(CHARFORMAT2);5 T4 W9 d' I( N
cf2.dwMask = CFM_LINK;' C( t; ^7 V) I9 I% l8 v
cf2.dwEffects |= CFE_LINK;
  r0 p! B# d  d" y! w  o8 ^& d$ Vm_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
, F0 _; J: e% V4.支持链接的点击响应
( ]; l2 B' x) vm_cRichEdit.SetEventMask(ENM_LINK);
: o/ o# Y% N- }5.响应链接的点击EN_LINK
. a& V: W) y1 X' C7 I& v# n9 L9 ?- C, C! ?* Z( Y6 D  s! h+ O
BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)% \& K3 b3 ~8 G2 Y# h$ w
ON_NOTIFY_REFLECT(EN_LINK,OnURL)
+ c" V: T. g9 f. W7 `END_MESSAGE_MAP()4 C1 R# _; J) q! _
......; j) [2 i8 \! p; N# C

# Q5 b/ F' M) J& Uvoid CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
; Z  i2 C# B5 ]. [4 W# c6 P. `{
( N: B" R' p" d7 w( y0 T8 P+ \TCHAR LinkChar[512];
; L9 Y- X7 O. Y7 K9 |, lENLINK *pLink = (ENLINK *)pNmhdr;
7 W  g" D2 C6 {" Wif (pLink->msg == WM_LBUTTONUP)) t  u0 w0 @8 v. F8 Q
{
$ G) K6 l. ?; ?7 u- g# d) r8 @SetSel(penLink->chrg);//这是链接的文字范围7 l& @% {$ ]* s. o+ v- F6 F7 x" A; ]
long Res = GetSelText((char *)LinkChar);//这是链接文字! F% h* J* p+ l5 b
                  //后面是你的处理过程3 a6 V5 }# `2 ]; v. E$ [
                  ......
: {8 h- G5 B3 W         }7 f* Q! ^2 V9 _" {. J* v
}
- y5 ]$ a" w. j7 T/ i
5 c# i' U% ?# F, F1 s( Z) Db.插入位图8 L2 ~6 [. `* i
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
$ A/ j1 e' i: K! B2 L& shttp://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
. A8 N$ ~/ b* Y# \7 l; k- M$ m
$ @. K- m$ C( o! D9 I自定义在RichEdit中插入对象的图标
* K! ^3 Z9 [; g) e2 Mhttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html7 k+ W: C5 W% ]
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
) V/ |4 v7 N1 |0 n只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片8 e; r2 Y8 \5 A; {" u. G6 I, _$ q
0 Y9 `( K9 E- a/ ^' E! u
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。  P5 v0 \$ q7 f: q1 Z
另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。 * i# u- k/ k5 f- m1 a! O; Y
  z5 D4 q; N& G( c. t: G
c.显示GIF动画4 X* O$ h- z8 R; ?" \! b
常用的是通过qq的imageole.dll(也有用Gif89.dll的)2 z" u  J/ V& F# I1 c) z+ d8 r
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82* D( Q; c4 \8 h
http://www.codeproject.com/richedit/AnimatedEmoticon.asp/ j+ ^; H6 g! \4 a. ?. S

6 x* a6 E9 [- ^5 A8 J# s; Q在richedit控件中插入动态GIF (Native C++版)
  w9 `0 i' d8 Z4 J( @4 i1 ehttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx% N( J5 B7 ]# E1 {2 a( s* }
* [- y: [2 h. c$ V3 V
d.IRichEditOleCallback的使用
1 V4 d6 c; f1 t) H: E& c4 yhttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.83790225 s. p, c+ t# f9 R

$ `1 w  e) p7 Q, ~# Q! R9 Q类似 MSN 信息发送框的制作(上)
9 v2 G! G3 l7 o8 X0 \+ v! ?http://www.vckbase.com/document/viewdoc/?id=1087& |5 h- r8 x0 G* M' d3 B
内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串6 L+ P# c* o; K" E* J

0 b' e" \% l0 C! P- j1 `) X% F自定义 CRichEditCtrl 控件7 b3 z7 v. H/ M; U2 f" X/ w6 O1 D
http://www.vckbase.com/document/viewdoc/?id=3288 o* K) n( N& F; O9 @# q
内容包含:鼠标右键消息,消息映射,字体变换2 q& Y' k: y/ w
- q1 U/ w$ ?& ^6 t- n( \
PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母5 J4 i; Y" ]: L; e' ^% u! K: _
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778 " B& B! {+ s3 D1 j7 M9 w
----------------------
8 d$ R8 L( T# t比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:08 , Processed in 0.035349 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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