当前位置: 首页 > news >正文

个人网站建设流程 域名注册的选择app注册推广团队

个人网站建设流程 域名注册的选择,app注册推广团队,免费一级做网站,版面设计图大全模板本篇文章讲解的是开发 Windows Mobile 上的今日插件。关于是今日插件#xff0c;在 PPC 或者 SP SDK 的帮助文档中有相关的章节介绍#xff0c;在网络上也有一些帖子和资源讲解。在这里简要回顾一下。今日插件就是在windows mobile的桌面上显示的条目#xff0c;例如系统提供…本篇文章讲解的是开发 Windows Mobile 上的今日插件。关于是今日插件在 PPC 或者 SP SDK 的帮助文档中有相关的章节介绍在网络上也有一些帖子和资源讲解。在这里简要回顾一下。今日插件就是在windows mobile的桌面上显示的条目例如系统提供的“日历”Calendar主人信息以及许多第三方开发的今日插件等等。由于桌面是开机后的第一个屏幕所以插件显示在屏幕上将会得到用户最多的浏览时间。这里我们主要讲解的是用户自定义插件的开发。自定义插件如下图所示      一个插件就是一个位于屏幕上的窗口每个插件负责自己的绘制和对用户输入的响应。插件可以通过给自己的父窗口桌面窗口发送TODAYM_DRAWWATERMARK 消息委托父窗口为自己绘制背景也就是通过把自己的HDC传递给shell来完成的这样插件就看起来好像是“透明”的效果。同时shell 也负责在相邻的插件之间绘制一条分割线。通常PPC 最多允许加载 12 个插件。最大插件数量是由 K_cTodayItemsMax 定义的。对于自定义的插件要求开发者提供一个DLL函数并注册到注册表 HKLM\Softeware\Microsoft\Today\Items如下图我们使用远程注册表查看工具打开一个插件的在注册表中的位置      在下面包含了所有今日插件的键。每个插件将含有下列的值 ◆Type DWORD对自定义插件来说等于4。它是 SDK 中的插件类型枚举中的一个值 tlitCustom。 typedef enum _TODAYLISTITEMTYPE { tlitOwnerInfo 0, tlitAppointments, tlitMail,tlitTasks,tlitCustom, //自定义插件 4tlitNil} TODAYLISTITEMTYPE;◆Enabled插件是否启用。用户能够在设置-今日-项目中进行启用或禁用。◆Options是否含有设置对话框。也就是设置-今日-项目中插件被选中时的 “选项按钮” 的 Enabled 状态。◆DLL插件dll的路径。◆Selectability可选项插件是否可以被选中用户在屏幕上按导航键时。通常为1表示允许被选中。当允许选中时用户按上下方向键被选中的插件背景会高亮。如果不能选中就会跳过该插件。◆Order可选项插件显示循序的排序值。缺省时由系统自动设置。下面我们再介绍插件的协议也就是插件的DLL应当满足以下要求。1要求 dll 导出序号为 240 的以下函数以初始化和创建插件窗口      #define ORDINAL_INITIALIZEITEM      240typedef HWND (*PFNCUSTOMINITIALIZEITEM)(TODAYLISTITEM *, HWND);参数1TODAYLISTITEM 结构的指针包含了该插件在系统中注册的相关信息。参数2桌面窗口的句柄它将成为插件窗口的父窗口。2如果插件具有设置对话框则要求dll导出序号为 241 的以下函数作为设置对话框的窗口过程      #define ORDINAL_OPTIONSDIALOGPROC   241typedef BOOL (*PFNCUSTOMOPTIONSDLGPROC)(HWND, UINT, UINT, LONG);同时要求dll 提供资源ID为 500的一个对话框资源作为设置对话框的模板。可以通过手工修改 resource.h 中的定义3shell 将向插件窗口发送以下信息要求插件处理这些消息      WM_TODAYCUSTOM_CLEARCACHE告知插件正在被从显示中卸载要求插件清理自己所维护的数据缓存。      WM_TODAYCUSTOM_QUERYREFRESHCACHE此消息在桌面显示期间以每2秒钟一次的频率周期性对所有插件发送。询问插件是否需要进行更新。在插件首次加载时还要求插件告知系统插件的高度以对插件窗口进行布局。由于插件窗口被上下垂直分布所以宽度对于系统属于已知的。如果返回TRUE表示要求进行更新。如果不需要更新返回FALSE。4同时插件还能够向父窗口发送以下消息以辅助绘制。      TODAYM_GETCOLOR询问系统当前使用的前景色背景色高亮前景色等信息。以便绘制时和系统使用的主题风格保持一致。      TODAYM_DRAWWATERMARK要求shell 为插件绘制背景。也就是把背景位图复制到插件窗口的背景。好了关于插件开发规则我们就简要介绍到此。在开发插件时开发者的主要任务是编写插件窗口\设置对话框的窗口过程完成属于自己的功能。这里要求具有的是windows开发的一些基础。我们不细作介绍了。下面是我在这几天制作的插件。1根据 SDK 中 范例改编而成的 memWatcher 插件 和 “桌面便笺”。效果如下      在左图是SDK中的 memWatcher 范例在模拟器中的显示效果右图是经过我适当改写后在实际HTC S1中运行的效果。SDK范例显示了程序和存储的百分比并且创建了两个进度条窗口显示。经过我的改写我把进度条去掉了从而可以把信息压缩到一行以内这样可以节省屏幕空间并且增加了电池电量的显示。获取这些信息的相关API函数是      GlobalMemoryStatusGetStoreInformationGetSystemPowerStatusEx下面我们看下桌面便笺插件这个插件发布在 pdafans 论坛后很快就有网友向我反馈了备忘录的内容在重启后消失这是因为我做的这个插件也仅仅是个范例来使用测试了我的想法是可行的所以并没有考虑那么多。便笺的内容被放到了内存里声明周期和DLL一样这也一旦DLL被卸载存储在内存中的内容也就失去了。这也提醒了我们一点我们的插件应该将数据持久化。所以我又修改了这个插件把备忘信息和图标索引存储到了注册表中也就是插件注册的键下面新增了两个值。这样我们就可以保证每次插件启动时都会从注册表中读取出上次的用户记录的内容。当用鼠标点击桌面便笺时就会弹出一个对话框用于设置新的备忘内容如下图所示      这个对话框中具有一点难度和技巧性的是上面的图标选择反馈全部是通过鼠标点击事件来完成的。我们在对话框的 WM_ONPAINT 消息处理中在对话框上绘制了所有可选图标每个图标实际上是16*16像素大小所以我指定的网格是20*20像素在每个网格中绘制一个图标并对被选中图标绘制了一个蓝色矩形框表示选中状态。当鼠标点击到其他图标时我们就要更新这个蓝色矩形。同时我们也要根据鼠标位置在网格中正确的定位要当前位置选中的鼠标索引。这里的处理并不算非常难但是需要少许的耐心。显示和隐藏输入面板在 .NET CF中有一个inputPanel控件我们 可以方便的设置它的Visible属性去控制。而在EVC中我们是通过下面的API函数去显示或者隐藏SIP的。      SipShowIM(SIPF_ON) 和 SipShowIM(SIPF_OFF);或者我们也可以使用SHSipPreference(hDlg, SIP_UP) 去要求 Shell 浮出输入面板。2桌面记单词插件。桌面记单词插件的灵感是来自桌面上的类似工具即有一个顶层窗口以一个固定的频率切换词条显示以帮助用户背单词。我这里就是模拟这种软件的效果做的一个今日插件。当然它不仅仅可以背单词也可以显示其他字典内容例如唐诗宋词名言名句等等。用户可以自定义字典文件本质上就是一个文本文件并通过修改配置文件把字典添加进来。为了降低读文件的频率我在插件内维护了一个词条缓存缓存10个词条每次一次性尝试从文件中加载10个词条文件每个词条也就是文本文件中的一行到内存中。当词条正在滚动期间文件保持打开状态。当暂停滚动时将会关闭文件。插件利用每2秒钟接收到的消息去滚动词条。效果如下图所示      开发这个插件时我忽然发现 Pocket PC 的操作系统是不支持读写 ini 文件的相关API函数的。我去网络上找了下相关代码但是没有看到特别满意的。因此我自己用C语言写了几个和API函数功能相同的读 ini 文件的函数。函数命名也是完全相同的为了在 PC上进行测试我在每个函数名前面加了 Ce 以和系统的API函数区分开。我这里仅仅为了插件功能写了有限的几个函数这里以 CeGetPrivateProfileString 为例给出代码。在PC上这个函数负责读取 ini 文件某个 section 中某个 key 的值。为了同时在 unicode 和 多字节字符串环境中适用我又把相关的文件和字符串操作函数进行了宏定义并且以这种方式命名       t_多字节版本函数名这是因为对多字节版本的函数我们通常更加熟悉它的命名。例如对于 t_strcpy 等等。下面是这个函数的代码Code_CeGetPrivateProfileString#ifdef  UNICODE   // r_winnt    #define t_fopen         _wfopen    #define t_fgets            fgetws    #define t_sprintf        swprintf    //格式化文本    #define t_strcpy        wcscpy    #define t_strncpy        wcsncpy        //拷贝指定个数的字符    #define t_strcat        wcscat        //append a string    #define t_strtol        wcstol    #define t_strlen        wcslen    #define t_strcmp        wcscmp    #define t_stricmp        _wcsicmp    //忽略大小写的字符串比较    #define t_strncmp        wcsncmp        //比较n个字符    #define t_strchr        wcschr        //find a character in a string    #define t_strrchr        wcsrchr        //从结尾向前查找字符#else  //ASCII CODE    #define t_fopen         fopen    #define t_fgets            fgets        //读取一行文本    #define t_sprintf        sprintf        //格式化文本    #define t_strcpy        strcpy    #define t_strncpy        strncpy        //拷贝指定个数的字符    #define t_strcat        strcat        //append a string    #define t_strtol        strtol        //把字符串转换成longint32    #define t_strlen        strlen    #define t_strcmp        strcmp        //比较字符串    #define t_stricmp        _stricmp    //忽略大小写的字符串比较    #define t_strncmp        strncmp        //比较n个字符    #define t_strchr        strchr        //查找字符    #define t_strrchr        strrchr        //从结尾向前查找字符#endif#define LINESIZE    260    //行缓冲区大小//从appnamesection中读取string类型keyDWORD CeGetPrivateProfileString(    LPCTSTR lpAppName,                //section name: [lpAppName]    LPCTSTR lpKeyName,                //lpKeyNamelpReturnedString    LPCTSTR lpDefault,                //未找到时的默认值    LPTSTR lpReturnedString,    //[out] 查找到的结果    DWORD nSize,                            //[in]lpReturnedString的字符数,注意单位不是字节    LPCTSTR lpFileName    ){    DWORD ret  0;    FILE *stream;    bool bFindVal  false;    bool bFindSection  false;    TCHAR line[ LINESIZE ];    size_t sectionLength, keyLength, lineLength;        stream  t_fopen(lpFileName, _T(r));    if(stream  NULL)    {        //设置默认值        t_strcpy(lpReturnedString, lpDefault);        ret  t_strlen(lpReturnedString);         return ret;    }        sectionLength  t_strlen(lpAppName);        while(t_fgets(line, LINESIZE, stream) ! NULL)    {        //忽略注释行和空行        if(line[0]  0 || line[0]  ;) continue;        lineLength  t_strlen(line);        //注意把LF0xa字符替换成0这在UNICODE环境下可能出现结尾是LF        if(line[ lineLength - 1 ]  0x0a)        {            line[ lineLength - 1 ]  0;            lineLength--;            //注意此时可能会成为空字符串            if(lineLength  0) continue;        }                //尝试寻找到 section        if(!bFindSection)        {            if(line[0] ! [) continue; //本行是否是 [section]            //这里是我们想要的Section吗            //检查这一行的宽度是否正好是section长度加2 [lpAppName]            if(line[sectionLength  1] ! ]) continue;            if(t_strncmp(line1, lpAppName, sectionLength) ! 0) continue;            //Now Section will appear on next line             //读取section前求出 Key 的长度            keyLength  t_strlen(lpKeyName);            bFindSection  true;                        continue;        }                //查找Key, Section End?        if(line[0][) break; //遇到了下一个                    if(lineLength  keyLength1 || line[keyLength] ! ) continue; //KeyName        if(t_strncmp(line, lpKeyName, keyLength)!0) continue;        //Now We Get the Key!         t_strcpy(lpReturnedString, line  keyLength  1);        //Now Its done.        bFindVal  true;        break;    }        fclose(stream);    if(!bFindVal)    {        //设置默认值        t_strcpy(lpReturnedString, lpDefault);     }    ret  t_strlen(lpReturnedString);     return ret;}下面是我提供了一个演示程序由于我们知道了插件的协议所以我们也可以显示出其他插件的选项对话框为了更具可读性代码经过了精简。Code_显示其他插件的选项对话框TCHAR path[256];GetDlgItemText(hDlg, IDC_DLLPATH, path, 256);// load dllg_PluginModule  LoadLibrary(path);// get dlgproc address 窗口过程函数的导出序号是241g_PluginProc  (DLGPROC)GetProcAddress(g_PluginModule, (LPCTSTR)241);// create options dlgg_PluginDlg  CreateDialog(g_PluginModule, (LPCTSTR)MAKEINTRESOURCE(500), NULL, g_PluginProc);ShowWindow(g_PluginDlg, SW_SHOW);SetWindowPos(g_PluginDlg, NULL, 30, 80, 0, 0, SWP_NOSIZE);return TRUE;运行效果如图所示最后我们开发好插件以后可以利用SDK提供的打包工具把插件制作成 cab 包这样复制到设备上即可自动安装。打包是使用SDK提供的工具完成但是我们首先需要自己为我们的软件编写一个 inf 文件描述软件的发装过程。inf文件详细描述了需要拷贝的文件清单源目录目标目录要添加的注册表信息等内容。这里可以参考 SDK中的范例细节就不再描述了。这里我使用 mymemo 的 inf 文件做一个例子说明为了更具可读性文件内容经过了精简。mymemo.inf[Version]Signature    $Windows NT$Provider     MicrosoftCESignature  $Windows CE$[CEStrings]AppName      MyMemoInstallDir   %CE2%             ; \Windows [CEDevice]UnsupportedPlatforms     HPC,Jupiter,Palm PC2VersionMin          3.0VersionMax         6.0[PPC2003_Device]ProcessorType            2577      ; ARM CPU[SourceDisksNames.PPC2003_Device]1  ,ARM Files,,ARMV4Rel[SourceDisksFiles]mymemo.dll                     1     ; the Today plugin dll[DestinationDirs]Files.Windows        0,%CE2%           ; \Windows directory[Files.Windows]mymemo.dll,mymemo.dll,,0x00000001[Reg.Version1]HKLM,Software\Microsoft\Today\Items\%AppName%,Enabled,0x00010001,0HKLM,Software\Microsoft\Today\Items\%AppName%,Type,0x00010001,4HKLM,Software\Microsoft\Today\Items\%AppName%,Options,0x00010001,0HKLM,Software\Microsoft\Today\Items\%AppName%,Selectability,0x00010001,1HKLM,Software\Microsoft\Today\Items\%AppName%,IconIndex,0x00010001,0 HKLM,Software\Microsoft\Today\Items\%AppName%,DLL,0x00000002,%InstallDir%\mymemo.dllHKLM,Software\Microsoft\Today\Items\%AppName%,Memo,0x00000002,Type here to input memo打包工具是一个命令行程序我们执行以下命令cabwiz mymemo.inf  /err errinfo.txt  /cpu PPC2003_Device      其中/err选项指定错误输出文件当打包失败时这是诊断问题的重要信息。/cpu选项指定是inf文件中定义过的CPU类型如果在inf文件中定义了多种CPU类型可以同时为多种CPU打包所以一个inf文件可以多用。最后我们给出相关的下载连接1程序存储电量百分比显示和桌面便笺插件的CAB包下载链接      http://files.cnblogs.com/hoodlum1980/PPCCAB_MyMemo_MemWatcher.rar2桌面记单词插件的CAB包下载链接      http://files.cnblogs.com/hoodlum1980/Recite_CAB_ARMV4.rar3然后在给出一个我以前写的C语言的俄罗斯方块最早发表在编程论坛移植到PPC上的版本      http://files.cnblogs.com/hoodlum1980/Tetris.rar运行效果截图      4最后我们给出本文提及所有源代码的合集下载连接全部使用EVC4.0使用C开发。每个插件包含了用于打包的 inf 文件。      http://files.cnblogs.com/hoodlum1980/TodayPlugins.rar 转载于:https://www.cnblogs.com/hoodlum1980/archive/2009/08/01/1536246.html
http://wiki.neutronadmin.com/news/250845/

相关文章:

  • 三位数的域名网站全球最大的设计网站
  • 网站建设需要了解的重庆口碑最好的装修公司
  • 长春网站优化哪家好sem竞价推广怎么做
  • 电子商务网站设计的基本要求wordpress 子模板
  • 有关做洁净工程的企业网站怎样判断网站的好坏
  • 德阳百度网站建设安卓app公司开发
  • 如何做好网站关键词优化wordpress图片付费主题
  • 网站需要多大宽带网站开发 团队协作
  • 网站后续建设说明seo培训公司
  • 台州网站快速优化排名济南建设工程备案网站
  • 广州网站建设 知名网站建设的基本流程是怎样的
  • php网站建设教程 电子书网页qq直接登陆
  • 专业网站设计开发网站百度网站的结构
  • 网站建设uuiop装修公司的收费标准
  • 天津市住房和城乡建设厅官方网站免费自助建站服务
  • 建设银行网站首页是多少上海国际网站建设
  • 百度个人网站申请企业建设网站的目的和意义
  • 湛江网站建设咨询直播开放平台登陆
  • 信阳建设企业网站确实网站的建设目标
  • 重庆网站设计公司赣州人才网官网
  • 杭州有做网站广州有哪些网站建设
  • 重庆seo整站优化seo是指
  • 贵州省住房和城乡建设部网站首页图案生成器
  • 免费建站的平台wordpress调用文章
  • 免费做网站网站的软件建筑人才网官方网站查询
  • 鄞州区网站建设淘宝网站的建设目的是什么
  • 哪个公司的网站做得好网站优化和推广
  • 深圳论坛网站建设爱站seo查询软件
  • jsp网站开发实现增删改查长春朝阳网站建设
  • 中能建设集团电子商务网站安卓系统开发软件