嵌入开发(WinCE)的一些经验(1)

来源:本站
导读:目前正在解读《嵌入开发(WinCE)的一些经验(1)》的相关信息,《嵌入开发(WinCE)的一些经验(1)》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《嵌入开发(WinCE)的一些经验(1)》的详细说明。
简介:嵌入开发(WinCE)的一些经验

WindowsCE下Unicode和Ansi字符间互相转换的例子

纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode 转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了Unicode和Ansi字符间的互转.下面就是网络通讯中的程序片断.

m_psocket是指向一个从CCeSocket派生的类,如果没有连接的话其为NULL;

m_snd是要发送的CString,和一个EDIT相对应.

//发送函数片断

void CClient1Dlg::OnButtonSend()

{

// TODO: Add your control notification handler code here

if (!m_psocket) //无Socket连接,退出

{

MessageBox(TEXT("无连接!"),TEXT("信息"));

return;

}

UpdateData(TRUE); //保存输入的字符串到m_snd

unsigned char buf[129]; //发送缓冲区

ZeroMemory(buf,sizeof(buf)); //缓冲区清零

CString tmpstr(m_snd); //复制要发送的字符串

int multibytelen=WideCharToMultiByte( //计算从Unicode转换到Ansi后需要的字节数

CP_ACP, //根据ANSI code page转换

WC_COMPOSITECHECK | WC_DEFAULTCHAR, //转换出错用缺省字符代替

tmpstr.GetBuffer(m_snd.GetLength()), //要转换的字符串地址

m_snd.GetLength(), //要转换的个数

//转换后字符串放置的地址

//最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节

//缺省的字符:""

//缺省的设置

);

WideCharToMultiByte( //转换Unicode到Ansi

CP_ACP,

WC_COMPOSITECHECK | WC_DEFAULTCHAR,

tmpstr.GetBuffer(m_snd.GetLength()),

m_snd.GetLength(),

(char *)buf, //转换到缓冲区中

128, //最多128个字节

);

int sendcount=m_psocket->Send(buf,multibytelen+1); //发送转换后的缓冲区

CString statusstr;

statusstr.Format(TEXT("共发送字节数:%d"),sendcount);

m_status.SetWindowText(statusstr); //更新显示栏

}

程序接收到的字符串最后保存到CString tmpstr中.

//接收函数片断

void MyCeSocket::OnReceive(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

unsigned char p[129]; //接受缓冲区

ZeroMemory(p,sizeof(p)); //接收缓冲区清零

this->Receive(p,128); //接收128个字节

int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数

CP_ACP,

MB_COMPOSITE,

(char*)p, //要转换的Ansi字符串

-1, //自动计算长度

);

CString tmpstr;

tmpstr.GetBuffer(widecharlen); //为转换后保存Unicode字符串分配内存

MultiByteToWideChar( //从Ansi转换到Unicode字符

CP_ACP,

MB_COMPOSITE,

(char*)p,

-1,

tmpstr.GetBuffer(widecharlen), //转换到tmpstr

widecharlen //最多转换widecharlen个Unicode字符

);

m_clientdlg->m_listbox.InsertString(0,tmpstr); //插入到listbox中显示

CCeSocket::OnReceive(nErrorCode);

}

注意:以上代码都是在WindowsCE样板机上运行,PC端发送和接收到的字符均为Ansi格式的.把以上代码稍微修改一下用到自己的产品中,就可以利用以前的协议无缝连接PDA和PC.

以上代码在MicroSoft Embed Visual C++ 3.0 + 联想天玑5100(WindowsCE3.0)

+ Eagle Tec 10M CF卡通过.

用eVC编制了一个ActiveX控件,提示需要registered to the desktop,

用vs提供的ActiveX control test container 进行注册,可怎么也注册不上

为什么?应该怎么注册呢?

可以用VC的ActiveX control test container 进行注册,只不过要进行稍微改动。

1.用VC产生一个与EVC相同名字的Active x工程,比如为pocket。

2.把VC工程中的dsp和dsw文件重命名,pocket-win32.dsw和pocket-win32.dsp拷到EVC工程的文件夹中。

3.修改pocket-win32.dsw文件,使他指向pocket-win32.dsp。

Project: "Pocket"=".Pocket.dsp"

改为Project: "Pocket"=".Pocket_Win32.dsp"

4.修改output 文件的名称,使它指向evc工程的文件夹。

即可

我需要用一种特定的图案填充进度条的条的颜色,不知道能不能实现?

CProgressCtrl mCtrl;

在OnInitDialog()中:

mCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, CRect(10,10,200,30),

this, IDC_PROGRESS);

mCtrl.SetRange(0,10);

mCtrl.SetPos(0);

mCtrl.SetStep(1);

在OnPaint()中:

{

CPaintDC dc(this);

CRect rect(10,10,200,30);

CBitmap bmp;

bmp.LoadBitmap(IDB_PROGRESS);

CBrush brush(&bmp);

dc.FillRect(rect,&brush);

}

在OnStep()中(按一下按钮进度条前进一步)

{

mCtrl.StepIt();

}

(EVC3)启动PPC2002模拟器,在EVC的TOOLS菜单下选择“Remote File Viewer”,启动Windows CE Remote File Viewer。

使Remote File Viewer与PPC2002模拟器连接,选择工具栏上第一个按钮。弹出Select Windows CE Device对话框,选择对应的模拟器或硬件设备---PPC2002后确定。在Remote File Viewer中就可以看到PPC2002中的文件。

在Remote File Viewer中选择菜单FILE下的“Export File”,将想要的文件传输到模拟器的相应的目录中。

提醒:《嵌入开发(WinCE)的一些经验(1)》最后刷新时间 2024-03-14 01:07:14,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《嵌入开发(WinCE)的一些经验(1)》该内容的真实性请自行鉴别。