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

[复制链接]
2739|0
 楼主| tedyu 发表于 2009-3-27 12:53 | 显示全部楼层 |阅读模式
wince, ST, TE, ic, ck
Unicode和Ansi字符间互相转换的例子<br /><br /><br />纵所周知,WindowsCE下编程99%的问题都和Unicode有关.比如文件编辑,一般都保存为Ansi格式;无线通讯中控制Modem需要发送的AT指令,必须是Ansi格式;网络通讯中,PC端一般都是Ansi的,为了和PC上协议兼容,在WindowsCE中必须把要发送的一个指令从Unicode&nbsp;转换成Ansi格式...等等.很多初学者对于这些问题总是感到很麻烦.其实WindowsCE中有标准的API实现了Unicode和Ansi字符间的互转.下面就是网络通讯中的程序片断.<br />m_psocket是指向一个从CCeSocket派生的类,如果没有连接的话其为NULL;<br />m_snd是要发送的CString,和一个EDIT相对应.<br />//发送函数片断<br />void&nbsp;CClient1Dlg::OnButtonSend()<br />{<br />//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;control&nbsp;notification&nbsp;handler&nbsp;code&nbsp;here<br />if&nbsp;(!m_psocket)&nbsp;//无Socket连接,退出<br />{<br />MessageBox(TEXT(&quot;无连接!&quot;),TEXT(&quot;信息&quot;));<br />return;<br />}<br />UpdateData(TRUE);&nbsp;//保存输入的字符串到m_snd<br />unsigned&nbsp;char&nbsp;buf[129];&nbsp;//发送缓冲区<br />ZeroMemory(buf,sizeof(buf));&nbsp;//缓冲区清零<br />CString&nbsp;tmpstr(m_snd);&nbsp;//复制要发送的字符串<br />int&nbsp;multibytelen=WideCharToMultiByte(&nbsp;//计算从Unicode转换到Ansi后需要的字节数<br />CP_ACP,&nbsp;//根据ANSI&nbsp;code&nbsp;page转换<br />WC_COMPOSITECHECK&nbsp;|&nbsp;WC_DEFAULTCHAR,&nbsp;//转换出错用缺省字符代替<br />tmpstr.GetBuffer(m_snd.GetLength()),&nbsp;//要转换的字符串地址<br />m_snd.GetLength(),&nbsp;//要转换的个数<br />0,&nbsp;//转换后字符串放置的地址<br />0,&nbsp;//最多转换字符的个数,为0表示返回转换Unicode后需要多少个字节<br />0,&nbsp;//缺省的字符:&quot;&quot;<br />0&nbsp;//缺省的设置<br />);<br />WideCharToMultiByte(&nbsp;//转换Unicode到Ansi<br />CP_ACP,<br />WC_COMPOSITECHECK&nbsp;|&nbsp;WC_DEFAULTCHAR,<br />tmpstr.GetBuffer(m_snd.GetLength()),<br />m_snd.GetLength(),<br />(char&nbsp;*)buf,&nbsp;//转换到缓冲区中<br />128,&nbsp;//最多128个字节<br />0,<br />0<br />);<br />int&nbsp;sendcount=m_psocket-&gtSend(buf,multibytelen+1);&nbsp;//发送转换后的缓冲区<br />CString&nbsp;statusstr;<br />statusstr.Format(TEXT(&quot;共发送字节数:%d&quot;),sendcount);<br />m_status.SetWindowText(statusstr);&nbsp;//更新显示栏<br />}<br />程序接收到的字符串最后保存到CString&nbsp;tmpstr中.<br />//接收函数片断<br />void&nbsp;MyCeSocket::OnReceive(int&nbsp;nErrorCode)<br />{<br />//&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;specialized&nbsp;code&nbsp;here&nbsp;and/or&nbsp;call&nbsp;the&nbsp;base&nbsp;class<br />unsigned&nbsp;char&nbsp;p[129];&nbsp;//接受缓冲区<br />ZeroMemory(p,sizeof(p));&nbsp;//接收缓冲区清零<br />this-&gtReceive(p,128);&nbsp;//接收128个字节<br />int&nbsp;widecharlen=MultiByteToWideChar(&nbsp;//计算从Ansi转换到Unicode后需要的字节数<br />CP_ACP,<br />MB_COMPOSITE,<br />(char*)p,&nbsp;//要转换的Ansi字符串<br />-1,&nbsp;//自动计算长度<br />0,<br />0<br />);<br />CString&nbsp;tmpstr;<br />tmpstr.GetBuffer(widecharlen);&nbsp;//为转换后保存Unicode字符串分配内存<br />MultiByteToWideChar(&nbsp;//从Ansi转换到Unicode字符<br />CP_ACP,<br />MB_COMPOSITE,<br />(char*)p,<br />-1,<br />tmpstr.GetBuffer(widecharlen),&nbsp;//转换到tmpstr<br />widecharlen&nbsp;//最多转换widecharlen个Unicode字符<br />);<br />m_clientdlg-&gtm_listbox.InsertString(0,tmpstr);&nbsp;//插入到listbox中显示<br />CCeSocket::OnReceive(nErrorCode);<br />}<br />注意:以上代码都是在WindowsCE样板机上运行,PC端发送和接收到的字符均为Ansi格式的.把以上代码稍微修改一下用到自己的产品中,就可以利用以前的协议无缝连接PDA和PC.<br />以上代码在MicroSoft&nbsp;Embed&nbsp;Visual&nbsp;C++&nbsp;3.0&nbsp;+&nbsp;联想天玑5100(WindowsCE3.0)<br />+&nbsp;Eagle&nbsp;Tec&nbsp;10M&nbsp;CF卡通过.<br /><br /><br /><br />用eVC编制了一个ActiveX控件,提示需要registered&nbsp;to&nbsp;the&nbsp;desktop,<br />用vs提供的ActiveX&nbsp;control&nbsp;test&nbsp;container&nbsp;进行注册,可怎么也注册不上<br />为什么?应该怎么注册呢?<br />可以用VC的ActiveX&nbsp;control&nbsp;test&nbsp;container&nbsp;进行注册,只不过要进行稍微改动。<br />1.用VC产生一个与EVC相同名字的Active&nbsp;x工程,比如为pocket。<br />2.把VC工程中的dsp和dsw文件重命名,pocket-win32.dsw和pocket-win32.dsp拷到EVC工程的文件夹中。<br />3.修改pocket-win32.dsw文件,使他指向pocket-win32.dsp。<br />Project:&nbsp;&quot;Pocket&quot;=&quot;.Pocket.dsp&quot;<br />改为Project:&nbsp;&quot;Pocket&quot;=&quot;.Pocket_Win32.dsp&quot;<br />4.修改output&nbsp;文件的名称,使它指向evc工程的文件夹。<br />即可<br /><br /><br />我需要用一种特定的图案填充进度条的条的颜色,不知道能不能实现?<br />CProgressCtrl&nbsp;mCtrl;<br />在OnInitDialog()中:<br />mCtrl.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,&nbsp;CRect(10,10,200,30),<br />this,&nbsp;IDC_PROGRESS);<br />mCtrl.SetRange(0,10);<br />mCtrl.SetPos(0);<br />mCtrl.SetStep(1);<br />在OnPaint()中:<br />{<br />CPaintDC&nbsp;dc(this);<br />CRect&nbsp;rect(10,10,200,30);<br />CBitmap&nbsp;bmp;<br />bmp.LoadBitmap(IDB_PROGRESS);<br />CBrush&nbsp;brush(&bmp);<br />dc.FillRect(rect,&brush);<br />}<br />在OnStep()中(按一下按钮进度条前进一步)<br />{<br />mCtrl.StepIt();<br />}<br /><br />[NextPage]<br />(EVC3)启动PPC2002模拟器,在EVC的TOOLS菜单下选择“Remote&nbsp;File&nbsp;Viewer”,启动Windows&nbsp;CE&nbsp;Remote&nbsp;File&nbsp;Viewer。<br />使Remote&nbsp;File&nbsp;Viewer与PPC2002模拟器连接,选择工具栏上第一个按钮。弹出Select&nbsp;Windows&nbsp;CE&nbsp;Device对话框,选择对应的模拟器或硬件设备---PPC2002后确定。在Remote&nbsp;File&nbsp;Viewer中就可以看到PPC2002中的文件。<br />在Remote&nbsp;File&nbsp;Viewer中选择菜单FILE下的“Export&nbsp;File”,将想要的文件传输到模拟器的相应的目录中。<br /><br />“添加/删除硬件向导”----------“添加/排除设备故障”----------“选择一个硬件设备”中选择“Microsoft&nbsp;Loopback&nbsp;Adapter”.<br /><br /><br />隐藏“开始”栏<br />HWND&nbsp;lpClassName;<br />lpClassName&nbsp;=&nbsp;::FindWindow(TEXT(&quot;HHTaskBar&quot;),&nbsp;NULL);<br />::ShowWindow(lpClassName,&nbsp;SW_HIDE);<br /><br />只隐藏Taskbar还不行,你得把work&nbsp;area&nbsp;设为整个屏幕:<br />int&nbsp;screenx=GetSystemMetrics(SM_CXSCREEN);<br />int&nbsp;screeny=GetSystemMetrics(SM_CYSCREEN);<br />CRect&nbsp;rcWorkArea;<br />rcWorkArea.left&nbsp;=&nbsp;0;<br />rcWorkArea.right&nbsp;=&nbsp;screenx;<br />rcWorkArea.top&nbsp;=&nbsp;0;<br />rcWorkArea.bottom&nbsp;=&nbsp;screeny;<br />::SystemParametersInfo(&nbsp;SPI_SETWORKAREA,&nbsp;0,&nbsp;&rcWorkArea,&nbsp;SPIF_SENDCHANGE&nbsp;);<br /><br /><br /><br /><br />如何获取&nbsp;Pocket&nbsp;PC&nbsp;2002&nbsp;装置的序列号(以下例程获取的装置的序列号通常是Flash&nbsp;ROM的ID号.)?<br />--------------------------------------------------------------------------------<br />从&nbsp;Pocket&nbsp;PC&nbsp;2000&nbsp;开始,&nbsp;微软就建议OEM厂商提供一个叫&nbsp;KernelIoControl&nbsp;的函数,&nbsp;以便用户能访问Pocket&nbsp;PC&nbsp;2002装置内建的序列号;&nbsp;遗憾的是,&nbsp;几乎没有厂商提供这个支持.<br />从&nbsp;Pocket&nbsp;PC&nbsp;2002&nbsp;开始,&nbsp;微软开始强制OEM厂商提供此函数.&nbsp;目前市面上所有经过biplip测试的Pocket&nbsp;PC&nbsp;2002装置都支持这个函数调用.<br />以下是个调用例子:<br /><br />#include<br />extern&nbsp;&quot;C&quot;&nbsp;__declspec(dllimport)<br />BOOL&nbsp;KernelIoControl(<br />DWORD&nbsp;dwIoControlCode,&nbsp;LPVOID&nbsp;lpInBuf,&nbsp;DWORD&nbsp;nInBufSize,<br />LPVOID&nbsp;lpOutBuf,&nbsp;DWORD&nbsp;nOutBufSize,&nbsp;LPDWORD&nbsp;lpBytesReturned<br />);<br /><br />#define&nbsp;IOCTL_HAL_GET_DEVICEID&nbsp;CTL_CODE(FILE_DEVICE_HAL,&nbsp;21,&nbsp;METHOD_BUFFERED,&nbsp;FILE_ANY_ACCESS)<br /><br />CString&nbsp;GetSerialNumberFromKernelIoControl()<br />{<br />DWORD&nbsp;dwOutBytes;<br />const&nbsp;int&nbsp;nBuffSize&nbsp;=&nbsp;256;<br />byte&nbsp;arrOutBuff[nBuffSize];<br /><br />BOOL&nbsp;bRes&nbsp;=&nbsp;::KernelIoControl(IOCTL_HAL_GET_DEVICEID,<br />0,&nbsp;0,&nbsp;arrOutBuff,&nbsp;nBuffSize,&nbsp;&dwOutBytes);<br /><br />if&nbsp;(bRes)&nbsp;{<br />CString&nbsp;strDeviceInfo;<br />for&nbsp;(unsigned&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;CString&nbsp;strNextChar;<br />strNextChar.Format(TEXT(&quot;%02X&quot;),&nbsp;arrOutBuff);<br />strDeviceInfo&nbsp;+=&nbsp;strNextChar;<br />}<br />CString&nbsp;strDeviceId&nbsp;=<br />strDeviceInfo.Mid(40,2)&nbsp;+<br />strDeviceInfo.Mid(45,9)&nbsp;+<br />strDeviceInfo.Mid(70,6);<br /><br />return&nbsp;strDeviceId;<br />}&nbsp;else&nbsp;{<br />return&nbsp;_T(&quot;&quot;);<br />}<br />}<br />=====================================================================================<br /><br />我用以下代码成功禁止任务栏被点击,但不知怎样才能解除,特此请教,谢谢。<br />LONG&nbsp;lOldWindowStyle;<br />RECT&nbsp;rectOldTaskBarRect;<br /><br />HWND&nbsp;hOldhTaskBar&nbsp;=&nbsp;::FindWindow(_T(&quot;HHTaskBar&quot;),NULL);<br /><br />while(&nbsp;hOldhTaskBar&nbsp;==&nbsp;NULL&nbsp;)<br />{<br />hOldhTaskBar&nbsp;=&nbsp;::FindWindow(_T(&quot;HHTaskBar&quot;),NULL);<br />Sleep(&nbsp;1000&nbsp;);<br />}<br /><br />::GetWindowRect(&nbsp;hOldhTaskBar,&nbsp;&rectOldTaskBarRect&nbsp;);<br />::SetWindowPos(&nbsp;hOldhTaskBar,&nbsp;HWND_BOTTOM,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);<br />lOldWindowStyle&nbsp;=&nbsp;GetWindowLong(hOldhTaskBar,&nbsp;GWL_STYLE);<br />::SetWindowLong(&nbsp;hOldhTaskBar,&nbsp;GWL_STYLE,&nbsp;lOldWindowStyle|WS_DISABLED&nbsp;);<br /><br /><br />比如控制打开一个jpg文件。<br />我用的是ShellExecute,好像有点问题:<br />ExecuteFile(LPCTSTR&nbsp;filename)<br />{<br />SHELLEXECUTEINFO&nbsp;info;<br />info.cbSize=sizeof(SHELLEXECUTEINFO);<br />info.fMask=SEE_MASK_NOCLOSEPROCESS;<br />info.hwnd=this-&gtGetSafeHwnd();<br />info.lpVerb=L&quot;open&quot;;<br />info.lpFile=filename;<br />info.lpParameters=NULL;<br />info.lpDirectory=NULL;<br />info.nShow=SW_SHOW;<br />return&nbsp;ShellExecuteEx(&info);<br />}<br />这会用IE来打开jpg<br />每次总是第一次的时候对,以后调用的时候总是自动调原来的东西,没有更新。还有其他更好用的api吗?<br />[NextPage]<br />Microsoft&reg;&nbsp;eMbedded&nbsp;Visual&nbsp;C++&nbsp;4.0<br />http://download.microsoft.com/download/WindowsCENETPlatformBuilder/Install/4.0/NT5XP/EN-US/eVC4.exe<br /><br />eMbedded&nbsp;Visual&nbsp;C++&nbsp;4.0&nbsp;SP1&nbsp;ENU<br />http://download.microsoft.com/download/WinCENET41PlatBuilder/SP/4.0/NT5XP/EN-US/eVC4SP1.exe<br /><br />eMbedded&nbsp;Visual&nbsp;Tools&nbsp;3.0<br />http://download.microsoft.com/download/9/d/2/9d2f6ee8-4c75-4749-86df-2dd5189e6081/evt2002web_min.exe<br /><br />OK&quot;&nbsp;按钮隐掉<br />SHDoneButton(AfxGetMainWnd()-&gtm_hWnd,SHDB_HIDE);<br />&quot;X&quot;&nbsp;按钮隐掉<br />ModifyStyle(AfxGetMainWnd()-&gtm_hWnd,WS_CAPTION,WS_MINIMIZEBOX,SWP_NOSIZE);<br /><br /><br />ftp://ftp.wy.hziee.edu.cn/winsoft<br /><br />单步调试是完全可以的。<br />首先安装微软的同步软件在PC机上;其次在PC机上运行该同步软件的同时,在小机上运行Windows
epllog.exe文件;如果同步成功,在PC机上会出现一个盘符(Mobile&nbsp;device)。在其中可以看到小机的文件。这样同步即完成。<br />在选择了该目标机后,在开始调试前会出现同步提示框。同步成功后即可单步调试;我是通过这样的方法来调试CE系统的,单步不成问题!<br /><br />如果您是在硬件上运行您的程序,除了SDK外还需要装同步软件,一般是Microsoft&nbsp;ActiveSync。可以在微软的网站上下载到。<br /><br />全球第一款中文Windows手机,dopod具有强大的功能:配备Intel&nbsp;SA-1110&nbsp;CPU,主频为206MHz,运算能力相当于PII。内存采用32兆/64兆SDRAM,32兆/64兆闪存。配备SD卡接口,可以用SD卡实现存储扩容。显示屏规格为3.5&quot;&nbsp;240x320&nbsp;pixels,&nbsp;4096彩色反射式TFT。内置GSM/GPRS模块,分别支持900/1800&nbsp;MHz的GSM和GPRS无线通信功能。在基本应用程序方面,dopod686类似其他采用Pocket&nbsp;PC操作系统的高端掌上电脑,具有Pocket&nbsp;Word、Pocket&nbsp;Excel、Pocket&nbsp;TV以及Windows&nbsp;Media&nbsp;Player等功能。支持中文连笔手写识别,并可以做到中英文混合识别。通过Microsoft&nbsp;ActiveSync可以与PC同步进行数据传输。也可以通过红外接口与笔记本、其他掌上设备以及手机进行数据交换。通过类似Outlook式的联系人功能管理移动电话、电子邮件、短信等通信功能,可以方便地进行短信群发等操作。传统PDA的各种功能在dopod中仅仅能算是最为基本的功能,其最大亮点在于其强大的多媒体功能,可以非常流畅地播放音频和视频文件。<br /><br />1.好像没有其它方法,为什么不用__FILE__&nbsp;中取?<br />2.fopen,您可以加上全路径。<br />3.wince2.11没有用过,但我想是支持的。在CE帮助中,一般均说明此函数从那个版本开始支持,但fopen中却没有。<br />4.下面是CE帮助中的一段:<br />CWinApp::WriteProfileString<br />This&nbsp;method&nbsp;writes&nbsp;the&nbsp;specified&nbsp;string&nbsp;into&nbsp;the&nbsp;specified&nbsp;section&nbsp;of&nbsp;the&nbsp;.ini&nbsp;file&nbsp;in&nbsp;the&nbsp;application.<br /><br />BOOL&nbsp;WriteProfileString(<br />LPCTSTR&nbsp;lpszSection,<br />LPCTSTR&nbsp;lpszEntry,<br />LPCTSTR&nbsp;lpszValue&nbsp;);<br />5.不知您所用的CE版本为多少。CE3.0不支持中文,如果您所用的是3.0,那一定是OEM商汉化了CE。可能只支持一种字体;最新版.Net支持中文,有多种字体供选择。<br /><br />PC与掌上电脑的串口是不是一样,这很难说。因为嵌入式开发是针对不同硬件平台进行的!<br />有的掌上电脑用的是标准的RS232,有的不是。<br />您用EVT(EVC和EVB)写的串口操作程序,可以下载到开发板上进行测试。当然开发板上需有串口硬件。<br /><br /><br /><br /><br /><br /><br />Palm&nbsp;OS&nbsp;ROM<br />http://www.echoice.com.cn/download/download.asp?softwareID=132<br /><br />Release&nbsp;configurations&nbsp;use&nbsp;the&nbsp;following&nbsp;macros:<br />RETAILMSG(cond,&nbsp;printf_exp).&nbsp;Conditionally&nbsp;displays&nbsp;the&nbsp;print&nbsp;message.<br />RETAILLED(cond,&nbsp;parms).&nbsp;Conditionally&nbsp;outputs&nbsp;WORD&nbsp;values&nbsp;to&nbsp;the&nbsp;LED.<br />ERRORMSG(cond,&nbsp;printf_exp).&nbsp;Prints&nbsp;&quot;Error:&nbsp;File&nbsp;Line&quot;&nbsp;before&nbsp;the&nbsp;print&nbsp;message.<br /><br />To&nbsp;enable&nbsp;the&nbsp;debug&nbsp;macros,&nbsp;you&nbsp;must&nbsp;build&nbsp;a&nbsp;debug&nbsp;configuration.&nbsp;Debug&nbsp;configurations&nbsp;use&nbsp;the&nbsp;three&nbsp;retail&nbsp;macros&nbsp;listed&nbsp;above,&nbsp;as&nbsp;well&nbsp;as&nbsp;the&nbsp;following&nbsp;debug&nbsp;macros:<br />DEBUGMSG(cond,&nbsp;printf_exp).&nbsp;Conditionally&nbsp;displays&nbsp;the&nbsp;print&nbsp;message.<br />DEBUGLED(cond,&nbsp;parms).&nbsp;Conditionally&nbsp;outputs&nbsp;WORD&nbsp;values&nbsp;to&nbsp;the&nbsp;LED.<br />DEBUGCHK(expr).&nbsp;Asserts&nbsp;the&nbsp;expression.&nbsp;If&nbsp;expr&nbsp;is&nbsp;FALSE,&nbsp;the&nbsp;macro&nbsp;calls&nbsp;DEBUGBREAK.<br />DEBUGZONE(zone_id).&nbsp;Tests&nbsp;the&nbsp;mask&nbsp;bit&nbsp;in&nbsp;the&nbsp;current&nbsp;debug&nbsp;zone&nbsp;settings.&nbsp;You&nbsp;can&nbsp;use&nbsp;DEBUGZONE&nbsp;to&nbsp;turn&nbsp;debug&nbsp;zones&nbsp;on&nbsp;or&nbsp;off.<br /><br />Declare&nbsp;Function&nbsp;TranslateMessage&nbsp;Lib&nbsp;&quot;coredll.dll&quot;&nbsp;(ByVal&nbsp;MSG&nbsp;As&nbsp;String)&nbsp;As&nbsp;Boolean<br />网上down到的,有关unicode的函数集:<br /><br />Attribute&nbsp;VB_Name&nbsp;=&nbsp;&quot;modUniCode&quot;<br />Option&nbsp;Explicit<br />Public&nbsp;Function&nbsp;MemStringToLong(StringIn&nbsp;As&nbsp;String)&nbsp;As&nbsp;Long<br />On&nbsp;Error&nbsp;Resume&nbsp;Next<br />Dim&nbsp;hWorkVal&nbsp;As&nbsp;String<br />&quot;&nbsp;Convert&nbsp;the&nbsp;String&nbsp;back&nbsp;to&nbsp;Long&nbsp;Integer.<br />&quot;&nbsp;Converting&nbsp;back&nbsp;to&nbsp;Big&nbsp;Endian&nbsp;format.<br />Dim&nbsp;i&nbsp;As&nbsp;Long<br />For&nbsp;i&nbsp;=&nbsp;4&nbsp;To&nbsp;1&nbsp;Step&nbsp;-1<br />hWorkVal&nbsp;=&nbsp;hWorkVal&nbsp;&&nbsp;Hex(AscB(MidB(StringIn,&nbsp;i,&nbsp;1)))<br />Next&nbsp;i<br />&quot;&nbsp;Return&nbsp;Long&nbsp;Integer&nbsp;value.<br />MemStringToLong&nbsp;=&nbsp;CLng(&quot;&H&quot;&nbsp;&&nbsp;hWorkVal)<br />End&nbsp;Function<br />Public&nbsp;Function&nbsp;LongToMemoryString(ByVal&nbsp;lInputValue&nbsp;As&nbsp;Long)&nbsp;As&nbsp;String<br />Dim&nbsp;hWorkVal&nbsp;As&nbsp;String<br />Dim&nbsp;n&nbsp;As&nbsp;Long<br />Dim&nbsp;i&nbsp;As&nbsp;Long<br />&quot;&nbsp;Convert&nbsp;to&nbsp;HEX&nbsp;value.<br />hWorkVal&nbsp;=&nbsp;Hex(lInputValue)<br />&quot;&nbsp;Check&nbsp;to&nbsp;see&nbsp;if&nbsp;it&nbsp;is&nbsp;not&nbsp;zero.<br />If&nbsp;hWorkVal&nbsp;&lt&gt&nbsp;&quot;0&quot;&nbsp;Then<br />&quot;&nbsp;Convert&nbsp;to&nbsp;memory&nbsp;storage&nbsp;format&nbsp;(Little&nbsp;Endian).<br />&quot;&nbsp;For&nbsp;example,&nbsp;0000A411&nbsp;would&nbsp;convert&nbsp;to&nbsp;11A40000.<br />&quot;<br />&quot;&nbsp;Place&nbsp;leading&nbsp;zeros&nbsp;in&nbsp;8&nbsp;character&nbsp;sequence&nbsp;to<br />&quot;&nbsp;maintain&nbsp;consistent&nbsp;character&nbsp;count<br />n&nbsp;=&nbsp;Len(hWorkVal)<br />If&nbsp;n&nbsp;&lt&nbsp;8&nbsp;Then<br />hWorkVal&nbsp;=&nbsp;String(8&nbsp;-&nbsp;n,&nbsp;&quot;0&quot;)&nbsp;&&nbsp;hWorkVal<br />End&nbsp;If<br />&quot;<br />&quot;&nbsp;Use&nbsp;ChrB&nbsp;to&nbsp;rebuild&nbsp;Bytes.<br />For&nbsp;i&nbsp;=&nbsp;7&nbsp;To&nbsp;1&nbsp;Step&nbsp;-2<br />LongToMemoryString&nbsp;=&nbsp;LongToMemoryString&nbsp;&&nbsp;_<br />ChrB(CInt(&quot;&H&quot;&nbsp;&&nbsp;Mid(hWorkVal,&nbsp;i,&nbsp;2)))<br />Next&nbsp;i<br /><br />Else<br />&quot;&nbsp;Just&nbsp;return&nbsp;zeros.<br />&quot;&nbsp;Use&nbsp;ChrB&nbsp;to&nbsp;build&nbsp;Bytes.<br />LongToMemoryString&nbsp;=&nbsp;ChrB(CInt(&quot;&H00&quot;))<br />LongToMemoryString&nbsp;=&nbsp;LongToMemoryString&nbsp;&&nbsp;ChrB(CInt(&quot;&H00&quot;))<br />LongToMemoryString&nbsp;=&nbsp;LongToMemoryString&nbsp;&&nbsp;ChrB(CInt(&quot;&H00&quot;))<br />LongToMemoryString&nbsp;=&nbsp;LongToMemoryString&nbsp;&&nbsp;ChrB(CInt(&quot;&H00&quot;))<br />End&nbsp;If<br />End&nbsp;Function<br /><br /><br />在EVC3.0下怎样使编出来的窗口最大化(占满所有屏幕),并能够将开始菜单条挡住?<br />BOOL&nbsp;SHFullScreen(<br />HWND&nbsp;hwndRequester,<br />DWORD&nbsp;dwState);<br />注意包含Aygshell.h<br />用shfullscreen产生全屏窗口,用showwindow隐藏任务条,用movewindow设置窗口大小为全屏。<br />代码如下:<br />#define&nbsp;MENU_HEIGHT&nbsp;26<br />RECT&nbsp;rc;<br />//get&nbsp;window&nbsp;size<br />GetWindowRect(hWnd,&nbsp;&rc);<br />SHFullScreen(hWnd,&nbsp;SHFS_HIDETASKBAR&nbsp;|&nbsp;SHFS_HIDESIPBUTTON);<br />ShowWindow(hwndCB,&nbsp;SW_HIDE);<br />MoveWindow(hWnd,<br />rc.left,<br />rc.top-MENU_HEIGHT,<br />rc.right,<br />rc.bottom+MENU_HEIGHT,<br />TRUE);<br /><br /><br />Windows&nbsp;CE&nbsp;3.0&nbsp;supports&nbsp;the&nbsp;standard&nbsp;Winsock&nbsp;1.1&nbsp;functions.except&nbsp;the&nbsp;asychronous&nbsp;functions.<br /><br />eVC4:<br />http://msdn.microsoft.com/library/default.asp?url=http://www.icembed.com/nhp/Default.asp?contentid=28000437<br />Tools(For&nbsp;PPC2002):<br />http://www.microsoft.com/mobile/developer/downloads/default.asp<br />OR:&nbsp;http://www.microsoft.com/mobile/developer/default.asp<br />CEF:<br />http://msdn.microsoft.com/downloads/default.asp?url=http://www.icembed.com/downloads/sample.asp?url=http://www.icembed.com/msdn-files/027/001/926/msdncompositedoc.xml<br /><br />目前大的GIS厂商,如MapInfo和ArcInfo对Paml支持太弱了,我咨询了这两家公司,都说还没有这方面的产品,WinCE下的产品倒是到了应用层次。<br />国外不少公司有开发出来的产品,比如www.GeoDiscovery.com,但是不提供二次开发接口。不知道大虾们是如何选择这方面的产品的。<br />电子地图:ArcInfo和MapInfo有全系列的开发包。绝对支持VS。<br />你打电话向ArcInfo中国代理,好像是富融科技,要一个开发包,当然是试用性质的。或者向MapInfo公司中国代理,是方正,咨询一下开发事宜。<br />我没有做过WinCE上的GPS和GIS开发。我做过PalmOS下的一些实验。GPS部分是通过串口和Palm连接,并且提供相应的协议,用来解释GPS&nbsp;信息和操纵GPS设备。这个没有什么复杂的。但是地图表现部分却苦于没有合适的地图产品。关于GPS的例子,我是从Palm应用程序的开发工具&nbsp;CodeWarrior的帮助文档中获得的,也就是简单的串口/端口操作,简单的监听-&gt读-&gt分析-&gt表现-&gt控制命令-&nbsp;&gt写.和DOS下串口通信或者控制打印机之类的事情,没有两样。你所需要的,是你所选用的GPS设备的接口标准、开发文档。<br />你看看www.supermap.com.cn的eSuperMap,能提供二次开发,具体没谈过,有什么消息也告诉我一声,我也想用他们的搞二次开发。<br />不过eSuperMap同时支持WinCE和Windows&nbsp;98等。<br />帮你找到了一个地图,你可以到www.lingtu.com.cn看看,它也支持二次开发。<br /><br />这样说吧:在EVC编译程序时,有一个重要的选项,在工具栏中的WCE&nbsp;Configuration中。您用EVC自带的模拟器编译时,选择的是Win32&nbsp;[WCE&nbsp;x86em]&nbsp;Debug/Release。若选择其它,编译时丢出错。<br />X86em,说明程序运行时的Micro&nbsp;CPU平台。正如UP所说!如果您所有的PDA不在EVC支持的范围之内,则您需要CEPB来生成支持它的SDK。安装后EVC才可以用来开发针对您所用的PDA的应用。<br />你把EVC的Target类型设为MIPS,然后直接debug,EVC会把XXXd.dll下载到PDA上,这样你就可以在PDA上debug了。不过这些dll挺大的,有好几M,在PDA上debug速度也很慢<br /><br />http://www.eg3.com/<br />http://www.c51bbs.com/<br />www.pday.com.cn<br />www.move.com.cn<br />www.pdazone.com.cn<br />www.palmheart.com.cn<br />http://www.embed.com.cn/<br />http://msdn.microsoft.com/library/default.asp?url=http://www.icembed.com/library/en-us/dnce30/html/realtimecapabilities.asp<br />http://msdn.microsoft.com/downloads/default.asp?url=http://www.icembed.com/downloads/topic.asp?url=http://www.icembed.com/msdn-files/028/000/219/topic.xml<br />http://www.palm.com<br /><br />&lt&nbsp;&gt,北京大学出版社出版<br />&lt&gt,电子工业出版社出版。可做为手册用!<br />&lt&gt。最经典的。但国内可能买不到<br /><br />2002-4-21(在嵌入式和Visual&nbsp;C++中提出下面的问题)<br />我做了一个应用,读出系统时间显示在6个Edit控件中;同时设置两个按键用于在得到系统时间和设置系统时间之间切换,得到系统时间时不能修改Edit中的内容。<br />读系统时间由一个线程来实现。<br /><br />在设置系统时间时,想使用tab键在各个控件之间移动。但我为每个控件都设置了WS_TABSTOP属性后,仍然不能达到使用tab键控制焦点位置的目的!!!<br />请问:各个高手这是为何?<br /><br />下一个:::PostMessage(hWnd,&nbsp;WM_NEXTDLGCTL,&nbsp;0,&nbsp;0);<br />前一个:::PostMessage(hWnd,&nbsp;WM_NEXTDLGCTL,&nbsp;1,&nbsp;0);<br />任意control&nbsp;hCtrl:::PostMessage(hWnd,&nbsp;WM_NEXTDLGCTL,&nbsp;(WPARAM)hCtrl,&nbsp;1L);<br />[NextPage]<br />模拟器中是否能使程序自起动?希望高手支招!!!<br />我认为不能。<br />在硬件平台上,可修改注册表。<br />例如:<br />[HKEY_LOCAL_MACHNEInit]<br />&quot;Launch40&quot;=&quot;App.exe&quot;<br />&quot;Depend40&quot;=hex:14,00<br /><br />我们也用过汉王,是需要自己修改较多的东东才能过到满意的效果。<br />以下四点是我们修改Hwr.c的注释,我只能提供您这些!!!<br />1.汉王对笔迹数据的要求是在0xff以内,但触摸屏的尺寸(480X320)超过了此范围,所以要对数据进行调整,以满足任何尺寸的要求。<br />2.防跨屏操作<br />3.全屏操作<br />4.触屏四线不接任何电容<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部