RSS 2.0 Feed
用户界面
摘要:MSDN Wiki在测试半年之后,开始整合到msdn的正式版本,从Visual Studio的IDE也可以看到这些社区贡献的内容了。但是旧的MSDN Wiki网址没有做到新地址的重定向,使用FxCop的用户可能会收到页面不存在的错误信息。 一个临时的解决办法是在FxCop的设置中修改文档的路径 从http://www.gotdotnet.com/team/fxcop/docs/rules.aspx?version=1.35&url= 修改为 http://www.gotdotnet.com/team/fxcop/docs/rules/  ...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 用户界面 文档(Documentation) ]

摘要:Joseph M. Newcomer [MVP]最近在其个人网站上发表了一篇文章(http://www.flounder.com/vs2325.htm),描述了如何创建与Visual C++ 2003和Visual C++ 2005都兼容的项目。这对一些想逐步把项目升级到VS2005的人很有用。不过是逐步升级还是一次到位则取决于项目经理对人力、费用和功能的取舍。 除了工程文件之外,逐步升级的时候项目中的代码可能也有必要兼容多个Visual C++版本。比如从2003升级到2005的时候需要看看Breaking Changes in the Visual C++ 2005 Compiler (http://msdn2.microsoft.com/en-us/library/ms177253.aspx)和What's New in the Visual C++ Libraries(http://msdn2.microsoft.com/en-us/library/y8bt6w34.aspx )。一个很好地兼容了各个Visual C++的版本的示例是BCG ControlBar,可以去其下载页面( http://www.bcgsoft.com/download.htm )下载一个试用版。兼容不同版本的.Net的代码应该判断System.Environment.Version,或者像Aaron Stebner这样读注册表(http://blogs.msdn.com/astebner/archive/2004/09/18/231253.aspx)。 PS: Joseph M. Newcomer的另外一篇文章(http://www.flounder.com/getminmaxinfo.htm)描述了如何在更改对话框大小的时候相应移动控件,不过我个人则偏向于集成一个Windows Forms之后设置控件的Dock属性。...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 用户界面 类库(Library) ]

摘要:在计算亲和数的时候,由于涉及到密集运算,有必要把计算工作转移到背景线程,以避免界面会失去响应。在.Net 1.0中,可以用ManualResetEvent、线程和Delegate的异步调用来实现,但是在.Net 2.0中,可以使用BackgroundWorker对象来简化这个工作。这个对象自动化了进度报告和终止线程的功能。 要使用这个对象来创建工作线程,首先需要加入一个BackgroundWorker对象到表单(Form)或者用户控件(UserControl),然后调用其RunWorkerAsync方法: private: System::Void AmicableNumberView_Load(System::Object^ sender, System::EventArgs^ e) ...{ propertyGrid->SelectedObject = Range; listViewPairs->VirtualListSize=0; timer->Start(); m_rAmicableNumberPairs->Clear(); backgroundWorker->RunWorkerAsync (Range); } 在线程创建之后会自动触发DoWork事件。这个事件中的处理类似于1.1中的线程函数体,可以通过访问DoWorkEventArgs参数的argument属性来访问在用RunWorkerAsync启动线程时传递的参数,以及调用ReportProgress定时报告进度。private: System::Void backgroundWorker_DoWork(System::Object^ sender, System::ComponentModel::DoWorkEventArgs^ e) ...{ CAmicableNumberRange range=(CAmicableNumberRange)e->Argument; int nNumbers=range.Max-range.Min; int nPercentComplete=0; m_rGenerator->Range=range; m_rGenerator->StartWork(); while(!backgroundWorker->CancellationPending && m_rGenerator->DoWork())...{ nPercentComplete = (int)( ......[阅读全文]

posted @ | Feedback (6) | Filed Under [ 用户界面 .Net Framework 类库(Library) 语言(Language) C++/CLI/Managed C++ Extension ]

摘要:Office Live Blog 5号宣布Office Live的测试者暂时不再需要产品密钥来进行注册,但是注册仍然需要一个美国地址和一个信用卡帐户。从站点内容来看,OfficeLive目前的测试版面向的用户是中小企业,提供5个邮箱、30兆空间和免费国际域名(嗯,注册了一个http://jiangsheng.net),以及FrontPage(OK,我知道这玩意现在叫Office SharePoint Designer )和Outlook的功能。 尽管站点的AJAX脚本经常出错(比如在编辑页面输入+号保存之后会消失,上传文件有时会失败),但是整个界面还是比较友好的,类似FrontPage的站点管理用起来很方便,而且类似Office助手的工具栏使得用户可以很快上手。...[阅读全文]

posted @ | Feedback (9) | Filed Under [ 随笔 用户界面 程序人生(Programming on the fly) 脚本(Scripting) ]

摘要: 下载示例工程 - 34 Kb 我在很久之前就开始用程序自动化Shell窗口——主要对象是IE窗口。有时浏览器控件或者MFC类CHTMLView可以满足我的需要,但是很多时候我需要从头嵌入浏览器控件并且尽可能模拟IE的行为,例如实现IDocHostUIHandler来启用自动完成功能。一个很自然的替代方案是直接操作IE窗口。 创建新的Internet Explorer窗口 最简单的方法是调用Windows API ShellExecute (Ex),Paul DiLascia在他的C++ Q&A专栏文章"Browser Detection Revisited, Toolbar Info, IUnknown with COM and MFC"里面有一段示例代码: /**//// As I've shown in many programs... ShellExecute(0, _T("open"), pszMyHTMLFile, 0, 0, SW_SHOWNORMAL); 但是,这样没法控制新的窗口,而且在用户关闭程序之后会留下一个IE窗口。为了扫我自己的门前雪,我需要找到我创建的窗口,并且控制它。 我的下一个尝试是创建和控制一个InternetExplorer对象,并且在必要时关掉它。微软知识库中有这么一篇文章"How To Automate Internet Explorer to POST Form Data" 基本上描述的就是我想要的,除了最后的关闭窗口。嗯,简单的调用IWebBrowser2::Quit就可以做到这一点// create a new IE instance and show it //CComQIPtr m_pWebBrowser2; m_pWebBrowser2.CoCreateInstance(CLSID_InternetExplorer); HRESULT hr; hr = m_pWebBrowser2->put_StatusBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_ToolBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_MenuBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_Visible(VARIANT_TRUE); if(!::PathIsURL(m_strFileToFind)) ......[阅读全文]

posted @ | Feedback (10) | Filed Under [ 用户界面 HTML编程(IE Programming) 类库(Library) 平台SDK(Platform SDK) ]

摘要:个人觉得这次MVP峰会最大的进步就是技术相关的Session数量大大增加,按照MVP专长来分类;而不像上次那样按主题分类。我只需要在VC产品组的日程里面选择就可以了,而不是像上回那样不得不去听移动开发。当然这回也有MVP不去参加VC的Session,跑去听IE和移动开发。内容方面也比上次活泼很多,Don Box还是那么幽默,比尔·盖茨也有搞笑的演出,不过他看起来比去年七月份在北京的时候老多了。 一些可能有人会感兴趣的技术信息 新的产品开发合作网站http://connect.microsoft.com/。在这里可以申请参与新产品的测试。软件开发者可以使用Windows错误报告机制(Windows Error Reporting,简称WER,https://winqual.microsoft.com/parentorgs.asp)来获得反馈。 有人正在开发把VC项目转化成MSBuild的XML格式的工具 (http://blogs.msdn.com/clichten/archive/2005/06/07/Building_VC_projects_with_msbuild_and_not_using_vcbuild.aspx)。关于MSBuild的概述可以看看Christophe Nasarre的文章Overview of MSBuild (http://msdn.microsoft.com/library/en-us/dnlong/html/msbuildpart1.asp)和MSBuild Team Blog (http://blogs.msdn.com/msbuild)。还不知道这个工具是否支持VS.Net中其他语言的项目。新的代号为Phoenix的统一编译器平台也在计划中。可以加入插件来实现自定义语言的编译器 (http://blogs.msdn.com/kangsu/archive/2005/08/11/450481.aspx)。 在MFC8.0中使用Windows Forms会更加简单,加速键和Tab键的处理现在可以扔给MFC来做了 (http://blogs.msdn.com/yvesdolc/archive/2005/04/26/WindowsForms_In_MFC.aspx)。VC8.0中也会有一些新的向导,例如单元测试工程向导 (http://msdn.microsoft.com/library/en-us/dnvs05/html/vs05security.asp)。 一些建议 停止开发新的面向Win9x的程序和静态链接MFC的程序。使用新的MFC版本编译旧的程序来增加应用程序的安全性。 在新的程序中使用Unicode编码,同时尽可能将现有程序移植到Unicode。 移植到Visual C++ 2005来使用强大的编译器和调试器。 尽管限于保密协议我不能说得更多,但是微软在11月7号就会正式发布Visual Studio 2005、SQL Server 2005和BizTalk Server 2006了。新的Visual Studio版本(代号Orca和Hawaii)也正在规划中。...[阅读全文]

posted @ | Feedback (8) | Filed Under [ 用户界面 .Net Framework 集成开发环境(IDE) 类库(Library) 平台SDK(Platform SDK) 文档(Documentation) 语言(Language) ]

摘要:使用USB存储或者软盘可以在机房和家里的计算机之间传输数据,但是在可以访问因特网的时候,在线存储是更加快捷和便宜的替代方案。典型的在线存储包含MSN 上的“我的网站”、FTP服务,以及基于网页的存储空间。 原文:http://cn.geocities.com/sheng_jiang/accessdocumentsfrominternet.doc 全文阅读:http://spaces.msn.com/members/jiangsheng/Blog/cns!1pVUmC6mid-3zVpLZNQTgtuw!199.entry (英文) 一个飓风刚走,另一个更大的飓风又来了,这回是直冲本州而来。新奥尔良和休斯敦疏散过来一大堆人,但是这里很可能也得疏散。希望休斯敦不会成为第二个新奥尔良。...[阅读全文]

posted @ | Feedback (0) | Filed Under [ 随笔 用户界面 ]

摘要:?MFC提供了许多十分有用的类和对象,在很多时候在Office插件、BHO、常规DLL这样的工程中加入MFC支持是一个不错的选择。但是,MFC中的很多功能,例如资源查找,消息预处理等等都依赖于在进程或者线程创建时被初始化的MFC内部数据;而对于需要添加MFC支持的工程,这些数据并不会被自动地初始化。这时候使用一些MFC的功能,例如使用CString从字符串表加载一个字符串,或者使用CDialog::DoModal()创建一个模态对话框,都会有断言错误,用ATL向导创建的支持MFC的程序也没有多少改善,在CWinApp的DLL版本中没有初始化线程数据,所以调用AfxGetThread会返回空指针。解决这个问题的一个办法是使用AfxBeginThread来启动一个MFC线程,这样MFC会初始化线程相关的数据。在下面的示例中,我在线程初始化时建立了一个模态对话框,以避免直接创建模态对话框会触发的断言失败信息。为了模拟模态对话框的效果,在CDialogThread::WaitForDoModal()这个函数中创建了一个消息循环来等待线程结束,同时用MsgWaitForMultipleObjects来避免死锁。因为MFC中和进程相关的数据并不总是被正确初始化,在调用模态对话框之前也需要手动设置一下。 //如果这段代码可以工作,那么它的作者是Jiangsheng //否则我不知道它的作者 void __stdcall CFrontPageAddin::OnClickButtonExportCHM(IDispatch* /*Office::_CommandBarButton* */ Ctrl,VARIANT_BOOL * CancelDefault) { AtlTrace(_T(" CFPAnt::OnClickButtonExportCHM\n")); //create a thread to avoid assert failure CDialogThread* pDialogThread= (CDialogThread*)AfxBeginThread(RUNTIME_CLASS(CDialogThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED,NULL); if(pDialogThread) { pDialogThread->m_prc=RUNTIME_CLASS(CExportCHMSheet); pDialogThread->ResumeThread(); pDialogThread->WaitForDoModal(); ......[阅读全文]

posted @ | Feedback (1) | Filed Under [ 用户界面 .Net Framework 类库(Library) ]

摘要:微软的桌面搜索API推出也有一段时间了,但是网上可以找到的相关技术资料还不多。官方的资料在http://addins.msn.com/devguide.aspx可以看到,而且网页上有SDK和一个C#的示例供下载。使用搜索API非常的简单,首先创建一个桌面搜索对象BOOL CWDSSampleView::PreCreateWindow(CREATESTRUCT& cs){ // TODO: Modify the Window class or styles here by modifying //  the CREATESTRUCT cs if(m_pSearchDesktop.CreateInstance(CLSID_SearchDesktop)) {  AfxMessageBox(IDS_FAILED_TO_CREATE_SEARCH_ENGINE);  return FALSE; } ……之后就可以开始执行搜索了。桌面搜索对象有两个方法,ExecuteSQLQuery和ExecuteQuery,都返回一个ADO记录集对象。ExecuteQuery是对用户比较友好的版本,参数虽然比较多,但是不需要自己构建SQL;而ExecuteSQLQuery是底层版本,只有一个参数——需要自己构造的SQL。相信我,你不会渴望自己来创建SQL的。传递给ExecuteQuery的参数就已经够长的了。字符串表中IDS_COLUMNS_GENERAL的内容是:DocTitle,DocFormat,Url,DocAuthor,PrimaryDate,FileName, FileExt,IsAttachment,Characterization,Rank,PerceivedType, HasAttach,DocTitlePrefix,FileExtDesc,DisplayFolder, DocKeywords,DocComments,ConversationID,Size, Create,Write。 void CWDSSampleView::Search(LPCTSTR lpszQuery,LPCTSTR lpszSort){ CString strQuery(lpszQuery);if(strQuery.IsEmpty())return; CString strSort(lpszSort); USES_CONVERSION; HRESULT hr=S_OK; GetListCtrl().SetItemCount(0); ClearCache(); try{  CString strColumns;  VERIFY(strColumns.LoadString(IDS_COLUMNS_GENERAL));  if(strSort.IsEmpty())   m_pRecordset=m_pSearchDesktop->ExecuteQuery(T2OLE(strQuery),    T2OLE(strColumns),NULL,NULL);  else   m_pRecordset=m_pSearchDesktop->ExecuteQuery(T2OLE(strQuery),    T2OLE(strColumns),T2OLE(strSort),NULL);  int nItemCount=m_pRecordset->GetRecordCount();  GetListCtrl().SetItemCount(nItemCount);   } catch(_com_error&e) {  …… }} 但是,访问返回的记录集的速度比访问数据库要慢。我不得不用虚列表和缓存来提高性能。在搜索结果很多(例如关键字选择"Microsoft")时程序有假死现象——当然也不排除我选择的字段过多的原因。 最近在写一个14位CPU的模拟器,CPU指令长度是固定的——13字节,十分的不吉利^_^b,而且CPU指令集中一些特定指令会根据上下文判断是否跳过下一个指令。但是在Intel系统上没有这样的指令,而且指令长度是可变的,所以无法知道下一个指令的长度来跳过它。我现在是在内存中设置一个标志,在执行每个指令之前检查这个标志来判断前一个指令是否指明跳过当前指令——低效,但是可以正常工作。 现在我知道一些模拟器为什么慢得像乌龟爬了……...[阅读全文]

posted @ | Feedback (3) | Filed Under [ 随笔 用户界面 程序人生(Programming on the fly) 调试技巧(Debugging) 集成开发环境(IDE) 类库(Library) 平台SDK(Platform SDK) 数据访问(Data Access) 文档(Documentation) 组件开发(Component Development) ]

摘要:Hook DHTML Commands 浏览器在执行很多命令之前都会允许容器来替换默认的处理。在执行一些默认的命令之前,系统会查询用户对IDocHostUIHandler的实现对象的IOleCommandTarget接口,调用默认(NULL)或者CGID_DocHostCommandHandler命令组的命令。如果容器的对应命令处理返回S_OK。那么默认的处理就不会被调用。 下面列出一些可以在容器中自定义的操作:(这些常量的定义位于docobj.h中) OLECMDID_PRINT,默认命令组 OLECMDID_SHOWSCRIPTERROR, CGID_DocHostCommandHandler命令组 OLECMDID_FOCUSVIEWCONTROLSQUERY, CGID_DocHostCommandHandler命令组 OLECMDID_SHOWPAGEACTIONMENU, CGID_DocHostCommandHandler命令组 MFC提供了一些比较容易扩展的类和宏,这样可以很容易地在扩展容器来实现新的接口。这里使用CCmdTarget类提供的GetInterfaceHook虚函数来进行扩展。 //This sample is based on MFC sample DHTMLExplore. //a button is inserted into explore.htm: //<BUTTON class=hotElement id=print accesskey="P"><U>P</U>rint</BUTTON> //to invoke the print command #include <afxole.h> #include <mshtmcid.h> ///////////////////////////////////////////////////////////////////////////// // CDHtmlExploreDlg dialog class CDHtmlExploreDlg; //customize the CBrowserControlSite class to implement IOleCommandTarget. //the IDocHostUIHandler interface is implemented in CBrowserControlSite, //an internal control site class declared within afxdhtml.h class CDHtmlExploreControlSite: public CBrowserControlSite , public IOleCommandTarget CDHtmlExploreControlSite( COleControlContainer* pCtrlCont, CDHtmlExploreDlg *pHandler) : CBrowserControlSite(pCtrlCont,pHandler){}; protected: // Implementation ......[阅读全文]

posted @ | Feedback (6) | Filed Under [ 用户界面 HTML编程(IE Programming) 集成开发环境(IDE) 脚本(Scripting) 类库(Library) 平台SDK(Platform SDK) 语言(Language) ]

Full 用户界面 Archive