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

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

[复制链接]
发表于 2006-12-11 14:36:01 | 显示全部楼层 |阅读模式
一.常见问题
0 f; \9 I  O! A2 n" D. K" Ga.可以编译,不能执行的
2 M% r3 _! j  P) cAfxInitRichEdit();
! f# V' e# p, a8 L0 d4 U8 ~: q3 _- [* G
b.升级默认的Riched版本(默认的有一些bug),如
8 x0 Z( ^. C: @/ P可在InitInstance中添加1 R% r+ D  t& ~# M8 }+ Q8 I
LoadLibrary("RICHED20.DLL")
$ M! o$ G7 ^* @3 B最后注意 FreeLibrary
6 n) N% s. B$ k1 V  |# J+ f% }) q* D7 j2 P6 F; G
如果是CRichEditView基类的可用: [8 Q3 X, W) y- a2 w, u/ T
BOOL CXXXXXXView::PreCreateWindow(CREATESTRUCT& cs)9 k- X; j( g, ^5 r( c$ {, M  Q2 u
{
& d/ p9 X& [2 e! l5 G9 c' D! N//装入rich edit version 2.0
0 t! c0 Y. M8 T- G& q8 nif (LoadLibraryA("RICHED20.DLL") == NULL)4 F; y; N0 H$ j$ E! z' }7 m
{
( k: j+ B% H$ P* z6 |. RAfxMessageBox(_T("Fail to load \"riched20.dll\"."),MB_OK | MB_ICONERROR);* x. f5 D7 Z5 @5 {. l9 u7 n4 {
PostMessage(WM_QUIT,0,0);
: t# Y0 u9 F0 g1 j6 h& t7 Breturn FALSE;/ D8 }  ~  y) i, {+ P9 U* x
}
/ d% |0 S* S. {4 v5 a: Z* Y+ A% ~$ x1 e. n0 C: C# J* m
m_strClass = RICHEDIT_CLASSA;//for 2.0 class0 \: M+ w4 o7 c: z# v
8 m: b* O7 k) G; L: j
return CRichEditView::PreCreateWindow(cs);" [8 k- Q4 Y' z( K
}
' R, ]' |3 s1 I; l/ d  a3 r' U- E+ w8 u$ y* Y# O4 I; v
c.最后追加行
1 K, G* ?. R" T) F4 dricheditctrl.SetSel(-1, -1);
5 Q( x4 M. @- {. T- Vricheditctrl.ReplaceSel( (LPCTSTR)str );7 l/ f' L9 z6 Q* v4 G

: V$ p  [" \  V5 w" v, w8 B. vd.字数限制
+ \* q/ f& z, g4 X9 ~( Z5 G7 ECRichEditCtrl::LimitText(long nChars), R1 w4 d: u5 O6 ~
! R1 ?6 H) ?- D3 S2 ^6 f9 r
e.换行切换& ?2 U% K5 y) ]: n; ]4 ^
CRichEditView的OnInitialUpdate()函数中加入下面两句:1 m" ~+ d4 ^( B7 ^) n! C
m_nWordWrap = WrapNone;8 T1 }- l9 I5 k
WrapChanged();
0 ^, A$ \  b, h" _WrapChanged实际上也是调用: D1 Q5 n" w! Q3 Y
ctrl.SetTargetDevice(NULL, 1); //m_nWordWrap == WrapNone
- G2 p) n0 l0 O( K* v0 U# `2 `ctrl.SetTargetDevice(NULL, 0); //m_nWordWrap == WrapToWindow
" J# q+ Y7 ~3 h  F  |还有不常用的 m_nWordWrap == WrapToTargetDevice
$ k0 G' f+ s0 [8 Q0 \" [; c* Nctrl.SetTargetDevice(m_dcTarget, GetPrintWidth());% V! e6 |* j  [9 Z. v) e+ T7 I6 W% M
如果是在Dialog中,可使用SetTargetDevice,注意在属性里面加上want return/ Z% {9 |: g" f% U2 c5 T

9 {* x/ n  f+ n4 c4 M0 bf.有时候不希望带格式的数据粘贴,可通过PasteSpecial选择性粘贴
4 W! B2 V! L( Z3 d4 e/ epmyRichEditCtrl->PasteSpecial(CF_TEXT);
  m$ I9 y# Z& v. Z/ ]
4 M/ Q8 _8 s" i$ E9 @0 `( Ig.随着输入随着自动滚动条滚动到最后一行0 c- `  z: L1 A
int nFirstVisible = pmyRichEditCtrl->GetFirstVisibleLine();& @0 O# V9 u& V! ]- z' r
if (nFirstVisible > 0)
- r( y; I0 B; j4 _$ S: ?+ t{
6 Y! ~4 X( ]! s9 Y$ m   pmyRichEditCtrl->LineScroll(-nFirstVisible, 0);! D. V3 e. i! o! ]7 g3 `5 U1 k# K
}
  l% @/ `, ^0 y% J) L  M6 d6 e  V  ^3 k% n7 c$ x
m_cRichEdit.PostMessage(WM_VSCROLL, SB_BOTTOM,0);1 S# W$ U5 [! B: ?, S) b$ |

1 `* D7 ^, t( v9 u% U8 Y& f
8 D# ?9 H2 a2 E& qh.设置UNDO的次数(只能用在RICHED20以上,即默认不支持,必须升级)9 u. F% s. ~3 ~' R& q* u( F
SendMessage(EM_SETTEXTMODE,TM_MULTILEVELUNDO,0);
  t& W: r6 V* s) PTM_MULTILEVELUNDO 支持多取消(默认值).可通过EM_SETUNDOLIMIT设置最大次数
0 M1 C% ~' Q" c8 ^$ JSendMessage(EM_SETUNDOLIMIT,100,0);* m) j& l$ ]) g5 ?4 D4 I
+ W7 q/ ]$ w% k" l' D
i.响应OnChange
3 P4 P, W* f2 h  p( J' ]! MEM_SETEVENTMASK 设置 ENM_CHANGE & e! H6 x5 I5 m
long lMask = GetEventMask();( {+ U5 Y- q" s
lMask |= ENM_CHANGE;
. o) J! x3 p) q8 {0 t3 xlMask &= ~ENM_PROTECTED;
7 i. q# e- e% d6 |SetEventMask(lMask);
6 y( K2 B+ h0 B4 g
6 l4 b6 _' g2 {+ M- D" Tj.设置只读- F: N8 a* F; M9 U3 m! V6 H0 N
CRichEditCtrl::SetReadOnly( BOOL bReadOnly = TRUE );
$ V# h6 {8 j9 @- G! U2 g* B+ N; A通过设置PROTECTED实现选中的文本只读,参见6 B/ |" _* p! u+ Q( z' ~6 [
http://www.codeguru.com/Cpp/controls/richedit/article.php/c2401/  _: C* _# x! B: N. [

3 v+ U8 x0 [9 }. _8 ]; T# g二.函数应用
1 W: i# Q$ n! c$ I8 ?' {% Xa.设置字体(主要是通过SetSelectionCharFormat)  y2 ~( Z& {9 |
CHARFORMAT cf;8 {+ y4 U5 i" J
rich.GetSelectionCharFormat(cf);, e5 C' n- v( ^2 i0 Q, _3 ~& G+ O3 |
cf.dwMask|=CFM_BOLD;
* h' [7 |8 G  q8 B0 ~9 mcf.dwEffects|=CFE_BOLD;//设置粗体,取消用cf.dwEffects&=~CFE_BOLD;, b. A, e) D) t
cf.dwMask|=CFM_ITALIC;5 ]* w5 Y' }$ x* b% Y
cf.dwEffects|=CFE_ITALIC;//设置斜体,取消用cf.dwEffects&=~CFE_ITALIC;
: {  w4 t5 Z) D3 Acf.dwMask|=CFM_UNDERLINE;
( C* e& t0 {7 S2 B! V4 ]! Dcf.dwEffects|=CFE_UNDERLINE;//设置斜体,取消用cf.dwEffects&=~CFE_UNDERLINE;
# f6 s" T0 d' Kcf.dwMask|=CFM_COLOR;1 }' Y7 j1 h  {
cf.crTextColor = RGB(255,0,0);//设置颜色
5 W, S' w. W5 a! n! m- fcf.dwMask|=CFM_SIZE;* P; f4 F) F7 B/ S3 Q
cf.yHeight =200;//设置高度1 C: G, S3 W$ ]; R3 f# }! q/ U+ ]
cf.dwMask|=CFM_FACE;% v) I1 R$ N" N" N/ v7 k8 {' t( a% r
strcpy(cf.szFaceName ,_T("隶书"));//设置字体3 B! X/ ?2 K) u
rich.SetSelectionCharFormat(cf);/ J* b* D7 l0 {  D. t4 t
: h9 f7 c. t* Z- c3 P+ S( U. B
b.设置字体的行间距
$ y( C0 Q+ B( q, V/ z  M4 `6 k要用richedit2.0以上  {+ ?7 ?+ j1 B' u( m5 M: A/ C
试试
( E; p9 A. T) o  r/ qPARAFORMAT2 pf;1 l* j" X" K3 Y: b
pf.cbSize = sizeof(PARAFORMAT2);
; S) V+ ^# G3 A/ C( Rpf.dwMask = PFM_NUMBERING | PFM_OFFSET;4 }2 O- D: N9 z, E
pf.wNumbering = PFN_BULLET;//注意PFM_NUMBERING
0 X9 Y+ [! `& X9 f5 y' Z* n: _pf.dxOffset = 10;
( h. i( S$ s6 t% MVERIFY(SetParaFormat(pf)); 2 _) p5 y5 `2 `. b+ e2 I$ Y" p! e
常用的dwMask有/ I! n4 f, m4 X4 i' b* x
PFM_NUMBERING 成员 wNumbering 才起作用,项目符号,默认用PFN_BULLET
/ v! l& C, ]& V. H$ ~: C2 使用阿拉伯数字 (1, 2, 3, ...).  7 x7 _* n) ?+ h- P5 R" I3 M6 V
3 使用小写字母 (a, b, c, ...).  
( M' m, t3 A  {( {2 l6 y: _4 使用大写字母 (A, B, C, ...).  
8 z5 W( M( c( b4 r9 g- n6 `5 使用小写罗马数字 (i, ii, iii, ...).  
' W, y2 I1 `) C6 使用大写罗马数字 (I, II, III, ...).  0 X4 F" Y9 \/ }) `) z2 N- y6 o
7 自定义,字符见成员 wNumberingStart.  7 S; s+ m7 w- W5 u/ c
PFM_OFFSET 成员 dxOffset 才起作用,缩进,单位twips
: R$ r5 g3 Z8 t0 ^  Y1 n$ R9 ^( {) X' B5 TPFM_STARTINDENT 成员 dxStartIndent 才起作用,首行缩进+ r# b; l& F% Q/ C5 w/ c9 W
PFM_SPACEAFTER 成员 dySpaceAfter 才起作用,段间距
% W# F8 G+ c2 k  H8 jPFM_LINESPACING 成员 dyLineSpacing 才起作用,行间距
4 S# g3 F, w+ O0 \
/ [- Y9 P0 j7 q3 h. uc.设置CRichEditCtrl(2.0)背景透明 4 V* ^9 d$ {+ W& Q' @
long style = ::GetWindowLong(GetSafeHwnd(), GWL_EXSTYLE);: A2 U2 h+ a- ~- N- C! ^4 Z8 f/ a
style &= WS_EX_TRANSPARENT;6 L( ^( \/ n" g
::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, style);$ K6 O# h/ [1 W6 a8 ~
或 CreateEx,然后把WS_EX_TRANSPARENT样式加上
' ], l9 t  h) q( U' B4 M0 r4 l8 ~5 n" N: K; I: `; _2 n- T+ A
e.得到内容有三种
$ i% \) }' V/ o7 M: R/ O. n1)GetWindowText
: r$ R- ]; S; E. E7 M2)使用EM_GETTEXTEX
! w6 K1 y5 `% q# ~- j6 iGETTEXTEX gt;
) R: o$ Y$ B% X- t0 r9 I/ rgt.cb = 200;4 }4 ?6 ^( W1 L3 Z, G
gt.flags = GT_DEFAULT;
3 D7 e+ S. H1 g6 ~8 z- e/ i, Z" egt.codepage = CP_ACP ;# J* \' U/ s$ k; |5 O- f! [, G; M
gt.lpDefaultChar = NULL;
9 Z6 h  z. `1 B0 L$ `' pgt.lpUsedDefChar = NULL;/ Q6 [% l: o! i5 q
SendMessage(EM_GETTEXTEX,(WPARAM)&gt,(LPARAM)text);3 t) s7 L  D5 i6 d5 _: N6 E1 `9 W
3)StreamOut(主要用于RTF等格式输出)
+ D3 o( O5 b7 C% q7 K5 istatic DWORD CALLBACK 1 \" u* C: l, X, l1 K( N
MyStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)! r# ^# [" `+ o# B1 f1 ?; L3 ]" h7 p
{
& k$ y1 Z+ v+ ~  E, T   CFile* pFile = (CFile*) dwCookie;
6 N$ P$ @& s* b- g( k5 ]) w. J! Q% y. r1 G
   pFile->Write(pbBuff, cb);
' x  W0 D: g- H( m$ G8 D   *pcb = cb;7 R6 r5 e& @3 A2 v" d
' D: u7 o3 `  a
   return 0;! j4 ?; c  K( z8 h0 K
}5 f3 }" S# f* n3 ]
- c# t1 w7 P' ?( H* T9 {6 K( e
& q0 b7 v& g1 K# u% D1 P( u
   CFile cFile(TEXT("myfile.rtf"), CFile::modeCreate|CFile::modeWrite);  o3 O- H" ?0 S" l. _. M# x
   EDITSTREAM es;
: g2 n2 Q" X' E( O: V   es.dwCookie = (DWORD) &cFile;//设置用例参数,以便回调函数调用3 e. A/ X9 q" d6 K9 c% x5 @
   es.pfnCallback = MyStreamOutCallback;
2 e8 o0 x. i6 O" G% c   pmyRichEditCtrl->StreamOut(SF_RTF, es);5 n' y6 Y, v8 T8 H
读入可以此类推,SetWindowText,EM_SETTEXTEX,StreamIn5 L! s& Z( b+ d
0 @7 |* l3 w) E% E" ?8 m9 f; w) B
f.查找字符串
, G; |6 s: H7 Q; Z2 AFINDTEXTEX ft;  C: [3 w; ]9 p, x' B; g
ft.chrg.cpMin = 0;
2 N. `8 F4 @5 d" o0 gft.chrg.cpMax = -1;* Z2 k. o+ ?& l, x5 p" i+ G9 t
ft.lpstrText = "|";; o- u6 Y3 j( q# N) w( M
long lPos = FindText(0, &ft);
( x9 u# E! r) \3 W% @, L: n+ ]
8 ]% ?, x! A) j  `; [  I* V如果要继续查找,修改cpMin,如2 P- c% p$ ^3 b2 m, E2 B: X) G9 [
int nCount = 0;. C% q8 v2 m+ L! U% _
do* r, `3 W" k+ n$ _+ A1 t# c
{
2 K9 A* Z6 ]+ V7 @( ~) K( _! k long lPos = GetRichEditCtrl().FindText(0, &ft);: C, m3 S/ t9 \' j3 t9 ^
if( -1 == lPos) break;
0 U8 Q9 U; a  e+ O) ]7 Z ft.chrg.cpMin = lPos + strlen(ft.lpstrText);9 r# Y: p$ X/ V" ^# P
++nCount;
1 L8 \# Q: \; p% g. h7 M5 L}while(TRUE);  I$ }4 \8 h- v1 z

5 G0 Y; n2 c; I5 c& sg.以Html格式保存" Y) D9 J0 }/ `1 G
目前做法可先转为RTF格式,再通过RTF-to-HTML Converter- F& i2 E0 O4 S3 J! y
http://www.codeguru.com/Cpp/controls/richedit/conversions/article.php/c5377/
) C, F0 x3 ], }8 i
4 Y5 P, b- @, j1 Zh.重载OnProtected函数得到对应的消息,如粘贴等
( o! O9 u% \7 Y# Ivoid CMYichEditorView::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
1 D0 @7 X3 e/ u) m: n{+ R8 B, q& o- j3 [3 ^* @4 `
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;+ ]9 I) }% ~+ J/ n

! P  j/ P9 E# t; w2 D switch (pEP->msg) {: W3 O$ n. }9 @4 N7 s! n$ X
case WM_KEYDOWN://按键,判断pEP->wParam
' K* D! A$ F9 Q5 U+ ` case WM_PASTE://粘贴
' O% ]( y: p  j" K8 U case WM_CUT://剪切2 t! p5 F0 c! E7 g! |
case EM_SETCHARFORMAT:
2 t* W# x  m8 ^& j+ z default:
' ?1 L3 V& k0 P, v3 J2 o  break;
) J3 w+ m, |3 h7 k! M9 u% q" B };, H4 ]/ P3 S) R/ m4 [
3 Y# _- y/ I; D# }
*pResult = FALSE;2 T. t+ t; h) H2 u6 G
}& j  A$ {0 o( E# w5 |1 |

  w) F+ V8 V, H. r三.聊天常用  
  ?' O: c$ d& f* @8 ea.LINK 链接功能
* o5 r& Y) Q' f( A- W4 ?1.  LoadLibrary(_T("Riched20.dll"));% W0 L, ~0 ?" ~: X9 @
2. 创建RichEdit2.0控件6 e2 h+ k# b' ?
CreateEx(0, _T("RichEdit20A"), NULL, WS_CHILD|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP
3 U: j. o" |% ~& G|ES_READONLY|ES_WANTRETURN|ES_MULTILINE,% U8 w; d; s1 {) i0 ?; O/ X  e
          rect.left, rect.top, cx, cy,* P$ Z' P9 `' c: p7 S
  pParentWnd->m_hWnd, (HMENU)nID, NULL);
) M+ |# z. T$ C9 j: J3. 设定选中的文字为链接显示( X- G+ i- B5 ~: q. d- m9 ]5 i
CHARFORMAT2 cf2;( [6 D8 |9 }5 q) M4 t
ZeroMemory(&cf2, sizeof(CHARFORMAT2));//
. V0 v5 x9 K# C9 _' g( q3 z+ ~cf2.cbSize = sizeof(CHARFORMAT2);
! \/ C! B- A. ?0 Icf2.dwMask = CFM_LINK;# q: O9 N! k- G+ W( b* s. h
cf2.dwEffects |= CFE_LINK;
* t8 F1 Q( {$ i9 z# b; H+ Em_cRichEdit.SendMessage(EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf2);
! |8 N/ v9 s1 G8 I0 {* x4.支持链接的点击响应: \* ^; a) G/ s
m_cRichEdit.SetEventMask(ENM_LINK);
: w6 G! }# I+ _  Y. h" p5 A5.响应链接的点击EN_LINK
( |) r0 U& o8 g6 U! s+ ^
4 |/ V" A% r0 Y% Y! p0 NBEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl)% J5 o5 [5 q+ j# |
ON_NOTIFY_REFLECT(EN_LINK,OnURL): o' M8 O8 S7 @
END_MESSAGE_MAP()2 \8 C, W8 ]* h! \. T
......
3 d1 d$ M* z( @, `% s. G: Z3 @+ u. ~% w, y+ P* U# n: }/ t
void CMyRichEdit::OnURLClick(NMHDR *pNmhdr, LRESULT *pResult)/ q8 s% y2 z7 {. h! J
{- T% ]& e9 `9 v$ K) |6 B% J
TCHAR LinkChar[512];! \1 t4 q1 `1 E
ENLINK *pLink = (ENLINK *)pNmhdr;
/ T1 e  |. k* C' |if (pLink->msg == WM_LBUTTONUP)# c$ m& N( t6 o, o
{
8 }! O- p1 {  R2 bSetSel(penLink->chrg);//这是链接的文字范围3 J5 R5 G* g1 P. ?
long Res = GetSelText((char *)LinkChar);//这是链接文字! V5 z, E7 F/ y. y! d. q
                  //后面是你的处理过程
, Y. u: r) u8 v1 c; I# ?/ h. g                  ......, d' w( Y) ~' B+ t
         }( s- S2 b, e! |" s/ \. B; U4 K
}2 J1 i( s# W$ h% I

& Y* \' j. j; x+ k) [% I. [. a3 v' \4 rb.插入位图
: M# \3 v+ g9 ?) o1 whttp://www.codeguru.com/Cpp/controls/richedit/article.php/c2417/
0 f5 o( i  ~* ?0 b. A' H& Mhttp://www.codeguru.com/Cpp/controls/richedit/article.php/c5383/$ G+ j; X6 ?8 V% _5 w* Y) c* {
9 G, \( j- d0 D; u- i. N/ {
自定义在RichEdit中插入对象的图标
$ ~5 b! w% x. r, U- g) E# Qhttp://www.blogcn.com/user3/jiangsheng/blog/1319738.html
7 |* Q1 K" ?4 ~& ]. x方法基本同Knowledge Base文章Q220844 HOWTO: Insert a Bitmap Into an RTF Document Using the RichEdit Control: W/ n1 `+ f8 D7 B1 V$ c
只是在最后插入之前调用一下IOleCache::SetData,用一个HGLOBAL作为参数,HGLOBAL里面的数据是一个METAFILEPICT结构,包含自己提供的图片
/ \! J) }( k0 c. A) f0 K, v; t" z7 R- U# m
使用CRichEditView::InsertFileAsObject就可以插入图像。VC++带有一个例子WordPad。( r. x; C8 e9 M9 }+ V( O3 _
另外可以参考“Insert any HBITMAP (Bitmap) in your RichEdit Control”(http://www.codeguru.com/richedit/richeditrc.html)。 5 l* ?3 M! C( P1 [/ I# R% c

3 |% \; m+ F2 _9 S& kc.显示GIF动画3 C9 _% ]2 x1 R
常用的是通过qq的imageole.dll(也有用Gif89.dll的)  M; S3 p2 `9 a/ p( x4 d
http://www.xiaozhou.net/cooldog/blogview.asp?logID=82
2 m& `+ {7 n# F: |" k+ z2 t0 vhttp://www.codeproject.com/richedit/AnimatedEmoticon.asp' t: I- \# ?3 q- W" z
, R  d8 s2 K  j# ]3 n
在richedit控件中插入动态GIF (Native C++版)
3 e! G  {9 ]& Ehttp://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx$ `5 \! z9 h' u1 C. P8 m

/ \3 ^( r) x# K# Jd.IRichEditOleCallback的使用/ Q$ Z" ]( C, Z
http://61.186.252.131/Expert/topic/905/905844.xml?temp=.83790220 O# j# c  }$ F. O6 V: Q1 ^
9 M8 Q! f& K6 M* f% R
类似 MSN 信息发送框的制作(上)
3 o1 h0 d/ l5 K+ q  Shttp://www.vckbase.com/document/viewdoc/?id=1087
% @6 S8 f/ w% |5 G/ S. w. Z+ o内容包含:实现右键菜单,图片插入,读取/写入RTF格式字符串+ L! V  j2 y$ c9 a3 x

$ ~7 ]5 ?$ y% h1 g5 D0 u% d! H: R自定义 CRichEditCtrl 控件
6 q; O! x6 u- v; ?0 {* j. Y5 Chttp://www.vckbase.com/document/viewdoc/?id=328
1 H6 q8 J" d$ Z7 H/ Y内容包含:鼠标右键消息,消息映射,字体变换
" G8 ^; t! L" v3 |5 X+ p  s$ X( g, z$ x. Z
PS.richedit控件升级到2.0后,先把字体设为楷体,输入汉字没有问题,但输入字母时,字母自动跳转为Arial字体,而1.0却没有这个文题,仍然是用楷体显示字母
9 e/ p( A0 H6 O3 j* \: ]是一个专门的设计 Dual-font, Smart font apply, 参见 http://61.186.252.131/Expert/topic/913/913807.xml?temp=.3753778
/ H  }; u- q: }( m----------------------# g9 y! X& f' ], z8 N
比我想象中还要花时间,所以最后潦草了点,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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