您的位置:知识库 » .NET技术

Windows Mobile开发总结

作者: peterzb  来源: 博客园  发布时间: 2009-08-10 22:19  阅读: 7987 次  推荐: 0   原文链接   [收藏]  
摘要:结合自己4,5月份开发手机视频监控系统经历, 来对那段时间的Windows Mobile开发进行总结一下
[1] Windows Mobile开发总结
[2] Windows Mobile开发总结
[3] Windows Mobile开发总结
[4] Windows Mobile开发总结

UI等具体实现

07. 全屏窗体实现

在实现全屏窗体时候经常会碰到如何隐藏mobile默认最下方的bar条, 输入法又突然冒出来; 实际上要实现全屏, 一般情况下采用SHFullScreen + MoveWindow +

WM_SETTINGCHANGE, 如果你要考虑一些更加多的细节, 下面这个帖子有可能对你有帮助, 关于Mobile的全屏实现的一点心得. 值得一提的是在网上同时看到1篇

文章, 可以说是讲述相反问题, 八股文的”实现真正的非全屏窗口和自定义消息对话框”很不错.

08. 如何去掉窗体上的关闭按钮?

SHDoneButton(hWnd,SHDB_HIDE);
SetWindowLong(hWnd,GWL_STYLE,WS_NONAVDONEBUTTON );

同时进行一下基础知识扫盲, PPC上窗体的关闭与最小化, 图来自黎波老师的博客文章. 在默认情况下,我们新建的窗体运行时屏幕右上角显示一个×按钮,

按照我们使用 Windows 的习惯,应该是用来关闭窗体。其实不是,它只是最小化窗体,并没有关闭。如果这个窗体是一个应用程序的主窗体,那么该程序并

没有退出,而是隐藏了。可以通过重新运行该程序的 exe 文件来恢复显示程序的运行界面或者到运行程序列表中进行激活显示。

09. 关于SIP开关后对话框的显示问题

也就是怎样实现软键盘打开, 对话框自动适应? 我们在开发过程中也会碰到, 如果对窗体中控件位置计算不正确, 会出现当输入法打开时把窗体上的编辑框给档住了,怎样实现输入法打开对话框自动上移? 可以响应WM_SETTINGCHANGE消息,通过SHSipInfo函数去得到输入法面板参数和桌面可视区域参数,然后配置你的对话框。

SIPINFO si  =  {0};  
si.cbSize   =  sizeof(si);
SHSipInfo(SPI_GETSIPINFO, 0, &si, 0);
BOOL bShow = si.fdwFlags&SIPF_ON;  // 如果bShow为TRUE,则软键盘显示,否则隐藏;使用si.rcSipRect和si.rcVisibleDesktop来实现你的需求。

10. WM手机默认中文编码是什么?

默认编码是Unicode, 所有的WM手机都是UNICODE的,  且SP平台和PPC都一样! 很多跟我一样刚接触WM开发的人都会碰到一个问题, 为什么同样的代码在VC6开发

的应用程序中没有问题, 但把相关代码复制到Windows Mobile上运行就出现如此多的编译错误, 如error C2664: 'CWnd::MessageBoxW' : cannot convert

parameter 1 from 'char [100]' to 'LPCTSTR'. 都是没有考虑到这一点(编码问题), 需要使用提供的字符串相关的API与函数加以处理. 字符串处理函数可以看这篇

文章WinCE下非常有用的字符串操作函数.

下面简单介绍Unicode C-Runtime 转换函数

mbstowcs( 
wchar_t 
*wcstr, // Output string.
const char *mbstr, // Input string.
size_t count ); // Character count
wcstombs( 
char *mbstr,         // Output string.
const wchar_t *wcstr, // Input string.
size_t count );        // Character count

MultiByteToWideChar与WideCharToMultiByte

// 演示API使用, UTF-8转换Unicode汉字代码(Copy修改即可)
 char  str[256= {(char)0xE4,(char)0xBD,(char)0xA0,(char)0xE5,(char)0xA5  ,(char)0xBD,(char)0x61,(char)0x62,(char)0x63,(char)0}//一段UTF-8编码  
 WCHAR*  strA;  
 
int  i = MultiByteToWideChar(CP_UTF8, 0, (char*)str, -1, NULL, 0);  
 strA 
= new WCHAR[i];  
 MultiByteToWideChar(CP_UTF8, 
0, (char  *)str, -1, strA, i);  
 i 
= WideCharToMultiByte(CP_ACP, 0, strA, -1, NULL, 0, NULL, NULL);  
 
char *strB=new char[i];  
 WideCharToMultiByte(CP_ACP, 
0, strA, -1, strB, i, NULL, NULL);  
 
//strB即为所求  
 
//AfxMessageBox(strB);
 delete []strA;  
 delete []strB; 

 

11. 在Windows Mobile下使用XML

XML当前被大量使用于应用程序配置, 存储少量数据以及Web Services等应用; 甚至到通信报文内容也以xml格式来传递, 方便服务端数据在不同手机与开发平台上

解析. 因为不管是C++, C#, 还是Java语言都有提供相关API来解析XML格式内容.

在WM开发中, 可以使用微软提供的COM接口或者第三方开源XML解析库如TinyXML, 相关内容请自行浏览在Windows Mobile下使用MSXML, TinyXml 介绍,

Windows Mobile下tinyXML的开发等博文.

12. 如何建立拨号链接进行网络通信

在WM中需先进行拨号链接操作, 链接成功建立后才可以进行后续的Socket通信等; 感觉这方面微软处理没有Symbian下那么友好, Nokia手机会在你的应用首次使用

网络时, 弹出窗口提醒你该操作可能产生GPRS流量费用, 询问你采用何种上网方式接入, 是cmnet还是cmwap. 因为讲述GPRS这方面文章很多, 可以直接看我整理的

Windows Mobile 开发系列文章收藏 - GPRS/上网设置.

13. 界面美化 - 贴图

   用户对手机软件的界面是很在意的,做的好看了他会觉得有技术含量,做的好用了他会更加喜欢我们的产品。所以一套好的UI是必不可少的。手机软件开发的大部分

工程是在做UI系统。一套好的自主的手机软件UI系统是产品核心竞争力的一部分。在Windows Mobile的界面开发,使用C + SDK做漂亮的界面不容易,一旦在界面上控

件比较多,控件的布局更是头痛。横竖屏切换的时候也得考虑,不同手机屏幕尺寸可能也不一样; 不同的字体下, 界面差异也非常大……

   其实要做出好的界面最后还是要回归RECT,也就是自己绘制贴图。 如果要做的很漂亮,那还是自己封装一套界面控件,这样控制起来方便。横竖屏问题,你绘制的

时候不应该写死的位置坐标,应该取相对坐标。在横竖屏切换的时候会触发WM_SIZE等一些消息,里面改变相对坐标的横竖屏大小就OK啦.

   拿配置信息设置窗口来说, 主要需处理WM_PAINT, WM_MOUSEMOVE, WM_LBUTTONDOWN等一系列窗口消息.

相关参考代码

 

 最终实现效果大致如图下:

窗体界面贴图处理

14. 用户登录过程例子

我是新开一个线程来处理, 可以灵活加入如超时控制等, 通过自定义处理消息来通知主窗体当前进度情况.这个你先定义这个消息如#define USER_LOGIN_MESSAGE

WM_USER + 300, 需要触发的时候SendMessage/PostMessage给指定窗口, 如PostMessage(g_hWnd, USER_LOGIN_MESSAGE, LOADCONFIG, 0); 然后

在对应的窗体消息处理里面处理, SendMessage和PostMessage后两个参数就对应WndProc的后两个参数,可用于传值。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case USER_LOGIN_MESSAGE:
         break;
    }
    return 0;
}

用户登录大致代码

其效果大致如下图所示, 其中涉及菜单等操作可以看Windows Mobile入门中菜单部分. 

用户登录窗体

15. 计算当前传输速率

在视频监控程序里面我们一般会在画面上同时显示当前传输速率为多少kbps, 我在这里采用通过2个变量来保存到上一秒收到的字节数以及到这一秒收到的数据量,

通过对这2数相减, 大致计算出这一秒传输了多大的数据量. 定义一个每隔1s触发的定时器, 然后在窗体中处理WM_TIMER消息. 为了能够上STATIC上字体显示成白色, 需在窗体中处理WM_CTLCOLORSTATIC消息

case WM_CTLCOLORSTATIC:
      SetBkMode((HDC)wParam, TRANSPARENT);
      SetTextColor((HDC)wParam, RGB(
255255255));
      
return (LRESULT) GetStockObject(BLACK_BRUSH);

 

16. 如何制作.CAB安装包

C#怎么安装 cab呢?一般情况下通过vs 2005新建安装部署工程,里面就有打包cab来生成可部署到手机上的安装包. 另外有一个WinCE CAB Manager工具可以帮忙.

17. 模拟器 vs 真机

要弄清楚一点, 不管当前模拟器真实度有多么高, 但其毕竟不是真机; 如果条件可以的话, 尽早把程序部署到手机上跑跑看, 会发现一些在模拟器上没有注意到的问题, 如

网络情况, 稳定性, 传输速率. 当然还有其它一系列差异, 手机性能(CPU, 内存使用).

更多WM应用开发的常见问题, 可以看文章WM应用开发的常见问题解答, Windows Mobile 开发常见问题集2, Windows Mobile 开发系列文章收藏 - 开篇,

Windows Mobile开发文章收藏.

0
0
标签:Mobile

.NET技术热门文章

    .NET技术最新文章

      最新新闻

        热门新闻