norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142881次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 一个简单的带消息循环的控制面板选项例程收藏

    新一篇: 镜子和爱情 | 旧一篇: wince下用DirectShow播放音频和视频

    //========================================================================
    //TITLE:
    //    一个简单的带消息循环的控制面板选项例程
    //AUTHOR:
    //    norains
    //DATE:
    //    Thursday  16-May-2007
    //Environment:
    //        EVC4.0 + Standard SDK 4.2
    //        EVC4.0 + Standard SDK 5.0
    //========================================================================

            普通的应用程序可以在WinMain()中进行消息循环,当然CPL也可以,不过不是在DllMain(),而是在CPlApplet接收CPL_DBLCLK时.本文给出了一个很简单的在控制面板创建对话框的例子.
           
            关于控制面板的功能和架构在我的其它文章里已经有介绍,这里就不再陈诉,而直接罗列代码.对本章所列代码有所不明白的朋友可以参考以下这几篇文章:
            WinCE 控制面板的创建:http://blog.csdn.net/norains/archive/2006/02/25/609216.aspx
            WinCE 控制面板和驱动通信:http://blog.csdn.net/norains/archive/2006/02/25/609217.aspx
            详解WINCE的控制面板:http://blog.csdn.net/norains/archive/2006/09/07/1189143.aspx


    ////////////////////////////////////////////////////////////////////////
    // DisplayOutput.cpp : Defines the entry point for the DLL application.
    //
    ///////////////////////////////////////////////////////////////////////

    #include 
    "stdafx.h"
    #include 
    "D:\ProgramFiles\WINCE500\PUBLIC\COMMON\OAK\INC\Cpl.h"
    #include 
    "resource.h"
    #include 
    "Maindlg.h"
    //---------------------------------------------------------------------
    //Macro define

    #define CPL_TITLE            TEXT("简单例程")
    #define CPL_INFO            TEXT("这是一个很简单例程的信息")

    // Returns the number of characters in an expression.
    #define LENGTHOF(exp)        ((sizeof((exp)))/sizeof((*(exp))))

    //--------------------------------------------------------------------------------
    //Global data
    HMODULE g_hModule = NULL;   // Handle to the DLL.


    //--------------------------------------------------------------------------------
    //Description:
    //    Main entry point for the Control Panel DLL.
    //--------------------------------------------------------------------------------------------
    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        
    switch(ul_reason_for_call)
        
    {
            
    case DLL_PROCESS_ATTACH:
                
    {
                    g_hModule 
    = (HMODULE) hModule;
                    
    break;
                }

            
    case DLL_THREAD_ATTACH:
            
    case DLL_THREAD_DETACH:
            
    case DLL_PROCESS_DETACH:
               
    break;
        }


        
    return TRUE;
    }





    //--------------------------------------------------------------------------------------------
    //Description:
    //    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.
            {
                ASSERT(
    0 == lParam1);
                ASSERT(lParam2);


                NEWCPLINFO
    * lpNewCplInfo = (NEWCPLINFO *) lParam2;
                
    if (lpNewCplInfo)
                
    {
                    lpNewCplInfo
    ->dwSize = sizeof(NEWCPLINFO);
                    lpNewCplInfo
    ->dwFlags = 0//Ignored
                    lpNewCplInfo->dwHelpContext = 0//Ignored
                    lpNewCplInfo->lData = IDI_ICON;

                    
    // The large icon for this application. Do not free this 
                    
    // HICON; it is freed by the Control Panel infrastructure.
                    lpNewCplInfo->hIcon = LoadIcon(g_hModule,MAKEINTRESOURCE(IDI_ICON));
                    
    if(_tcslen(CPL_TITLE) < LENGTHOF(lpNewCplInfo->szName))
                    
    {
                        _tcscpy(lpNewCplInfo
    ->szName,CPL_TITLE);
                    }

                    
    if(_tcslen(CPL_INFO) < LENGTHOF(lpNewCplInfo->szInfo))
                    
    {
                        _tcscpy(lpNewCplInfo
    ->szInfo,CPL_INFO);
                    }

                    _tcscpy(lpNewCplInfo
    ->szHelpFile, _T(""));


                    
    return 0;
                }

                
    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).
                HWND hWnd = FindWindow(NULL,WND_TITLE);
                
    if(hWnd != NULL)
                
    {
                    SetForegroundWindow(hWnd);
                    
    return 1;
                }


                CMainDlg 
    *pWnd = CMainDlg::GetInstance();
                
    if(pWnd != NULL)
                
    {
                    pWnd
    ->ShowWindow(g_hModule,TRUE);
                }

                    
                
                MSG msg;
                
    while(GetMessage(&msg,NULL,0,0))
                
    {
                    TranslateMessage(
    &msg);
                    DispatchMessage(
    &msg);
                }

                
    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


    //////////////////////////////////////////////////////////////////////
    // MainDlg.h: interface for the CMainDlg class.
    //
    //////////////////////////////////////////////////////////////////////
    #ifndef MAINDLG_H
    #define MAINDLG_H


    //---------------------------------------------------------------------
    //Macro define
    #define WND_TITLE            TEXT("Hello World")
    //---------------------------------------------------------------------

    class CMainDlg  
    {
    public:
        
    static CMainDlg * GetInstance();
        BOOL ShowWindow(HINSTANCE hInst,BOOL bShow);
        
    virtual ~CMainDlg();

    protected:
        
    void OnDestroy(HWND hWnd,UINT wMsg,WPARAM wParam,LPARAM lParam);
        
    static BOOL WinProc(HWND hWnd, UINT wMsg, WPARAM wParam,LPARAM lParam);
        
    static CMainDlg *m_pInstance;
        HWND m_hWnd;
        HINSTANCE m_hInst;

    private:
        CMainDlg();
    }
    ;

    #endif // #ifndef MAINDLG_H



    ///////////////////////////////////////////////////////////////////////
    // MainDlg.cpp: implementation of the CMainDlg class.
    //
    //////////////////////////////////////////////////////////////////////

    #include 
    "stdafx.h"
    #include 
    "MainDlg.h"
    #include 
    "resource.h"


    //---------------------------------------------------------------------
    //Initialize the data
    CMainDlg *CMainDlg::m_pInstance = NULL;
    //-----------------------------------------------------------------------
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////

    CMainDlg::CMainDlg()
    {
        m_hWnd 
    = NULL;
        m_hInst 
    = NULL;
    }


    CMainDlg::
    ~CMainDlg()
    {
        
    if(m_pInstance != NULL)
        
    {
            delete m_pInstance;
            m_pInstance 
    = NULL;
        }

    }



    //---------------------------------------------------------------------
    //Description:
    //    Show the dialog
    //---------------------------------------------------------------------
    BOOL CMainDlg::ShowWindow(HINSTANCE hInst, BOOL bShow)
    {
        m_hInst 
    = hInst;
        m_hWnd 
    = CreateDialog(hInst,MAKEINTRESOURCE(IDD_MAIN),NULL,WinProc);
        


        
    if(m_hWnd == NULL)
        
    {
            
    return FALSE;
        }

        
        
    if(bShow == TRUE)
        
    {
            ::ShowWindow(m_hWnd,SW_SHOW);
        }

        
    else
        
    {
            ::ShowWindow(m_hWnd,SW_HIDE);
        }

        SetForegroundWindow(m_hWnd);


        
    return TRUE;
    }




    //---------------------------------------------------------------------
    //Description:
    //    The window process
    //---------------------------------------------------------------------
    BOOL CMainDlg::WinProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
    {
        
    switch(wMsg)
        
    {
            
    case WM_COMMAND:
            
    {
                
    switch(LOWORD(wParam))
                
    {
                    
    case IDCANCEL:
                        DestroyWindow(hWnd);
                        
    return TRUE;
                }

            }

            
    case WM_DESTROY:
                m_pInstance
    ->OnDestroy(hWnd,wMsg,wParam,lParam);
                
    return TRUE;
        }

        
    return FALSE;
    }




    //---------------------------------------------------------------------
    //Description:
    //    Get the instance
    //---------------------------------------------------------------------
    CMainDlg * CMainDlg::GetInstance()
    {
        
    if(m_pInstance == NULL)
        
    {
            m_pInstance 
    = new CMainDlg();
        }


        
    return m_pInstance;
    }





    //---------------------------------------------------------------------
    //Description:
    //    On the message WM_DESTROY
    //---------------------------------------------------------------------
    void CMainDlg::OnDestroy(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
    {
        PostQuitMessage(
    0x0);
    }


    发表于 @ 2007年05月17日 23:13:00|评论(loading...)|编辑

    新一篇: 镜子和爱情 | 旧一篇: wince下用DirectShow播放音频和视频

    评论

    #JIESS 发表于2008-04-10 17:30:26  IP: 121.35.89.*
    弄了一个下午,拷到CE的windows目录下还是没有被ctlpnl.exe成功加载.CE 开发技巧与实例中的例子倒可以显示图标.
    2008-04-10 22:27:00作者回复
    本篇文章并不是完整的例子,你需要结合另外几篇。控制面板,你还需要注意导出函数。
    #jiess 发表于2008-04-11 11:22:27  IP: 116.30.111.*
    例程弹出的对话框窗体一闪就没了.
    2008-04-12 14:45:29作者回复
    进入到消息循环代码了么?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains