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