WinCE6.0开发总结

最近半个多月一直在WinCE6.0系统上面做开发,开发的是一个扫描二维码并打印小票的程序。虽然以前有MFC开发的经验,但是WinCE6.0和Windows系统的差异,对工作造成了一定影响。现对这本个多月的工作进行一下总结。

一、环境搭建

主要参考http://blog.csdn.net/htttw/article/details/7323201。由于当时我机器上已经安装了VS2008,想当然的认为和VS2005应该差不多,结果事实是不行。建议微软的东西在它自己的下载中心http://www.microsoft.com/zh-cn/download/default.aspx下载。

参照以上网址,没什么问题的话,应该可以在模拟器上进行开发了。如果手头有真机,可以使用Microsoft ActiveSync通过USB数据线进行连接,需要在Windows系统上安装驱动ActiveSync_USB_Host_Driver才能连接。

二、MFC的差异

1、WinCE下对话框是不响应WM_SHOWWINDOW事件的。

解决办法:使用PostMessage,让对话框响应自定义事件

①在某处#define WM_MY_EVENT  WM_USER + 1

②在要发起事件的地方::PostMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_TERMINAL_CHANGED, 0, 0);

③在要接收事件的对话框定义LRESULT OnMyEvent(WPARAM wParam, LPARAM lParam);

④定义OnMyEvent方法,方法内是要执行的动作

⑤在BEGIN_MESSAGE_MAP中关联WM_MY_EVENT与OnMyEvent,ON_MESSAGE(WM_MY_EVENT, OnMyEvent)

2、按钮与背景融合

这纯是界面的问题,困扰我一两天。

解决办法:放置好按钮的位置,然后添加一个Picture Control,其内放置铺满对话框的背景图片,在按钮处截下按钮大小的背景图片并保存,按钮关联一个CBitmapButton的变量m_button,OnInitDialog方法里

m_button.LoadBitmaps(IDB_BITMAP_按钮图);

m_button.SubclassDlgItem(IDC_BUTTON_按钮ID, this);

m_button.SizeToContent();

大功告成

3、画控件和背景的背景色

解决办法:对话框响应WM_CTLCOLOR事件,定义一个画刷CBrush m_brush;

OnInitDialog方法里

m_brush.CreateSolidBrush(RGB(192, 232, 255));

OnCtlColor方法里

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

switch (nCtlColor)
{
case CTLCOLOR_MSGBOX:
break;
case CTLCOLOR_EDIT:
break;
case CTLCOLOR_LISTBOX:
break;
case CTLCOLOR_BTN:
//pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkColor(RGB(0, 255, 255));
return m_brush;
case CTLCOLOR_SCOLLBAR:
break;
case CTLCOLOR_STATIC:
//pDC->SetTextColor(RGB(255, 255, 255));
pDC->SetBkMode(TRANSPARENT);
return m_brush;
case CTLCOLOR_MAX:
break;
default:
return m_brush;
}

return hbr;

4、字符集的问题

WinCE中只支持Unicode字符集,如果接受的字符不是Unicode字符集,要进行转换

TCHAR * pwstr = NULL;
int wstrlen;

// CP_UTF8 CP_ACP
wstrlen = ::MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pbBuf,dwBufLen,NULL,0);
pwstr = new TCHAR[wstrlen+4];
memset(pwstr,0,(wstrlen+4) * sizeof(TCHAR));
::MultiByteToWideChar(CP_UTF8,0,(LPCSTR)pbBuf,dwBufLen,pwstr,wstrlen);

5、编写代码时,点击按钮后,VS2005无法自动添加代码,无法跳转到相应代码位置

解决办法:关闭VS2005,删除sln文件所在目录中的ncb文件,启动VS2005,重新编译即可

6、与服务端连接交互请求

解决办法:参考http://wenku.baidu.com/view/0271ac8ba0116c175f0e48b4.html。

注意:// 此处必须使用无缓存的标志
DWORD dwHttpRequestFlags = INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_DONT_CACHE;
CHttpFile* pFile = pConnection->OpenRequest(
CHttpConnection::HTTP_VERB_GET,
url, NULL, 1, NULL, NULL,
dwHttpRequestFlags);

CHttpConnection调用OpenRequest时,必须指定INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_DONT_CACHE,否则连接会一直存在,下次连接仍使用上次连接句柄。INTERNET_FLAG_EXISTING_CONNECT指定如果已存在连接,使用已存在的连接; INTERNET_FLAG_DONT_CACHE指定不使用缓存。

7、WinCE下加解密操作

解决办法:如果不嫌麻烦,可以在WinCE下重新编译Openssl源码;可以在http://download.csdn.net/detail/code_farmer/636660下载dll库直接使用

注意:之前的MD5我使用的是微软的CryptoAPI,不知道是自己使用方法不当还是它本身的问题,中间可能有内存泄露;使用Openssl的MD5就可以,而且非常简单的一个函数就搞定,不像CryptoAPI那么麻烦,只不过要涉及字符集转化的问题,见4


暂时就想到这么多,以后想到其他的再添加


你可能感兴趣的:(WinCE)