登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> 程序员学前班[不再更新,只读] >> 主题: [symbian] Symbian开发总结[zt]     [回主站]     [分站链接]
标题
[symbian] Symbian开发总结[zt]
clq
浏览(0) + 2008-05-31 13:39:16 发表 编辑

关键字:

Symbian开发总结

来自 http://blog.csdn.net/shushengsky/archive/2008/02/28/2130317.aspx

1. 获得控件ID。
aControl->UniqueHandle();
2. View显示提示信息。
iEikonEnv->InfoMsg()
3. 获得焦点的控件。

4. 发送command事件的控件需要实现
MQikCommandOperator。
5. 好像可以获得任何子控件,多级。
LocateControlByUniqueHandle(EMyViewLabel);
6. 处理ListBox事件使用
MQikListBoxObserver(HandleListBoxEventL)
7. HandleControlEventL(CCoeControl* aControl, TCoeEvent aEventType)
{
// Call base class to get focus navigation right
CQikViewBase::HandleControlEventL(aControl, aEventType);
// ... 其他实现
8. 查找获得焦点的控件
QikFocusUtils::FindFocusedControl(*this);
9. 异常处理:
User::LeaveIfError() 检测返回TInt的方法。
10. 文件:
RFs& fs = iCoeEnv->FsSession();
_LIT(KFileName, "c:\\helloworld.txt");
User::LeaveIfError(iFile.Replace(fs, KFileName, EFileWrite|EFileStreamText|EFileShareAny));
iFile.WriteUint16L(0xFEFF); // Windows unicode file header.
11. 调试输出:
RDebug::Print(); //不知输出到哪里?
12. 好像SetUniqueHandle后才能
LocateControlByUniqueHandle<>()
如果不使用此方法,可以不使用UniqueHandle ID.
13. Pen模式下,OfferKeyEventL的导航键的TKeyEvent.iCode为0,
Action的TKeyEvent.iScanCode为EStdKeyDevice8(172=0xAC).
14. GIF显示CPAlbImageViewerBasic
15. 所有继承于CCoeControl的控件重画都可以使用
DrawNow()
延迟刷新使用
DrawDeferred().
16. 替换CommandList
CQikCommandManager& manager = CQikCommandManager::Static(*iCoeEnv);
manager.DeleteFromCommandList(*this, R_QRREADERUI_MAINVIEW_COMMANDS);
// add new commandlist
const CCoeControl* control = manager.FindModelOwningClient(*this);
manager.InsertIntoCommandListL(*control, *this, R_QRREADERUI_ADVIEW_COMMANDS);
17. STRING to r:
^rls_string (STRING_r(_adview_[^ ]+)).*$$
RESOURCE TBUF R\2 { buf = \1 ;}
18. 创建可修改的字符串:
HBufC *buf = HBufC::NewLC(MAX_SMS_BUFFER_LEGHT);
TPtr bufPtr(buf->Des());
19. 创建长度为0的TPtrC:
TPtrC();
20. Draw使用CCoeControl::SystemGc()获得GC,适用于所有控件。
gc.Clear(Rect()) 清除控件显示区域。
21. 不使用资源的初始化
void CQHelloWorldView::ViewConstructL()
{
CQikCommandManager& cmdManager
= CQikCommandManager::Static(*iEikonEnv);
cmdManager.CreateCommandListL(*this);
}
22. 。您总是可以通过以下方式在CCoeControl 的继承类内启动redraw
(重绘):(根据优先顺序)
1. 通过调用Window().Invalidate(const TRect& aRect),将需要重绘的区域设
成为无效(invalidate)。
2. 通过调用DrawDeferred() 来安排一个全面的重绘。
3. 通过调用DrawNow()立即绘图。
23. 获得UI指针:
CEikonEnv::Static()->EikAppUi()
24. 检测文件首否存在
BaflUtils::FileExists(iFsSession, aExistingBookFile)
25. 创建图标:
iEikonEnv->CreateIconL( KBarcodeWorkFileName,
EMbmBarcodeworkAd_wap,EMbmBarcodeworkAd_wap_m );
26. 格式化时间:
_LIT(KDateFormat, "%04d/%02d/%02d %02d:%02d:%02d");
TTime time;
time.HomeTime();
TDateTime dateTime = aTime.DateTime();
dateTime.Format(KDateFormat,dateTime.Year(),dateTime.Month()+1,dateTime.Day()+1,
dateTime.Hour(),dateTime.Minute(),dateTime.Second());
27. listBox选中项:
TInt selIndex = listBox->CurrentItemIndex();
TInt selId = listBox->ItemIdL(selIndex);
TInt selIndex = listBox->model().ItemIdIndex(selId);
28. HBufC到DesC转换
*iBuffer;
29. 描述符的
1。子串:
TPtrC ptrc1 = bufc.Right(5);
TPtrC ptrc2 = bufc.Mid(3,6);
2。数组:
TBufC<8> matchstr[7] = {*&KTxtMatchstr1, // "*World*"
*&KTxtMatchstr2, // "*W?rld*"
*&KTxtMatchstr3 // "Wor*"
};
3。设置长度:(最大长度不变,地址不变);
buf.Zero();
buf.SetLength(3);
4。Append结果大于最大长度将引发Panic错误。
5。动态内存:
CBufFlat* flatBuf=CBufFlat::NewL(4);
CleanupStack::PushL(flatBuf);
flatBuf->SetReserveL(32);

30. 常用Lib:
estor.lib CFileStore // filestor
edbms.lib RDbStoreDatabase // 数据库类

31. HandleListBoxEventL中:
EEventItemTapped: pen点击事件
EEventItemConfirmed:Action键盘事件

32. 清除容器内所有控件:
iContainer->Controls().ResetAndDestroy();
不能使用:
iContainer->Controls().Reset();

33. OpenUrl:
void CNetworkService::OpenURIL( const TDesC& aAddr )
{
TVwsViewId id( KUidQWebApp, KUidQWebPageView );

TQWebDNLUrlEntry obj;
obj.iUrl = aAddr;
TQWebDNLUrlEntryBuf buf(obj);

CEikonEnv::Static()->EikAppUi()->ActivateViewL(id, KQWebCustomMsgId, buf);
}

34. 写文件:
RFs fs = CEikonEnv::Static()->FsSession();

//检测
if( BaflUtils::FileExists(fs, aFileName) ) fs.Delete( aFileName );

//创建,打开,替换
RFile file;
User::LeaveIfError(file.Create( fs, aFileName, EFileWrite));
file.Write( aFileContent );

file.Close();

35. 动态缓存:(Using Dynamic Buffers)
CBufBase,CBufFlat,CBufSeg;
使用Size确定其大小。
aBuf->Read(3,des,5); // puts "lo wo" into des.
aBuf->Write(6,KFolks);
Compress() //压缩控件为最小

36. 改变控件风格: 1. 继承控件,重载GetTextDrawer 2. 在父控件或视图中:
void CHelloWorldView::GetTextDrawer(CCoeTextDrawerBase*& aTextDrawer, const CCoeControl* aDrawingControl) const
{
if(aDrawingControl==iLabel)
{
aTextDrawer->SetTextColor(KRgbRed); //将字体设为红色
}
}
void CMyLabel::GetTextDrawer(CCoeTextDrawerBase*& aTextDrawer, const CCoeControl*/* aDrawingControl*/, TInt/* aKey*/) const
{ aTextDrawer->SetTextColor(KRgbRed); }

37. 改变title图标:
1. 获得Titlebar控件:
MQikViewContext* mvc = ViewContext();
CCoeControl* vc = &(mvc->AsControl());
CCoeControl* titlebar = vc->Parent()->Parent()->Parent();
2. 改变图标控件内容:
if(titlebar!=NULL)
{
CEikImage* titlebaricon = static_cast(titlebar->ComponentControl(0));
titlebaricon->SetContentL(KAnim);
// bug: the anim is always lower than expected,
}
无bug版见:"Symbian积累"

38. 使用计时器(-):
iPeriodic = CPeriodic::NewL(0); // neutral priority
iPeriodic->Start(KTickInterval,KTickInterval,TCallBack(Tick, this)); // Tick可以为成员方法

TInt CHelloWorldView::Tick(TAny* aObject){ aObject->DoTick(); } // 计时器响应

if(iPeriodic->IsActive())
{
iPeriodic->Cancel(); //取消
}

39. 抓屏:(抓屏.txt)
40. 在非对话框的系统块中添加CEikEdwin控件不会自动弹出:
CQikBuildingBlock* block = CQikBuildingBlock::CreateSystemBuildingBlockL(EQikCtCaptionedTwolineBuildingBlock);
container->AddControlLC(block, 100);
block->ConstructL();
_LIT(KCaption,"Title above second edwin");
block->SetCaptionL(KCaption, EQikItemSlot1);

CEikEdwin* edwin = new (ELeave) CEikEdwin();
block->AddControlLC(edwin, EQikItemSlot2);
edwin->ConstructL();
edwin->SetUniqueHandle(ELabelStart);
edwin->SetObserver(this);
41. 删除控件:
CCoeControl* qlbx = Controls().RemoveById(EMyListbox);
if(qlbx) delete qlbx;
42. 窗体坐标:
每一个window都有一个坐标, 它的原点位置相对于其父窗体的的原点.如果其父窗体是一个window group, 它的位置相对于屏幕设备左
上角,因为groups 没有尺寸大小。

43. 字符串格式化:
_LIT(KresultFormat, "%S"); // 必须为S
resultMsg.Format(KresultFormat, &newName); // 取地址
44. 异常抛出:
User::Leave()后不用添加return。
45. 时间格式化:
TBuf<32> theTime;//存储转换后的时间
TTime tt;
tt.HomeTime();
_LIT(KTimeFormat,"%Y%M%D%1-%2-%3 %H:%T:%S");//格式为:2006-03-04 12:12:12
tt.FormatL(theTime,KTimeFormat);
45. TBuf转Tint型
TInt iNum1(123456789009876);// 15位数字
iBuf.Num(iNum1); // 将缓存的内容设置为iNum1
TLex iLex(iBuf); // 使用iBuf包含的内容创建TLex对象the 15 digit number
TInt iNum2;
iLex.Val(iNum2); //iNum2现在包含了15位数字
/* 数据类型转换*/
TBuf 转换为 TPtrC16
TBuf<32> tText(_L("2004/11/05 05:44:00"));
TPtrC16 tPtrSecond=tText.Mid(17,2);
TPtrC16 转换为 TBufC16
TPtrC16 tPtrSecond=tText.Mid(17,2);
TBufC16<10> bufcs(tPtrSecond);
TBufC16 转换为 TPtr16
TBufC16<10> bufcs(tPtrSecond);
TPtr16 f=bufcs.Des();
TPtr16 转换为 TBuf
TBuf<10> bufSecond;
bufSecond.Copy(f);
TBuf 转换为 TPtr16
TBuf<10> bufSecond(_L("abc"));
TPtr16 f;
f.Copy(bufSecond);
TBuf 转换为 TInt
TInt aSecond;
TLex iLexS(bufSecond);
iLexS.Val(aSecond);
TInt 转换为 TBuf
TBuf<32> tbuf;
TInt i=200;
tbuf.Num(i);
UTF-8转换成UNICODE
CnvUtfConverter::ConvertToUnicodeFromUtf8( iBuf16 , iBuf8 );
UNICODE转换成UTF-8
CnvUtfConverter::ConvertFromUnicodeToUtf8( iBuf8 , iBuf16 );

将char串转换成symbian串
char* cc = "aaaa";
TPtrC8 a;
a.Set( (const TUint8*)cc , strlen(cc) );

46. 全局变量:
template
inline T* AppUi()
{
return static_cast(CEikonEnv::Static()->AppUi());
}


template
inline T* Document()
{
return static_cast(CEikonEnv::Static()->EikAppUi()->Document());
}

template
inline T* Application()
{
return static_cast(CEikonEnv::Static()->EikAppUi()->Application());
}

用法:
CMyAppUi * p = AppUi();
CMyDocument * p = Document();
CMyApplicaton * p = Application();
47. 描述符字串方法:
Left,Right,Mid:中参数>=0. 长度超出时,取最长部分。
48. 问题: // 使用以下方法无法插入数据
RDbColWriteStream writeStream;
writeStream.OpenL(table, KIndData); // writeStream.OpenLC(table, KIndData);
writeStream.WriteL(aData); // writeStream.WriteL(aData);
writeStream.Close(); // CleanupStack::PopAndDestroy(); // writeStream close
而就没有问题:
RDbColReadStream readStream; // A stream object for long columns
readStream.OpenLC(tblHist, KIndData);
readStream.ReadL(des, nLen);
CleanupStack::PopAndDestroy(); //readStream
49. DLL中加载资源
//加入资源文件
TFileName filename;
TParse parse;
parse.Set( CEikonEnv::Static()->EikAppUi()->Application()->AppFullName(), NULL, NULL);

filename.Copy( parse.Drive() );
filename.Append(KResPath);
iResOffset = iEikonEnv->AddResourceFileL(filename);
50. 使用While+错误标志位+全局变量 可以解决某些递归调用。

51. XmlLib 在 xmlframework.lib
使用Xml::MContentHandler时应该这样处理:
-> 叶节点标签在Oncontent中处理。
-> 其他节点在OnEndElementL中处理
-> 使用如下的跳转表:
struct TKeyWordPair
{
const TPtrC8 tag;
TInt iType;
TInt iParentType;
};
在OnStartElementL中:
for (TInt i=0; i {
if (tagName.CompareC(KKeyWords[i].tag) == 0)
{
iState = KKeyWords[i].iType;
iParentSata = KKeyWords[i].iParentType;
break;
}
}

52. 换行符在symbian中为\n(0x0C),读取windows文件时会自动转换。
XML解析时要跳过换行和空格。

53. 将KLit转化为TDesC:使用operator(),不会出现临时变量。
_LIT(KLit, "Hello world!");
KLit().AllocL();

54. 可以使用系统的KNullDesC(8,16)代替空字符串:
_LIT(KNullDesC, "");

55. iHeapBuffer = aDesC.AllocL();就可以搞定数据放入堆中。

56. CArrayPtr::ResetAndDestroy() 他的子类:CArrayPtrFlat,CArrayPtrSeg 都可以使用。
RPointerArray 也有此方法ResetAndDestroy()

57. 内存检测标记:
__UHEAP_MARK: 标记开始
__UHEAP_MARKEND: 标记结束

58. View模式: 次序有关,可以覆盖
TQikViewMode viewMode;
viewMode.SetStatusBar(EFalse); // 无状态条,电池的显示部分
viewMode.SetAppTitleBar(EFalse); // 无标题,
viewMode.SetButtonOrSoftkeyBar(EFalse); // 无工具条,按钮或菜单的显示部位
viewMode.SetToolbar(EFalse); // 无??
viewMode.SetFullscreen(); // 全屏,以上都没有
SetViewModeL(viewMode);

59. 检测内存:
TInt ramf;
HAL::Get(HALData::EMemoryRAMFree, ramf);
60. DLL实现:
头文件中: IMPORT_C static CInsCamera* NewLC();
源文件中: EXPORT_C CInspiryCamera* CInspiryCamera::NewLC();

61. 抽取Listbox的数据:
MQikListBoxData* listBoxData = model.RetrieveDataL(0);
CleanupClosePushL(*listBoxData);
// ..
CleanupStack::PopAndDestroy();
或者:
MQikListBoxData* listBoxData = model.RetrieveDataL(0);
// ...
listBoxData->Close();

62. 将所有的换行符号换成\f即可被CEikRichTextEditor识别为换行
text->InsertL(text->DocumentLength(), CEditableText::ELineBreak);
移动焦点:
MoveCursorL (TCursorPosition::EFLineDown, EFalse);

63. 删除CRichText时:
delete aText->GlobalCharFormatLayer();
delete aText->GlobalParaFormatLayer();
delete aText;

64. 遍历目录:
iEikEnv->FsSession().GetDir(KSaveToDir, KEntryAttNormal, ESortNone, anEntryList);

_LIT(KMdcMask, "c:\\Data\\*.mbc");
TInt ret = aDir.Open(iEikEnv->FsSession(), KSaveToDir, KEntryAttNormal);

65. 属性:
临时对象,无名对象都是const

66. 添加静态库:
STATICLIBRARY DMDecoder_static.lib
67. 内存对齐问题
#ifdef __WINS__
# pragma pack(push,2)
#define PACKED
#else
#define PACKED __attribute__((packed))
#endif

typedef PACKED struct tagBITMAPFILEHEADER{};

68. SetExtent(TPoint(0,0), iQikAppUi.ClientRect().Size());
并不可靠,特别是改变屏幕显示模式。可以使用CQikGridLayoutManager。
CQikGridLayoutManager* gridlayout = CQikGridLayoutManager::NewLC();
SetLayoutManagerL(gridlayout);
CleanupStack::Pop(gridlayout);

对于CQikViewDialog使用
Page(ActivePageId())->SetLayoutManagerL(gridlayout);

69. 直接创建独立的控件;
iMyCtrl->ConstructL( KCameraContainerRect, &(iEikonEnv->RootWin()));

70. 不同图片格式转换
CFbsBitmap::Create(aSizeInPixels,aDispMode);创造一张灰色位图,如EGray16
然后利用
CFbsBitmapDevice以及CFbsBitGc,将原图绘制上去即可

71. 修改视图标签:
MQikViewContext* viewContext = ViewContext();

viewContext->ChangeTextL(EContextViewText, viewContextText);

72. 侦听application焦点切换from a server process?
RWsSession ws;
User::LeaveIfError(ws.Connect());
CleanupClosePushL(ws);
RWindowGroup wg(ws);
User::LeaveIfError(wg.Construct(reinterpret_cast(&wg), EFalse));
CleanupClosePushL(wg);
wg.SetOrdinalPosition(-1); // hide the window
groupwg.DefaultOwningWindow();
wg.EnableReceiptOfFocus(EFalse);
wg.EnableFocusChangeEvents(); // get ready to receive focus change events
TRequestStatus status = KRequestPending;
ws.EventReady(&status);
User::WaitForRequest(status); // wait until the focus is changed
CleanupStack::PopAndDestroy(); // wg
TInt wgid = ws.GetFocusWindowGroup();
CApaWindowGroupName* gn = CApaWindowGroupName::NewLC(ws, wgid);
TUid uid = gn->AppUid(); // the uid of the focused app
CleanupStack::PopAndDestroy(2); // gn, ws
if(uid==KUidCertainApp){
// do something
}

73. CQikAppUi::BaseConstructL主要执行以下流程:

CQikAppUi::CPimpl::CPimpl(CQikAppUi &)(CPimpl * const this=0x0739e7ac, CQikAppUi & aQikAppUi={...})
CQikAppUi::CPimpl::ConstructL(CEikonEnv &)(CPimpl * const this=0xffffffff, CEikonEnv & aEnv={...})
SkinManager::CreateL (0D9249D2h)
SkinManager::AddThemeChangeObserverL (0D9249D8h)
CQikCommandManager::CreateL(MQikCommandHandler &, CEikonEnv &)

74. 第三方程序中无法使用相机快门键(EKeyCamera事件)
#define EKeyCameraShutter 0xf883

该键值的事件需要在window server中显式的请求:
// Capture events from the camera shutter key (SwEvent capability required)
iCameraKeyHandle = iCoeEnv->RootWin().CaptureKey( EKeyCameraShutter, 0, 0 );

返回值iCameraKeyHandle(TInt32)可以用来取消该键捕捉请求,特别当退出程序时:
if ( iCameraKeyHandle >= 0 )
{
iCoeEnv->RootWin().CancelCaptureKey( iCameraKeyHandle );
}

对焦键事件:半按下快门键将产生另一个不同的按键事件(对焦),可以通过下列scan code来检测该键的EEventKeyDown和EEventKeyUp事件:

#define EStdKeyCameraFocus 0xe2

75. 显示副标题:
ViewContext()->AddTextL(0,_L("Hello Title2!"));

76. 据说下面方法可以修改一个Application的所有视图皮肤:
void OverrideSkinPatchL(TUid aSkinUid,
TInt aPatchIndex,
CWsBitmap *aSkinBitmap,
TSkinDrawMode aSkinDrawMode,
TMargins8 aDrawMargins);

-> CQikWsBitmapBackground不支持masking. 建议继承MCoeControlBackground 自画 CWsBitmap with CWindowGc::DrawBitmapMasked.

-> 另设置方式:
CWsBitmap* iBkbitmap;
CQikWsBitmapBackground* iWsbk;

在View.cpp

RWsSession WsSession;
WsSession.Connect();
iBkbitmap = new(ELeave) CWsBitmap(WsSession);
iBkbitmap->Load(KMBFileName,bitmapidfrombitmapfile,ETrue); //load return KErrNone
iWsbk = CQikWsBitmapBackGround::NewL(iBkbitmap ,0);

绘图方法中:

CWindowGc& gc;
gc.BitBlt(leftcornerpoint,iWsbk );

-> const CSkinPatch& skin = SkinManager::SkinPatch(KSkinUidListBox, ESkinListBoxPopoutBackground, NULL);
skin.DrawBitmap((CWindowGc&)*aGc,iOffScreenBitmap->SizeInPixels(), aRect);

77. 如何获取软件版本:
http://wiki.forum.nokia.com/index.php/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%E8%BD%AF%E4%BB%B6%E7%89%88%E6%9C%AC?
ticket=ST-24289-ZQgm5ietVIvXLNbnwJIflsFChaHMzbyExd9-20

1. MMP文件中增添
LIBRARY sysutil.lib
2. Include文件中增添
#include
3. 用法:
a. GetSWVersion()返回手机固件软件版本信息的字符串。

TBuf versionBuf;
SysUtil::GetSWVersion(versionBuf);

使用GetSWVersion()函数,我们看到的结果,和在拨号状态下输入*#0000#代码看到的结果是几乎一样的。例如:
2.0618.06.05
14-07-06
RM-89
(c)Nokia

b. GetLangSWVersion()返回的软件版本是和当前手机的语言包兼容的。

TBuf langSwVersionBuf;
SysUtil::GetLangSWVersion(langSwVersionBuf);范例输出:

2.0618.06.05_v12
14-07-06
RM-89
(c)Nokia
GetLangVersion()函数将会返回当前手机安装的语言包编号。

TBuf langVersionBuf;
SysUtil::GetLangVersion(langVersionBuf);Sample return:

12

78. 立即重画:
// Draw view on demand
void CImageAppView::DrawBitmapNow()
{
CWindowGc& gc = SystemGc();
gc.Activate(Window());
Draw(Rect());
gc.Deactivate();
ControlEnv()->WsSession().Flush();
}

// Clear view
void CImageAppView::Clear()
{
CWindowGc& gc = SystemGc();
gc.Activate(Window());
gc.Clear();
gc.Deactivate();
ControlEnv()->WsSession().Flush();
}

79. Re: CTextView如何设置透明? - 2007-03-07, 09:03

1. 从MFormCustomDraw派生一个类,重写它的DrawBackground()方法,在该方法中绘制背景
图片。注意,参数aParam的iDrawRect成员指定了本次重画的区域,应该画背景位图的对应
区域。例如:
aParam.iGc.DrawBitmap( aParam.iDrawRect, iBitmap, aParam.iDrawRect );

2. 通过CTextView的CTextLayout对象的SetCustomDraw()方法,将该MFormCustomDraw派生类
实例指针通知iLayout对象。我是在创建CTextView之前设置了CTextLayout实例的,不知道像
CEikRichTextEditor这种对象能不能通过其Layout()获得CTextLayout指针并设置,因为我
发现其函数定义是
const CTextLayout* Layout() const;

你可以自己去看看MFormCustomDraw的说明,这个类还有几个方法也挺有用的。

80. 使用TBidiText绘制文本,可以在Symbian7以上使用
const CFont *font = iEikonEnv->NormalFont();
gc.UseFont(font);

TBidiText *bidText = TBidiText::NewL(KLongText(), 50);
CleanupStack::PushL(bidText);

bidText->WrapText(Size().iWidth, *font, NULL);
//TSize sz = bidText->MinimumSize()
TPoint pt = aRect.iTl;
pt.iY += font->HeightInPixels();
bidText->DrawText(gc, pt, font->HeightInPixels());

CleanupStack::PopAndDestroy(bidText);
gc.DiscardFont();
81.
enum TTextEmphasis
{
ENoEmphasis =0x00, // 正常样式
EPartialEmphasis =0x10, // 字体改变
EFullEmphasis =0x20 // 字体和背景全部改变
};
82. 在S60管用,UIQ中不管用。
iLabel->OverrideColorL( EColorLabelText, KRgbRed );


总数:0 页次:1/0 首页 尾页  
总数:0 页次:1/0 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1