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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
. Q; \6 c. @# {a.可以编译,不能执行的
7 j/ P" I$ T6 y0 W* k; Q) `- FAfxInitRichEdit();
& l& V/ _; V, _) Z% p9 x# b& K0 q* e4 _( F$ x+ d2 A+ D0 Q8 J
b.升级默认的Riched版本(默认的有一些bug),如$ }- C4 |' l2 V$ i) j! R1 M
可在InitInstance中添加
0 E0 K  T( @* E1 j! iLoadLibrary("RICHED20.DLL") 6 `  K" q- g! }: i
最后注意 FreeLibrary
  @" s2 r8 D& x6 p! ?. g! u( S
( b- B  }8 h8 a1 P如果是CRichEditView基类的可用
2 ]! a' y/ S1 w1 IBOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)
, F) n1 d2 W* |. U# H7 N{4 l- o1 c4 D  F$ O
//装入rich edit version 2.0
6 B; F! F* _3 n0 w  M) }( e. ?if (LoadLibraryA("RICHED20.DLL") == NULL)" T- b# M$ w, K) y
{( W4 n+ e2 j! }( Q' R
AfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);! g; v2 D( [; [# o. `7 P
PostMessage(WM_QUIT,0,0);
( I% e/ O7 r8 h. O6 I, f) B* J# Mreturn FALSE;. k5 K& n* i9 D# A) Y
}3 J( P( m3 J; w% W- j( R* u

4 L& x9 o9 Z/ ^9 ?- _% @6 Fm_strClass = RICHEDIT_CLASSA;//for 2.0 class9 B2 [6 V  T# T$ @% b

3 {" z+ `+ x/ j5 c; `6 x& hreturn CRichEditView::PreCreateWindow(cs);+ w% \3 t5 g! _0 E$ d8 f
}
+ M/ U. }' M+ G4 J1 x
5 e! T  I2 b0 G, g8 j: vc.最后追加行
1 d4 {  q) _4 h+ D0 e/ Y8 H! Ericheditctrl.SetSel(-1, -1);7 ~/ G  x2 P5 z: e
richeditctrl.ReplaceSel( (LPCTSTR)str );
3 v- e2 F7 Q3 j9 a3 v: h: `) g0 N* d; T
d.字数限制
) J( \$ U! ~; e( E( d# z5 K+ \2 Q2 kCRichEditCtrl::LimitText(long nChars)+ v$ H4 K4 E& c
8 h8 U' ]; o' K7 ?$ ^/ i) l
e.换行切换$ Y8 f! s* c2 R* u; r
CRichEditView的OnInitialUpdate()函数中加入下面两句:5 w1 R& Z1 L8 @$ d+ L0 m% |0 M
m_nWordWrap = WrapNone;
& |9 D$ i) q5 w6 y# MWrapChanged(); & p. O0 l( n7 p3 [$ x; K
WrapChanged实际上也是调用% T3 J& |3 I3 T. g: y4 q  E# n; H) j) I
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone5 u1 z' @% i' a6 {; ~
ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
5 m( ]: q8 D( }* Q  y还有不常用的 m_nWordWrap == WrapToTargetDevice, z) i2 {' K- Z8 ]9 Q, c' O
ctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());
1 }0 f; D! \  C1 p* j7 P, V7 x如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return
& a; x9 `+ x5 V, d% F% h
4 q$ [: ^/ `9 a# H. K! Y# [f.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴3 A! X7 j3 i, G* T- Z
pmyRichEditCtrl->PasteSpecial(CF_TEXT);
- \) i4 _2 M6 Y/ R7 z+ z3 e2 T: P% o! Y8 Q% v1 e1 p4 o
g.随着输入随着自动滚动条滚动到最后一行
  g, P8 C- a) b3 C: p" A3 K* d/ rint nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();, \+ U' ^. y) H3 B6 k
if (nFirstVisible > 0)
) d7 v, {" u2 l" w" n7 b; l" P: n{: P: }! T8 t: X5 g( M3 j
   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);
; b/ J, c1 T# Z9 a}
: `5 D  e( d0 l
# Y; n0 ~# ], r/ G" |m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);
& E* ?( B/ ~! ^- h2 G) w! v) |1 e# r8 S' c8 Z  `( \

" X8 `& f$ a2 ]/ i: b0 G' l: S. Wh.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)
7 k. k3 E+ n; Y: V. |SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);/ D2 K. G/ \, W# X: P$ D* y9 Q
TM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数 ; h5 v6 h$ Y$ L5 g
SendMessage(EM_SETUNDOLIMIT,100,0);
' d& Z5 C; z9 O' J4 ]" K1 [3 s# f# g, Y9 `1 _3 h( X
i.响应OnChange
6 d" G- i+ [0 ~EM_SETEVENTMASK 设置 ENM_CHANGE
' _/ Z' k6 U# p4 m* x( {long lMask = GetEventMask();
% y) ~$ s) E( j  {9 plMask |= ENM_CHANGE;9 z+ T- t( X4 w0 j/ z. Q
lMask &= ~ENM_PROTECTED;3 n- D2 @% k% ^/ v
SetEventMask(lMask);
5 c$ X, O5 e8 [8 h' B' [8 v  \" n9 h: p, x: F2 `& |
j.设置只读
) O; B' W* B8 x6 _: I9 O0 _CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );9 h  `$ R, A. N' v) s+ Q/ d
通过设置PROTECTED实现选中的文本只读,参见
) t  i$ R: N: @0 f2 s" R9 K7 k0 L; @http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/6 {- V. J( @9 W) U2 q) m# c
% k4 l8 _4 X2 N
二.函数应用& c" N0 y5 D7 A# r1 ^1 [4 J( ^
a.设置字体(主要是通过SetSelectionCharFormat)5 ?5 ~1 C* L- u+ ]# n
CHARFORMAT cf;. `1 A  x8 Q, ]$ E3 U2 I( W
rich.GetSelectionCharFormat(cf);9 Q4 ]) E+ ]6 M5 J3 ~
cf.dwMask|=CFM_BOLD;
4 r" S) Z% A& J$ K9 N: t( n* t2 vcf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;
) T6 x5 E: n$ |$ J2 f1 }" mcf.dwMask|=CFM_ITALIC;$ T& Z+ t# ~  |: D$ d& l- X# j
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
! e. {- U. v8 g, Gcf.dwMask|=CFM_UNDERLINE;3 Y5 b0 N1 X" v6 ~+ U: M4 `" Y
cf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
2 N- Z9 t, C: w& Icf.dwMask|=CFM_COLOR;8 X4 Y. z2 n7 t- c8 D4 T% i
cf.crTextColor = RGB(255,0,0);//设置颜色" Z, V% a3 l8 V- x. ~/ [
cf.dwMask|=CFM_SIZE;
# ^! _  k$ t  Y2 x# i( I$ V! icf.yHeight =200;//设置高度  [6 l' }6 a- W9 v8 u
cf.dwMask|=CFM_FACE;6 c( O& _' n4 U
strcpy(cf.szFaceName ,_T("隶书"));//设置字体
9 I7 `8 F' p8 w; B5 Orich.SetSelectionCharFormat(cf);! t; `1 ?) [! n
, I- U, E, N* ?5 s
b.设置字体的行间距
  N% H) n  }: W要用richedit2.0以上; B: O7 D4 j3 v/ m4 q* i
试试
$ R1 `( `$ ?  ?2 L5 m! L0 OPARAFORMAT2 pf;( V& g& f: V3 a+ E
pf.cbSize = sizeof(PARAFORMAT2);
& Q, D- A8 n8 R. A3 [9 ?. Upf.dwMask = PFM_NUMBERING | PFM_OFFSET;# O  W3 u6 A" D3 _- p0 J5 |
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
, ]( _0 h4 ^/ ?  Y. ~pf.dxOffset = 10;
. |- @2 c* \  L9 qVERIFY(SetParaFormat(pf));
9 {* e% l6 l! b# P6 ~5 O7 h常用的dwMask有
; h: z; v( i* B4 ~/ l1 z4 ~PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
# l- j5 u8 ]) P) E+ `6 E2 使用阿拉伯数字 (1, 2, 3, ...).  
& a( f& G1 B5 v+ |& U3 使用小写字母 (a, b, c, ...).  
8 _) Q/ x5 ~+ I( E& Z% x4 使用大写字母 (A, B, C, ...).  
3 k7 F9 E; t; M# ?; e1 t5 使用小写罗马数字 (i, ii, iii, ...).  
$ ], y0 I; o% l$ F5 h/ O$ a6 使用大写罗马数字 (I, II, III, ...).  4 N- L, G6 Y" X
7 自定义,字符见成员 wNumberingStart.  
6 I. I1 H- Z8 hPFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips" ^# L" u, V# W
PFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进8 p. ^8 d1 O2 Q8 L2 B0 ?
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距  H- G) ~& ?2 a& H
PFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
5 M; C2 w% e- l3 ?
3 _& \4 N: P3 }- s6 V0 v" a9 t% P* G% Qc.设置CRichEditCtrl(2.0)背景透明
: A) _  ?: L1 Q( ?% wlong style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);
6 _7 P* K# |4 z* g9 I1 E0 ustyle &= WS_EX_TRANSPARENT;
$ }2 m3 p8 y) w8 c::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);; ~" Z4 @- T. @6 D4 a4 h0 Q7 ?
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上: k4 g4 b6 p/ A& @% o
, j6 R4 P: |! Y
e.得到内容有三种
1 P; V& r. A1 H1)GetWindowText
+ P' B- f  r' u# G) K) l2)使用EM_GETTEXTEX& a$ ^: q+ B, h" z
GETTEXTEX gt;4 `) B3 u) G0 [
gt.cb = 200;: S& A6 [2 U: q0 P7 K2 X* e- ^
gt.flags = GT_DEFAULT;% T& S3 P. r  ]0 U: u% M/ l2 K- O! g! `
gt.codepage = CP_ACP ;
3 [: C6 c* D$ \" G4 x0 Jgt.lpDefaultChar = NULL; 6 q4 ?, e5 m. w! \" I) B1 g& L1 h
gt.lpUsedDefChar = NULL;; U) S2 P: A# m8 c* k* \# H2 q
SendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);
+ z7 p# O) J& `9 U1 [2 l9 I. F3)StreamOut(主要用于RTF等格式输出)
0 V) i7 M: X8 @. Q9 T& \static DWORD CALLBACK
0 i1 T, U% a# V2 X8 BMyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
! I( ^2 _: l  u9 A+ Y{% Q* Y, I# Q' c8 p
   CFile* pFile = (CFile*) dwCookie;& c$ Y9 x( ~$ P, b: a& ^* U+ D- ^
. \3 A5 R- ]! [
   pFile->Write(pbBuff, cb);
: z  i/ O, p: ~2 R% n, w   *pcb = cb;
1 g7 K* T% u5 _* t
2 E1 c4 x: `$ \* [. o1 N   return 0;
" b4 K* U/ g. o: Y}$ ~* F  y+ T! i+ V, m: u. k$ z" s

- T0 B& u$ I% u& ?. R6 j" z( Y3 h' b6 l/ n' ~" H
   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);2 W2 S6 l. H" K# g' x" @
   EDITSTREAM es;. l1 k& R/ O5 [3 E
   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用
& ^1 G: V# ^' i# M, }  j* E, {' z   es.pfnCallback = MyStreamOutCallback; # T" a' D5 H0 D! |+ l( n
   pmyRichEditCtrl->StreamOut(SF_RTF, es);
9 @: \5 T: t) o$ n, x4 Y* }读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn( y2 _( f* F! @0 f& a

% q8 B3 j  M. q5 U9 R( \7 Zf.查找字符串
4 k! C- L$ U0 N& H2 I- QFINDTEXTEX ft;- `- w  M- [; d% D" i4 e% O" M
ft.chrg.cpMin = 0;
9 W) \/ n7 E5 Y+ [- X- ~+ Uft.chrg.cpMax = -1;
. m4 t# v# g# U5 yft.lpstrText = "|";) x0 p) m/ B8 }, `- k
long lPos = FindText(0, &ft);
+ i3 n2 e. |( }% ], o9 ^) P. t& `1 u4 ]9 a- D) C
如果要继续查找,修改cpMin,如
! j2 w' J+ n8 ]5 D5 hint nCount = 0;8 ~  C9 L, b  X0 ?& f5 a9 R( X! ?- A  ~+ z
do
+ }. S$ E2 X8 K  E  N/ l: a+ n{" f# }1 N, u8 m# N" R9 v
long lPos = GetRichEditCtrl().FindText(0, &ft);
( W7 D, X( c; _7 ]1 z& l9 u$ J if( -1 == lPos) break;
, m5 w5 _! |! V! l ft.chrg.cpMin = lPos + strlen(ft.lpstrText);3 B; x# c' j/ d
++nCount;5 ^4 ?( `' V( i8 F+ W  q* F- M
}while(TRUE);
% ?* e/ W7 }: k( h+ J5 x$ ]: J5 y0 m- i
) f# i: V) Z! D" w+ v) g0 @5 `2 ng.以Html格式保存6 Q6 o; k: G( o, {) z. x* a5 ?: Q! q
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter$ `6 P: N6 C' G5 K
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377// w7 O7 R: H0 ]$ S8 R& p& B

9 G) ?  D) H3 F0 |h.重载OnProtected函数得到对应的消息,如粘贴等
6 J; ^  G  Z2 X0 W5 \6 ^void CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)0 K% f  X2 p" F, n8 \' o! i2 O) E
{# d- U; p! i# H0 y" _
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
6 k, ?7 @* ]% F$ y' X
" M0 c8 a% C+ M5 I% K; o4 Q9 Y switch (pEP->msg) {
) f3 E! x6 n: K' j6 C4 b: e/ K case WM_KEYDOWN://按键,判断pEP->wParam
3 r& B# S3 Y( @1 W- Y- X' Z case WM_PASTE://粘贴  L8 q' Y( k8 L: j( @
case WM_CUT://剪切
+ J$ x" v+ u9 W& h0 W3 P case EM_SETCHARFORMAT:
, C' H( K( X5 R8 o6 O, \& @! ? default:2 l0 T8 e* q/ o! ~
  break;
6 {+ L  B  {$ k  V };
( h8 P$ w; S1 N( @
- B& }2 J3 @# |( _) W, ] *pResult = FALSE;5 G  R8 p7 r: N; z% G: I% ?  R
}
4 B9 ?& R3 c3 ~1 @$ r) A1 ]3 p+ y3 t" I3 Z3 X1 G0 b
三.聊天常用    r: \4 i4 t& p4 E+ W
a.LINK 链接功能
  {2 L% I5 O. Z5 V( L( A$ N1.  LoadLibrary(_T("Riched20.dll"));
3 v' ?: @1 B- [+ Y9 P# H* Z2. 创建RichEdit2.0控件
, u: Z7 C) W; |. }; c1 J CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
' M4 }9 Q3 T2 S# J% o* y6 p( m|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,
$ }1 |% R0 }. D          rect.left, rect.top, cx, cy,
, \; S/ D+ p( F3 J) }2 N2 u. L* M  pParentWnd->m_hWnd, (HMENU)nID, NULL);3 c! Q$ ~) R/ R) g' f5 ^& X
3. 设定选中的文字为链接显示/ u  X$ ?" j2 O
CHARFORMAT2 cf2;
# j) G  e. j* H0 s  W. qZeroMemory(&cf2, sizeof(CHARFORMAT2));//
6 k6 B, e% x! Q. \/ fcf2.cbSize = sizeof(CHARFORMAT2);( M) {* i  V+ h$ d. O+ d
cf2.dwMask = CFM_LINK;
+ L/ |( L% |( a) C; d3 gcf2.dwEffects |= CFE_LINK;
  @. f+ j# ~/ Cm_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);! L* n( S6 v  D9 ]* E) z
4.支持链接的点击响应/ {0 q; r/ B+ N! E8 w
m_cRichEdit.SetEventMask(ENM_LINK);. Q5 a$ h+ b3 C8 P' K1 G/ |( q7 h
5.响应链接的点击EN_LINK
3 Y& R9 v$ d0 K6 q! V) e
+ @7 V5 O) a8 l" T* {: v4 XBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)
$ u- r0 W; G5 D% p, k% M2 o+ V" EON_NOTIFY_REFLECT(EN_LINK,OnURL)
- S' E  X) M7 F5 D# i8 jEND_MESSAGE_MAP()
0 y- {: `3 Z8 ^: Q......( d/ `$ |/ z1 m7 T

0 r( E% X3 E& K- i* w( s: N! r4 Svoid CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)
9 J4 x5 @, @( l8 x{& S* J) ]% ?% B- P9 u  g
TCHAR LinkChar[512];( |" }) U; c) _) O  S1 Y8 T" ~9 z
ENLINK *pLink = (ENLINK *)pNmhdr;
( Q- ?! ~& u* ^if (pLink->msg == WM_LBUTTONUP)7 s3 D; u2 }7 s0 x( H, M
{$ q* z" R5 E: S5 M! ?) }8 F) O( ?' n
SetSel(penLink->chrg);//这是链接的文字范围
6 M, Z; q6 U9 z' X9 flong Res = GetSelText((char *)LinkChar);//这是链接文字# Z5 ]9 |. K' I) K( Y+ D$ q( m0 v
                  //后面是你的处理过程
0 ~/ v5 f2 t- N0 n& p0 H) t0 K                  ....... D0 m8 V7 F5 ]2 V' d7 u
         }
& e* u, R! \0 F( G# x}
& s5 A; Y. F/ k! e! H
- X! \% |; b: p$ z, Jb.插入位图1 g0 H9 v% J) E  m
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/* Q5 m$ ]- h1 f
http://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/) R# l7 T2 B6 m( W: y9 N

/ {( ?! t% {3 T% p* ^* I自定义在RichEdit中插入对象的图标
5 W# R& [1 B: }http://www.blogcn.com/user3/jiangsheng/blog/1319738.html
. A- K3 X9 X* C1 W3 O0 }方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control' x+ i# X/ q) o9 H1 W5 @
只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片9 Z+ _, D# O- i% P+ k

: m# p$ s6 p& A: ?) P) M使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。
( n3 b: {. A3 I& g! \! @  [" @另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。
% {) |: F4 |2 x& ]4 p- o$ [
: Z& x! |) e! G, Cc.显示GIF动画
( m' ]  J# N0 q# l& U9 [1 a常用的是通过qq的imageole.dll(也有用Gif89.dll的)
( S9 H) b1 C- J, `4 g0 Ahttp://www.xiaozhou.net/cooldog/blogview.asp?logID=82* Y* G+ v! Q: Y7 K! _4 s; U
http://www.codeproject.com/richedit/AnimatedEmoticon.asp. t0 M3 Z( }3 H! z% B9 d( ^( H

! Q# j# a4 n- S8 Y" Y) \在richedit控件中插入动态GIF (Native C++版)
+ w: G' ^0 }# \8 r6 ]  uhttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx8 e3 N% X) @, E6 M- _- S2 }( `

- w, P' t" r  |, z9 h0 h/ Rd.IRichEditOleCallback的使用( [* ^$ J7 A7 ?4 V* w/ l0 x/ s
http://61.186.252.131/Expert/topic/905/905844.xml?temp=.83790221 T, {; Z. S, O+ j3 _

) B0 M! u4 h" Y% q7 n0 ]$ d9 l6 ]类似 MSN 信息发送框的制作(上)
' ?) ~2 d3 u3 Q' x" Lhttp://www.vckbase.com/document/viewdoc/?id=1087
0 Q0 ?1 E* _) A4 s) c. K% V% M2 c内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串
8 j! V! v' x# ?1 ^0 [8 m
- X( j8 G% s3 m5 N  q: ?- v* p& l自定义 CRichEditCtrl 控件
) D4 Y) Y" Y/ v, X% Q5 Vhttp://www.vckbase.com/document/viewdoc/?id=328
7 b0 {& w/ E+ {# y( u内容包含:鼠标右键消息,消息映射,字体变换
0 b* f: p  M2 A6 S5 K
3 l3 L0 K6 n, \0 {, |PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母+ y/ W5 w- |( P9 f
是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
( U4 ~+ \, O) }' X$ S----------------------  i6 `. R$ D) n
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 12:39 , Processed in 0.019086 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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