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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题: O) D5 P# o+ M
a.可以编译,不能执行的
* K' s7 E$ h# X4 [5 PAfxInitRichEdit();
' o, j  [. k7 E- c2 {+ A2 n# w) ?4 \: Z8 Y$ E* C
b.升级默认的Riched版本(默认的有一些bug),如. s% i7 o- T+ j$ k8 ?% R; x
可在InitInstance中添加  w7 N! P( l5 f4 z/ C/ C
LoadLibrary("RICHED20.DLL") : M$ a2 b( p# ?1 i% }* V) P4 y4 n! e& \
最后注意 FreeLibrary
# N, s: g5 {6 i( Q2 w4 d+ C( V0 f' z9 @0 M; S+ v* k0 n1 p1 G2 {" s
如果是CRichEditView基类的可用
" D  P) `9 F6 M9 F$ e, C/ c8 nBOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)  s! _" @* S* Y! C
{! u2 j* M! D5 N! R6 j  A' @% L/ K
//装入rich edit version 2.0$ I, y. K  h$ N" T9 y
if (LoadLibraryA("RICHED20.DLL") == NULL). ]5 q# n2 M4 A# g! @
{2 i3 N/ `1 N1 R0 g+ r" _
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);
& u- M# @/ q. z4 b6 |PostMessage(WM_QUIT,0,0);1 ?- Q$ {- s) i# z
return FALSE;
: G. e* V8 `( @8 r# H}9 D, E5 d" Z5 k; J6 {

  \# U* k" ~" c5 X; pm_strClass = RICHEDIT_CLASSA;//for 2.0 class
+ N# N- Y) Z$ [: h& p
6 x3 D; U# O- |, G- _! Z/ f) Mreturn CRichEditView::PreCreateWindow(cs);
/ |- h9 N7 K- x% r' `% Q* a; N}3 x' t7 v# }. o  T
2 G, T& ^7 Y& T. U* n
c.最后追加行
2 @5 A1 R5 \8 L1 v8 Hricheditctrl.SetSel(-1, -1);; ^: j! G/ @. x0 x- u- {
richeditctrl.ReplaceSel( (LPCTSTR)str );
" D6 F6 k( w8 W0 V. G# v( n4 Z4 E8 l# ?- s7 r4 }1 D
d.字数限制
  J, s: k" l. Q6 M$ sCRichEditCtrl::LimitText(long nChars)3 v3 A: A0 P: ^( @

! H" K) }' z" Z4 w! pe.换行切换8 _: T$ V; r- J, r' o
CRichEditView的OnInitialUpdate()函数中加入下面两句:5 C' t. F$ x9 J9 E+ |7 a) j
m_nWordWrap = WrapNone;- D) g, {5 \: ]& }, I) l2 K8 I
WrapChanged();
: ^( Z# a( ?( rWrapChanged实际上也是调用& C* N+ `& e  b& Q( P! p
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
" k  B$ Y. S: A" Q: Jctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
: l2 C8 W7 c, x- a9 g2 C还有不常用的 m_nWordWrap == WrapToTargetDevice
$ K' e# ?3 ], r# {/ Q% |) Y. octrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
0 U3 Y5 m9 Q4 s* G$ c8 P如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
$ x( @+ F$ A- r9 |9 v" ?4 `& b+ i8 B' f$ F. s
f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴. [6 B( T& h5 i$ C
pmyRichEditCtrl->PasteSpecial(CF_TEXT);/ x7 {4 i: R" r5 U% g* X+ u- X
1 G; H2 K7 P) o
g.随着输入随着自动滚动条滚动到最后一行7 a( |; e6 ^, V0 `) `' k! J
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();
/ Z, M- a3 e4 T7 ?if (nFirstVisible > 0)7 v2 }& @  s- {: g
{0 D  d7 {2 v% l/ i# L0 c3 b9 R
   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);. J3 Z$ r/ g/ y8 o. k2 ~2 d
}
+ r- U) w4 Q* Y: G, Y0 z- ]3 M- K8 `! a5 a/ y# {
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
& {# H% V  v2 ~$ R
0 i  R5 N0 J* u3 D8 U+ d! [+ I: p/ S
4 W6 @2 E! Q" B6 o% f" O5 Rh.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级): v. c2 Y5 q3 o5 w/ S$ a) \* @
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
; ^9 m' c+ i$ @" k* Q. m, a1 \5 \TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数
; `# Y3 D, Z  w9 X- vSendMessage(EM_SETUNDOLIMIT,100,0);
$ l$ K( z2 b; Q* G  t9 H+ f
5 Y# e$ E! i" C$ w9 X- fi.响应OnChange- r+ {9 V9 r# u, O! U* F- `4 m
EM_SETEVENTMASK 设置 ENM_CHANGE
6 k1 C5 `% M5 U7 m  |4 elong lMask = GetEventMask();3 o' v! u: [% P' ]9 t
lMask |= ENM_CHANGE;$ j' i9 i) @- U. Q3 R3 \6 `0 D
lMask &= ~ENM_PROTECTED;
- o. ~; u$ U' s& J1 W& kSetEventMask(lMask);2 ]. |) W; C5 K4 U1 j
% a: c: V( Y  j, r+ f; v
j.设置只读1 X- e' w0 {1 i; N/ ]
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );2 O4 I9 C, L- }% }2 b/ C4 R. u. l
通过设置PROTECTED实现选中的文本只读,参见
( L; V* k, R8 X' Phttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/! `# I) Z5 r/ L# I3 ]0 L

( p, R$ |! }5 h! E4 O5 Y二.函数应用
7 N$ `, H" S* D! X$ v( Ya.设置字体(主要是通过SetSelectionCharFormat)! V: b. r/ F5 L( v% B
CHARFORMAT cf;
+ D/ w$ o; W# Y0 Drich.GetSelectionCharFormat(cf);
, w& u$ Q' k  S# `6 dcf.dwMask|=CFM_BOLD;+ I6 L6 f# q* z) X% a9 U/ q
cf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
% C5 e/ W$ f7 o2 hcf.dwMask|=CFM_ITALIC;% i& x0 V) j9 s# n: F1 J
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
" R1 c: h2 ]% ccf.dwMask|=CFM_UNDERLINE;
3 T1 H$ H  r" [) [cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
+ _8 S! z' L7 Xcf.dwMask|=CFM_COLOR;
. }9 s7 J  @/ U0 A7 @5 pcf.crTextColor = RGB(255,0,0);//设置颜色8 i; f2 i! Q; W# z/ Z
cf.dwMask|=CFM_SIZE;& X/ d& g2 S* A5 [
cf.yHeight =200;//设置高度6 y. @$ a: Q5 N3 n
cf.dwMask|=CFM_FACE;
7 @4 D. {% D4 D' b% h* l: kstrcpy(cf.szFaceName ,_T("隶书"));//设置字体! }, e# i2 j# X& ~
rich.SetSelectionCharFormat(cf);" G: Z6 e9 z# C8 \7 g+ c

/ k6 h4 s6 T7 h/ }b.设置字体的行间距
/ H0 U+ S* H" p" o要用richedit2.0以上
0 P' D1 [# i  e( T5 X试试
1 _( H% c- i7 j3 t! HPARAFORMAT2 pf;5 s/ w1 N& ~9 _- I7 G& L+ Y- I
pf.cbSize = sizeof(PARAFORMAT2);
. p' R4 @" x; p* Ppf.dwMask = PFM_NUMBERING | PFM_OFFSET;
- \3 a! L1 ~, p" Ppf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
) _: C4 d. J: Y8 ?1 o6 Xpf.dxOffset = 10;
: L% ~! S0 J5 X3 X4 o4 c1 IVERIFY(SetParaFormat(pf)); ; p/ g$ T9 ~5 j4 q
常用的dwMask有
  }, u4 |* g* V1 ]) VPFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
& w' R5 Z5 n6 s3 R# L& L' H9 u3 B  D" @2 使用阿拉伯数字 (1, 2, 3, ...).  
( K% C/ q: v1 T3 使用小写字母 (a, b, c, ...).  
' x+ m3 D2 T# B1 E0 g: E4 使用大写字母 (A, B, C, ...).  - b& ^( w; d* `
5 使用小写罗马数字 (i, ii, iii, ...).  ; ^, ?8 ^5 @8 N7 L
6 使用大写罗马数字 (I, II, III, ...).  : D7 H0 b1 H- w9 p
7 自定义,字符见成员 wNumberingStart.  / R% F1 {$ V3 J1 S% ^
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips/ K" y* D6 S& f9 o/ h
PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进7 ~1 Q2 B! U/ V7 M2 _9 O5 D
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
) M" \% ]$ u1 I* v" M, |; WPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距3 g; Q. q2 J, v

+ V. n2 |6 u) q6 {, v5 W9 [c.设置CRichEditCtrl(2.0)背景透明 / O; G4 k2 x- Z4 j* k' _
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);, a. ]* N2 w5 Z" E( h
style &= WS_EX_TRANSPARENT;- y0 [9 ]) |( P( u- E! s
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);
, \6 h$ [8 O$ @2 x. H8 W! u或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
- v0 A* V0 q" j5 V1 e! e3 j. g( m
' M% z3 U. E3 Y0 ]5 [e.得到内容有三种$ }& J3 j) R1 C. ~% c' x% F' Z
1)GetWindowText0 \/ y5 J! ~4 A9 L$ _( q
2)使用EM_GETTEXTEX
+ C* G! _& r& A# o8 i; AGETTEXTEX gt;' }  Q& a( B) v
gt.cb = 200;
0 ~# N  J4 @1 ~gt.flags = GT_DEFAULT;) X5 P4 g3 ?0 w) X% m9 I
gt.codepage = CP_ACP ;
% u  p( k, ~! \6 R" X$ K& M& ^gt.lpDefaultChar = NULL;
& `( c5 u' o4 ^; Xgt.lpUsedDefChar = NULL;
1 j: Q; V8 v$ p- w* nSendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
5 o' O& S# G3 g- n& M* p7 T$ F5 v3)StreamOut(主要用于RTF等格式输出)2 `/ r$ p* S: [+ B4 N5 D1 p
static DWORD CALLBACK
* P' Z& I" i* S6 d% ^: S+ C: eMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
2 n$ p: \2 l$ L, f. }9 f6 g{) Y3 P2 S( P3 n2 T8 I  C
   CFile* pFile = (CFile*) dwCookie;# U; z6 T$ A6 @$ J

  |) C7 C9 R; g$ q( N( |. f   pFile->Write(pbBuff, cb);
' Q" \; P% Z* H& b- x5 K$ V6 Y9 z   *pcb = cb;
0 l) }) T& e' Q; z3 _
& ]/ {+ j4 ^3 D   return 0;
  N) D/ h8 U' K# J6 y}
6 d) ?3 Z9 Q$ O! c; I* v0 M
) O- G$ Q, T2 ^& F+ d" c1 c- v$ }9 K0 B8 a3 S" \  ~6 a
   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);( ]$ s2 T3 k) u! W
   EDITSTREAM es;# f, K  O7 M) ~2 l' ^9 O' |6 K3 K
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用6 _  w6 s# V/ B4 W8 c
   es.pfnCallback = MyStreamOutCallback; # x$ s! e. g& p
   pmyRichEditCtrl->StreamOut(SF_RTF, es);1 ?9 Y; J! @6 m; b( a
读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn6 O4 \8 }% `2 N2 I8 }
9 {+ ]! E& y3 h1 g" i; {
f.查找字符串
" P' ~' `% t5 @9 h& a; XFINDTEXTEX ft;' h. Z! M/ j; D" C
ft.chrg.cpMin = 0;# Q/ X$ r1 A* w* |! l+ b- \
ft.chrg.cpMax = -1;! S; U0 J, V! Z3 A
ft.lpstrText = "|";# y: ^3 N+ r3 v- E" s3 r7 }8 @0 q' K
long lPos = FindText(0, &ft);
5 P0 l5 p) B+ Q( D0 c# i& A* y3 b3 z' |% y, N- A
如果要继续查找,修改cpMin,如! F& c& Z4 H0 o( ~7 F; T- B
int nCount = 0;% y0 k( y7 U* U1 `/ j5 p9 R
do
' R/ z2 S) {8 D. ]{
* I& L) v: J! R4 i" B9 [# G long lPos = GetRichEditCtrl().FindText(0, &ft);4 Q( a$ y2 R8 u( C& j& \7 Y
if( -1 == lPos) break;; H) Y1 N1 Q( u* z
ft.chrg.cpMin = lPos + strlen(ft.lpstrText);9 X8 O  [/ l+ G& I) I
++nCount;* C' s- y  V! |- ]. @2 _
}while(TRUE);- @# y/ g' u! l7 {; W3 i
( U" w7 Z( e- O: u) b; B8 P
g.以Html格式保存2 d' b& v% n$ M$ w/ f. n
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter9 T! ]2 ^. H: I- M3 B1 A
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/( }% `' J( o5 W/ @
& m1 h& O# ?4 o) B
h.重载OnProtected函数得到对应的消息,如粘贴等
# }# M" D" _2 h, evoid CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
9 O  t7 H  f6 W* S$ v! Y' E{
& P! r- H7 H- O6 V5 o ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
- H2 N2 `1 C  ^, }( h3 M# E/ x! v  U1 I4 C* X( T* [9 b4 p4 w# P* z
switch (pEP->msg) {
" z% t! U8 d9 j4 L8 ^ case WM_KEYDOWN://按键,判断pEP->wParam
: _7 \' k* o, |( V4 W% j case WM_PASTE://粘贴& \9 t' i) {2 f8 K! U& L
case WM_CUT://剪切1 B2 P9 Z7 {/ [9 H+ B
case EM_SETCHARFORMAT:" c1 N+ }% X/ c) Z( D2 I5 `  a5 h
default:
/ ^4 a0 J7 e1 v+ T7 D6 S  break;
3 R+ Q" p1 u3 ?7 ~ };: u+ e+ E: a/ n7 H$ D; l8 B% s5 g8 P

& H3 U5 M. j" W$ t2 G *pResult = FALSE;2 [( n5 N9 _0 _# ^' I7 F% g1 k" `
}
* |; X; ~1 G9 }& Z' N! |- f! O( }6 G5 Q% M! A) c- Y
三.聊天常用  
, ^7 P+ k; C: v$ K3 qa.LINK 链接功能1 \7 S: S$ @7 I1 T9 u, c9 L. i* m
1.  LoadLibrary(_T("Riched20.dll"));
  P1 C6 G( R2 ?3 \1 G2. 创建RichEdit2.0控件
4 C5 G$ R2 T) b. q3 Q' b- v CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
, ]- ~% e( \* w, q( s9 F1 m|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
9 p; \! |1 n* w' u          rect.left, rect.top, cx, cy,
) x9 c; h" a9 I3 I  pParentWnd->m_hWnd, (HMENU)nID, NULL);
. P4 S. f" V- @1 Y+ E9 J3. 设定选中的文字为链接显示  f! N/ K5 \' o( Q6 o
CHARFORMAT2 cf2;
5 [+ [- Y$ D5 H1 m; G* y- kZeroMemory(&cf2, sizeof(CHARFORMAT2));//
/ U0 M$ I4 @: }( f6 |cf2.cbSize = sizeof(CHARFORMAT2);
* c9 |+ D' ]' }cf2.dwMask = CFM_LINK;
+ T/ O1 z, ^- h1 S1 y6 ycf2.dwEffects |= CFE_LINK;
0 H+ X- p  L" B; q( |m_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);, O+ _0 x, C0 Q: B; d
4.支持链接的点击响应- m0 |+ l' v% v$ }
m_cRichEdit.SetEventMask(ENM_LINK);
' Y5 s! Y1 Q; x  |: z: Q5.响应链接的点击EN_LINK
. y5 v9 \# c3 X  k: _6 s. q: P1 y5 A! u0 y) h* B; ^
BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl); _9 i. D  x. Y* g. j
ON_NOTIFY_REFLECT(EN_LINK,OnURL)
) Y- Q# g5 z$ A0 {END_MESSAGE_MAP()- ^5 Z7 M5 o0 r: u0 M$ X
......0 d' V( w; n1 E& l
, R* p- O+ V' Q6 h+ {. I1 z
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)3 c  r7 d+ |# y8 q% y2 |( v
{
! `) h( W4 p4 O8 v- a# uTCHAR LinkChar[512];
$ j  S8 Z& q1 F: N0 ]. o/ iENLINK *pLink = (ENLINK *)pNmhdr;
7 j- W8 `. ?! Q4 c+ yif (pLink->msg == WM_LBUTTONUP)
2 l* @: X. n& E* {; R& z/ e6 |{
* v+ M: `9 d/ h+ W, A0 PSetSel(penLink->chrg);//这是链接的文字范围
- N3 K5 p* p5 `" Plong Res = GetSelText((char *)LinkChar);//这是链接文字
, r6 `6 @, u1 Y                  //后面是你的处理过程5 F# J2 _0 H. S  p% [- [/ d( E
                  ......
4 D: R7 d  ^3 o" K$ O         }
& o/ t" n- i* ~: j5 P2 x8 u# |}& S$ S: v! z. ^- @

. i( f- z) T7 {( D  zb.插入位图) W, _+ H, N4 E5 U5 j
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417// ~! @, ~3 b; k" {3 |9 A8 C( [2 n
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/
4 B: q1 R3 W8 y& t1 y: v. n
8 p; z+ o8 u" A- j1 V8 {4 M* D自定义在RichEdit中插入对象的图标
% {7 a' G2 r4 A5 l* M- ahttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html  ?: j8 y) W! N3 Y
方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control
6 Q6 C( E6 \# s& j9 g" ^4 o只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片8 H3 R& \. m4 D! ^7 |1 I) n

9 X% d2 Y% K$ e使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
- ^0 `  K8 |. K$ @2 g) j' U) X0 z另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。   ^; J" L/ ]" X; s+ ]

  X, P2 m, d+ f: Yc.显示GIF动画- C& b. s8 B- h6 x/ ], |/ ~
常用的是通过qq的imageole.dll(也有用Gif89.dll的)( h3 k  L1 f- s& u; L- F
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
+ a+ q% \! |' j; nhttp://www.codeproject.com/richedit/AnimatedEmoticon.asp
( S% ~% s0 k) t: J; B* f* I: ^1 {
在richedit控件中插入动态GIF (Native C++版)
, {( x6 }  F# g: m7 s! t9 X9 Ohttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
3 A1 h2 t6 G% F! B# P' c) J- \0 c, x/ c. h, o
d.IRichEditOleCallback的使用
  b6 {% G4 _3 R. g% |1 }; L- Y& Bhttp://61.186.252.131/Expert/topic/905/905844.xml?temp=.8379022
/ S" R( f; V0 G7 Y) ]7 v, R0 b1 g  S; {6 M) y
类似 MSN 信息发送框的制作(上)
0 h  X5 N, G! n: @5 bhttp://www.vckbase.com/document/viewdoc/?id=1087
' S) a) e) R- r0 a1 Y' R% y4 {# q内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
- t: p" z# l2 _, e1 ~: m  M" ~+ Y5 C" v) X" ?3 g( Q0 M2 Z
自定义 CRichEditCtrl 控件$ f4 Q, M, |7 \8 c% I1 y- A
http://www.vckbase.com/document/viewdoc/?id=328
: |5 Q4 e: J( Y2 h/ ?3 D内容包含:鼠标右键消息,消息映射,字体变换
4 ^5 X& `7 T' I9 s& @
7 E$ {* c4 @( u; r; D: nPS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母
$ {) p7 R8 y6 P9 G* [: W' @" i是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
* n- H# B8 H! q! d8 N  ]----------------------* ~- M! p4 s7 @  H7 |
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:42 , Processed in 0.035505 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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