norains的专栏

非淡泊无以明志 非宁静无以致远

雨仔ID:norains
117931次访问,排名666好友0人,关注者13
Game
norains的文章
原创 181 篇
翻译 0 篇
转载 10 篇
评论 234 篇
norains的公告
各位兄弟姐妹如果有任何问题,欢迎在Blog留言或是Email至norains#163.com,但请勿发送站内消息或是在个人空间留言,因为本人比较愚钝,实在不知通过何种途径能迅速获取以上两种方式之消息.:-)
最近评论
jencharn:不想说啥,直接顶
zszzju:土土的问:这个例子怎么用呢?编译完成后怎么部署到wince系统里呢?谢谢
bluefish:是啊,现在发现csdn的博客不是那么好了,甚至都比不上以前的功能。我最喜欢用的tag搜索,现在每次打开都是博客的主页,受不了了。取消了tag功能,为啥还链个别的上去呢?链就链吧,为啥要和博客主页相链。拖裤子放屁,多此一举啊。强烈支持一下博主!
DanielWYO:支持博主, 我现在连上自己的CSDN博客都不上了.
已经接近一年了. 老是升级, 说什么改进的, 就不改进些稳定性进来.
zhengguodun:博主,麻烦你看看我以下的调用有问题吗?之前的问题都解决了,现在运行的时候似乎没有反应,以下代码我放在BOOL CMenu2Dlg::OnInitDialog()里面
/////////////////////////////////////////////////////////////////////////////////////////////////////////////……
文章分类
收藏
    相册
    动漫
    文章图片
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 详解WINCE的控制面板收藏

    新一篇: EVC获取电源属性 | 旧一篇: VC绘制位图--BeginPaint()与GetDC()的区别

     //========================================================================
    //TITLE:
    //    详解WINCE的控制面板
    //AUTHOR:
    //    norains
    //DATE:
    //    Tuesday  29-August-2006
    //========================================================================
            曾经在我的一篇《控制面板的创建》中介绍过WinCE控制面板的结构,不过由于那篇文章其目的只在于控制面板如何调用EXE程序,故对控制面板也仅是泛泛而谈.不过在这篇文章中,我们将对WinCE的使用方法来个整体的详解.
            
    1.控制面板的结构
            控制面板其实也是个动态链接库,区别只在于后缀名为.cpl,以及对外接口为CPlApplet().
            接口的原型为:
            LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
            在接口函数中我们需要实现特定几个消息的响应,控制面板才能正常运作.为方便观察,在这里直接贴出消息的响应结构:
            
    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    // The entry point to the Control Panel application.
    // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
    extern "C"  LONG CALLBACK CPlApplet(HWND hwndCPL,UINT message, LPARAM lParam1, LPARAM lParam2)
    {
      switch (message)
      {
        case CPL_INIT:
              // Perform global initializations, especially memory
              // allocations, here.
              // Return 1 for success or 0 for failure.
              // Control Panel does not load if failure is returned.
              return 1;

        case CPL_GETCOUNT:
              // The number of actions supported by this Control
              // Panel application.
              return 1;

        case CPL_NEWINQUIRE:
            {
                  // This message is sent once for each dialog box, as
                  // determined by the value returned from CPL_GETCOUNT.
                  // lParam1 is the 0-based index of the dialog box.
                  // lParam2 is a pointer to the NEWCPLINFO structure.
                    return 0; //means CPLApplet succeed
                    return 1;  // Nonzero value means CPlApplet failed.
                }
        case CPL_DBLCLK:
                {
                  // The user has double-clicked the icon for the
                  // dialog box in lParam1 (zero-based).
                    return 0;     // CPlApplet succeed.
                    return 1;     // CPlApplet failed.
                }
                
        case CPL_STOP:
                    // Called once for each dialog box. Used for cleanup.
                    
        case CPL_EXIT:
                    // Called only once for the application. Used for cleanup.
                    
        default:
              return 0;
      }

      return 1;  // CPlApplet failed.
    }  // CPlApplet

            这几个消息的作用分别是:
            CPL_INIT:初始化,可以在这分配内存等等.
            CPL_GETCOUNT:返回控制面板程序的个数.因为一个.cpl文件中,可能包含多个Applets.
            CPL_NEWINQUIRE:返回包含程序名和图标信息的NEWCPLINFO结构
            CPL_DBLCLK:双击时响应
            CPL_STOP:单个组件退出时响应,用来清除资源内存等
            CPL_EXIT:退出整个cpl程序时响应
            这些消息的定义可以在cpl.h中找到
            
            
    2.在explorer中使用
            如果定制的系统中带有explorer UI,只要把编译好的文件放进"\windows",然后再打开"控制面板"就可以看到.
            
            
    3.如何调用.cpl
            就像PC机中.dll文件不能直接运行,需要借助rundll32.exe来运行一样,WinCE下的.cpl也需要相应的程序来调用,这个程序就是:"ctlpnl.exe".
            比如我们需要调用系统自带的cplmain.cpl的"电源管理",只要在开始菜单的运行中输入:"ctlpnl.exe \windows\cplmain.cpl,5".在路径后面紧跟的"5"只是因为"电源管理"在cplmain.cpl中输入第五个Applet而已.
            由此我们不难得出在程序中运用ShellExecuteEx()函数调用控制面板的Applet的方法.以下这段代码,效果和在命令行中输入命令一样,也是调用"电源管理".
            SHELLEXECUTEINFO info;    
            TCHAR szControlPanelCmdLine[ 200 ];
        swprintf( szControlPanelCmdLine, L"\\windows\\cplmain.cpl,5");
            info.cbSize = sizeof( info );
            info.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
            info.lpVerb = NULL;
            info.lpFile = TEXT("ctlpnl.exe");
            info.lpParameters = szControlPanelCmdLine;
            info.lpDirectory = NULL;
            info.nShow = SW_SHOW;
            info.hInstApp = NULL;
            ShellExecuteEx( &info );    
            
            如果想调用cplmain.cpl的其它Applet,只要把数字改为相对应的即可.
            以下所列的第一项序号为0,接下的为1,其后的继续递增.
            0        CPL_Comm    
        1        CPL_Dialing
        2        CPL_Keyboard
        3        CPL_Password
        4        CPL_Owner   
        5        CPL_Power   
        6        CPL_System  
        7        CPL_Screen    
        8        CPL_Mouse   
        9        CPL_Stylus  
        10    CPL_Sounds  
        11    CPL_SIP"     
        12    CPL_Remove  
        13    CPL_DateTime
        14    CPL_Certs      
        15    CPL_Accessib
        

    4.系统自带控制面板的代码
            微软对控制面板的代码是完全公开的,如果安装的是PB4.2,代码可以在"\PUBLIC\WCESHELLFE\OAK\CTLPNL"中找到.
            CTLPNL文件夹中有九个文件夹,分别对应不同的CPL文件:
            ADVBACKLIGHT:高级背光灯管理
            BTHPNL:蓝牙
            CONNPNL:拨号网络
            CONTROL:主控制台,我们在explorer中看到的"控制面板"应该就是这个
            CPLMAIN:会生成cplmain.cpl,控制面板的大多数选项均源自于此
            CTLPNL:和CONTROL相关联的
            DMPNL:没使用过,不太清楚.不过查看rc文件应该是设置上网的.
            INTL2:区域和语言设置
            STGUI:存储器管理

    发表于 @ 2006年09月07日 11:10:00|评论(loading...)|编辑

    新一篇: EVC获取电源属性 | 旧一篇: VC绘制位图--BeginPaint()与GetDC()的区别

    评论

    #TheGameIsFives 发表于2007-01-29 17:30:06  IP: 219.82.149.*
    你的孩子么?
    #wawdzg 发表于2007-05-13 12:12:45  IP: 222.90.140.*
    您好,请教您一个问题,怎样在定制windows ce 4.2 平台时在控制面板中定制出高级背光控制的项目(advbacklight)——好像就是那个黄颜色的灯泡吧?实现高级背光控制的驱动代码的样例pb在哪里给出呢?或者您有没有例子给我,十分感谢!!!
    #norains 发表于2007-05-14 17:59:57  IP: 219.133.224.*
    wawdzg:高级背光调节的在pb的目录下: ...\PUBLIC\WCESHELLFE\OAK\CTLPNL\ADVBACKLIGHT.
    不过不是个黄颜色的灯泡,仅仅是个扩展设置用的对话框而已...
    #wawdzg 发表于2007-05-15 11:01:25  IP: 219.144.204.*
    哦,我看到有些人可能把它作成了一个黄颜色的灯泡,不过怎样通过pb把它定制在控制面板中呢,就是说让控制面板中出现一个图标,我现在不知到在哪可以把它加上,请教一下,谢谢!
    #norains 发表于2007-05-15 11:47:14  IP: 219.133.224.*
    to wawdzg:这个好像是加上电源管理就可以加到系统中.不过,它是出现在"显示"的"背光灯",在控制面板不会出现独立的图标
    #wawdzg 发表于2007-05-16 10:29:00  IP: 222.90.92.*
    这个我已经做了,但是“显示”的“背景光“只能调节背光节电关闭的时间,不能调节背光的亮度啊,我觉得(advbacklight)可以调节背光的亮度的,我见有人就是加了那个黄颜色灯泡实现的,那个灯泡图标下面写的是(advbacklight)知道怎么搞么?谢谢!
    #norains 发表于2007-05-16 18:45:43  IP: 219.133.138.*
    to wawdzg :很遗憾,wince里没有留给背光亮度等级调节的MDD接口,所以默认是没有此选项的.


    你所看到的黄色灯泡选项,一般都是OEM厂商编写的控制面板选项,让其直接和驱动进行通讯,以达到亮度调节的目的.(PS:我们公司就是这么做的)
    #wawdzg 发表于2007-05-17 13:30:47  IP: 222.90.140.*
    哦,我好像也看到过wince没有背光亮度调节接口,我现在在流接口驱动中实现了背光亮度调节,然后写了一个小程序调用我的驱动调节亮度。但是也想把用控制面板的选项方式实现,这点我不太懂,能否告诉一下怎么实现?我的邮箱是 smartfine@126.com 谢谢了!
    #norains 发表于2007-05-17 23:14:48  IP: 61.141.198.*
    to wawdzg: 控制面板你可以参考一下这篇文章http://blog.csdn.net/norains/archive/2006/09/07/1189143.aspx#562768
    #wawdzg 发表于2007-05-21 22:56:41  IP: 222.90.17.*
    我研究一下,不懂再问阿
    #wawdzg 发表于2007-05-23 10:02:42  IP: 219.144.238.*
    我建了一个工程,可是编译有问题,我对编写dll工程不熟,您能否把例子的完整工程发给我, kingfine@126.com 谢谢!
    #wawdzg 发表于2007-05-28 11:09:34  IP: 219.144.202.*
    怎么不回答了
    #norains 发表于2007-05-28 20:38:45  IP: 218.17.69.*
    to wawdzg:不好意思,最近比较忙,故没上网.之前DLL的样例,是为回答你的一个问题而随手写的,刚刚在硬盘上没有搜索到,可能之前编译通过验证可行之后似乎是删掉了.创建一个DLL工程不是很难,直接可以将源代码拷贝成文件就可以顺利编译,不知道你碰到了什么问题呢?
    #zzd 发表于2008-03-28 16:29:12  IP: 219.133.10.*
    你好!
    我也在实现一个在控制面板背光高级选项里添加一个背光亮度调节的功能,功能基本上OK了,但是有一个问题:点击'Advance'时弹出的对话框尺寸太大,不能根据屏幕自动调整大小,界面看上去很不舒服,我对上层的开发不是很了解,请问这个问题怎么解决?
    #zzd 发表于2008-03-28 16:31:55  IP: 219.133.10.*
    我的屏幕是320*240的,不知跟这个有关系没?十分谢谢!
    2008-04-01 22:02:59作者回复
    to zzd:因为Wince下的对话框不是自适应的,所以屏幕太小的话需要自己调节。你可以参考我这篇文章:http://blog.csdn.net/norains/archive/2006/02/22/605278.aspx
    #wxiantong 发表于2008-04-22 16:34:41  IP: 125.70.253.*
    如何只打开控制面板而不打开里面的应用程序?
    2008-04-23 17:43:18作者回复
    你试试直接只调用“ctlpnl.exe”来试试?不需要命令行。
    #justnetbobo 发表于2008-04-24 15:20:33  IP: 222.66.38.*
    --> wxiantong

    if (!CreateProcess(_T("control.exe"), _T(""), 0, 0, 0, 0, 0, 0, 0, NULL))
    {
    return;
    }
    2008-04-26 09:56:33作者回复
    正解~~!
    #wxiantong 发表于2008-04-25 17:41:26  IP: 125.70.253.*
    直接调用“ctlpnl.exe”打不开,你可以直接单击windows目录下的ctlpnl,没用反应
    2008-04-26 10:01:22作者回复
    经试验,楼上justnetbobo的回复为正解。 :-)
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains