`
zhangziyueup
  • 浏览: 1168261 次
文章分类
社区版块
存档分类
最新评论

Windows CE开发常见问题解答

 
阅读更多

1.怎样在一个控件获得焦点时打开软键盘?

比如一个EditBox获得焦点后,这个时候自动打开软键盘,这样可以方便用户输入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO里面有些参数弄不明白

//隐藏输入面板
BOOL LowerSip()
{
BOOL fRes = FALSE;
SIPINFO si;
memset( &si, 0, sizeof( si ) );
si.cbSize = sizeof( si );
if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) )
{
si.fdwFlags &= ~SIPF_ON;
fRes = SHSipInfo( SPI_SETSIPINFO, 0, &si, 0 );
}
return fRes;
}

//升起输入面板
BOOL RaiseSip( void )
{
BOOL fRes = FALSE;
SIPINFO si;
memset( &si, 0, sizeof( si ) );
si.cbSize = sizeof( si );
if( SHSipInfo( SPI_GETSIPINFO, 0, &si, 0 ) )
{
si.fdwFlags |= SIPF_ON;
fRes = SHSipInfo( SPI_SETSIPINFO, 0, &si, 0 );
}
return fRes;
}
再试试下面这些:
//SHSipPreference(m_hWnd, SIP_UP);//弹出输入面板
//SHSipPreference(m_hWnd, SIP_DOWN);//隐藏输入面板(有一个时延)
//SHSipPreference(m_hWnd, SIP_FORCEDOWN );//隐藏输入面板(立即)
//SHSipPreference(m_hWnd, SIP_UNCHANGED );
//一般只用在调用SIP_DOWN时的的后面,使这个命令无效

--------------------------------------------------------------------------------

2.WinCE下字符串-数字转化的问题!

在VC6.0下,把#include <stdlib.h>、#include <stdio.h>两个文件包括进去后,下面这段代码一点问题没有,
CString str1,str2;
str1="123";
str2="123.4";
int i;
float j;
i=atoi(str1);
j=atof(str2);
但是在EVC3.0里面,却出现了问题:提示atof没有定义,atoi也不能正常转化。

用wcstoi,wcstof, wcstol和wcstod

--------------------------------------------------------------------------------

3. 我新拿了一个Pocket Pc,编了几个程序,但发现对话框都只能全屏显示,这是为什么?

一般在Pocket PC中所有的对话框都是全屏显示,这是操作系统规定的行为。但如使用系统自定义的信息提示框,则不是全屏显示。如: Afxmessagebox所激发的提示框就是如此。
可以重载WM_INITDIALOG消息
MSDN:
The DialogBox macro uses the CreateWindowEx function to create the dialog box. DialogBox then sends a WM_INITDIALOG message to the dialog box procedure. The function displays the dialog box (regardless of whether the template specifies the WS_VISIBLE style), disables the owner window, and starts its own message loop to retrieve and dispatch messages for the dialog box.

就是说当对话框窗口创建完以后,会发出一个WM_INITDIALOG 消息,你只要在自己的窗口消息处理函数里对这个消息进行处理,就可以了
比如:

case WM_INITDIALOG:
// Create a Done button and size it.
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
InitOptionDlg(hDlg);
return TRUE;

主要就是修改shidi.dwFlags ,看看ABOUT的窗口消息处理吧
补充: SHINITDLGINFO shidi;
SHINITDLGINFO shidi;
上面说的是在纯API的程序中的方法
对于MFC创建的DIALOG程序,可以这样:

BOOL CXXXDlg::OnInitDialog()
{

SHINITDLGINFO shidi;
HWND hDlg = m_hWnd;
// Create a Done button and size it.
shidi.dwMask = SHIDIM_FLAGS;
shidi.dwFlags = SHIDIF_SIPDOWN ;
shidi.hDlg = hDlg;
SHInitDialog(&shidi);
//InitOptionDlg(hDlg);
//CDialog::OnInitDialog();
……

}

--------------------------------------------------------------------------------

4.在eVC基于MFC的程序中如何将ToolBar栏隐藏

关于ToolBar的隐藏:
首先,如果你是用MFC向导创建的工程,则默认会生成ToolBar,我要说的是,干掉它!自己来创建。:)
First,声明CToolBar成员变量:
CToolBar * d_pToolbar2;
然后……
static UINT BASED_CODE Toolbar2Buttons[] =
{
// 下面是工具栏对应菜单的ID,工具栏图标是我弄的一个Bitmap,其ID为IDR_ADD_TOOLBAR
ID_FILE_NEW,
ID_FILE_OPEN,
ID_FILE_SAVE,
ID_SEPARATOR,
ID_EDIT_CUT,
ID_EDIT_COPY,
ID_EDIT_PASTE,
ID_SEPARATOR,
ID_TRANS_DICT,
ID_TOOLBAR_SHOW, //这是新加入的菜单项,点击隐藏工具栏,再点击就显示工具栏
};
然后……
在CMainFrame的OnCreate()中加入:
OnToolbarCreate();
然后……
void CMainFrame::OnToolbarCreate()
{
// Should only get here if we don't have a toolbar.
ASSERT(d_pToolbar2 == 0);
// Create C++ object and WinAPI window.
d_pToolbar2 = new CToolBar();
d_pToolbar2->Create(this, WS_CHILD | CBRS_BOTTOM |
CBRS_SIZE_FIXED | CBRS_FLOATING,
0x9100);
// Get bitmap and connect to tool items.
d_pToolbar2->LoadBitmap(IDR_ADD_TOOLBAR);
d_pToolbar2->SetButtons(Toolbar2Buttons,
sizeof(Toolbar2Buttons)/sizeof(UINT));
// Make toolbar dockable.
d_pToolbar2->EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(d_pToolbar2);
}
然后……
void CMainFrame::OnToolbarShow()
{
ASSERT(d_pToolbar2 != 0);

// Query current visibility.
BOOL bVisible = (d_pToolbar2->GetStyle() & WS_VISIBLE);

// Show or hide.
int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;
d_pToolbar2->ShowWindow(nShow);

// Reconfigure remaining toolbar items.
RecalcLayout();

// Store visibility state for later.
d_bToolbarVisible = (!bVisible);
}

void CMainFrame::OnUpdateToolbarShow(CCmdUI* pCmdUI)
{
//This function is signed for checking the menu 'Edit|Show Toolbar'
pCmdUI->Enable(d_pToolbar2 != 0);
int nCheck = (d_bToolbarVisible) ? 1 : 0;
pCmdUI->SetCheck(nCheck);
}

OK,默认情况下ToolBar是隐藏的,点击菜单中的新加入的隐藏/显示工具栏命令即可来回切换了。

--------------------------------------------------------------------------------

5.如何制作pocket Pc 下的安装程序?

在C:/Windows CE Tools/wce300/MS Pocket PC/support/ActiveSync/windows ce application installation 下面有例子.
也有其它第三方的安装工具,比如installshield。

--------------------------------------------------------------------------------

6.怎样在主界面中显示一幅图片

我做了一个小程序, 想在主界面中显示一幅图片,我的图片是.JPG格式的,如果需要转换,用什么工具?

把JPG图转为BMP图咯,网上有不少这样的程序。
然后用LoadBitmap、SelectObject、StretchBlt等语句把BMP图显示到VIEW中。


--------------------------------------------------------------------------------

7. 请问,在WinCE下如何截获所有鼠标和键盘的消息?

wince下只能用三种钩子
#define WH_JOURNALRECORD 0
#define WH_JOURNALPLAYBACK 1
#define WH_KEYBOARD_LL 20

--------------------------------------------------------------------------------

8.在Pocket PC下用eVC作的对话框能否做成不是全屏的?

在MFC中

m_bFullScreen = FALSE;


--------------------------------------------------------------------------------

9.如何将char 类型的中文字符串转换成Unicode的字符串?

MultiByteToWideChar,在仿真器中无效;你也可以通过其他方法;用wcsprintf这个函数


--------------------------------------------------------------------------------

10. evc单文档界面中,菜单左边总有一个"new",如何将其去掉?

在MainFrm的OnCreate内找到这个:
m_wndCommandBar.m_bShowSharedNewButton = TRUE;
把TRUE改为FALSE

--------------------------------------------------------------------------------

11.Edit出现上下文菜单问题?

近来我看了一下SDK带的Sample中的Npp,其中它有一个功能就是在EDIT上出现上下文菜单,可是当我仿照它在自己的项目中添加此功能时,即在资源中添加CONTROL "",IDC_STATIC,"SIPPREF",NOT WS_VISIBLE,-10,-10、,6,6,在模拟器中正常,但在PDA中不能显示包含Edit的对话框。而Npp可以在两者正常显示。我又在Npp中增加一个对话框,也相应的改变资源,结果是在模拟器和PDA中都能正常显示。

调用SHInitExtraControls()应该在构造函数,不应在OnInitDialog中。如果在OnInitDialog中调用,包含EDIT的对话框将不显示。
事实上在XXXApp::InitInstance函数中调用更好,这样只需调用一次,就万事大吉。

--------------------------------------------------------------------------------

12. 如何将.mdb数据库转换为.cdb数据库

如何将.mdb数据库转换为.cdb数据库,在没有实际PDA,只有Pocket PC Emuliation和EVB的情况下。
Pocket PC Emuliation运行时为何提示“存储器不足,无法完成操作”?

此问题微软已经给出了答案。
在SDK文档中有一个叫做device的例子程序,它就是将tdb文件转化成cdb文件的,而还有一个desktop的程序,它是将mdb文件转化成tdb文件的。


--------------------------------------------------------------------------------

13.请问如何用EVC建立和调用DLL

我按照帮助中用MFC开发DLL的例子做,但是另外一个程序调用的时候的时候却出现连接错误,说找不到那个函数。后来看了EVC的例子spintest之后也是这样。

和在WINDOWS下的一样
是不是LINK2001 ERROR?
你如果是隐式调用(就是不用LOADLIBRARY()的),要把你的DLL的LIB文件在PROJECT-->SETTINGS--->LINK--->INPUT里指明。

--------------------------------------------------------------------------------

14.编辑框如何自动会换行 ?

请教,Plam中的table控件,在Wince上怎么做?
就是编辑框自动会换行.当你输入的内容超过一行,自动切换到下一行,下面的内容自动往下滚。

勾选编辑控件的MultiLine,如果想输入回车换行,再勾选want renturn

--------------------------------------------------------------------------------

15.是否在adoce,pocket access中的update语句不能执行?

ADOCE不能直接执行UPDATE语句,但ADOCE有Update方法,你可用它实现。


--------------------------------------------------------------------------------

16.请问如何在Windows CE中实现BC++中的inport(...)与outportb(...)函数功能?

CE下,可以用WINDOWS API函数来对端口操作。 比较简单。
API一般只要用到CreateFile(打开端口,串口操作和文件操作只有一点不同就是打开方式不同,所以第三个参数要用 OPEN_EXISTING )
COMMTIMEOUTS、DCB两个结构是存放设置参数的,可以改
WriteFile、WriteFile(读写端口)
因为串口通讯用的是异步通讯,所以下面两句比较重要
SetCommMask(指定监视的端口事件)
WaitCommEvent(等待端口事件)

--------------------------------------------------------------------------------

17. 如何显示一个对话框让用户选择一个目录而不是文件

没有标准的函数处理这个,你只好自己实现活使用第三方的解决方案。


--------------------------------------------------------------------------------

18.有没有办法(API)激活或禁止电源保存模式?

参看SystemIdleTimerReset()的安装文档。创建一个包含象睡眠的无限循环的线程,然后调用SystemIdleTimerReset()。也许有一种中断线程的办法就是程序退出。


--------------------------------------------------------------------------------

19. Windows CE的文件名最小程度是多少?

在windef.h定义了MAX_PATH,普遍应该是260个字符。

20.我使用CFileDialog创建了一个浏览按钮,默认目录始终是显示"All Folders"和在"/My Device/My do***ents"下。怎样改变初始目录到"/My Device"。使用fileDlg.m_ofn.lpstrInitialDir = TEXT("file://My/ Device");,但是没有改变默认显示的目录。
lpstrInitialDir指向一个指定初始文件目录的字符串。如果为NULL,将使用系统的根目录。尽量尝试一下lpstrInitialDir为NULL。


--------------------------------------------------------------------------------

21.在Pocket PC任务栏上可能有X和OK按钮吗?

不可能,至少没有象WisBar的第三方工具。


--------------------------------------------------------------------------------

22.如何禁止用户改变日期和时间?有可能实现吗?

你可能用自己的程序替代/windows/clock.exe,但是,它们可以通过另外的程序处理这个。同样,在同步时ActiveSync改变设备的时间与PC匹配。


--------------------------------------------------------------------------------

23. 我有一个xscal cpu的ipaq 3970设备,但是在eMbedded Visual C++ 3.0上没有目标类型。我应该在EVC3.0上使用什么类型。这个问题也发生在安装程序Cabwiz.exe上。

你可以使用ARM类型。XScal基于ARM体系。


--------------------------------------------------------------------------------

24. 如何使程序在后台运行?

最小化程序将使程序进入后台,因此只要在程序启动时最小化,那么它将运行在后台。

补充:还可以做成service。
--------------------------------------------------------------------------------

25. 我准备去掉SIP按钮。我在OnInitDialog事件中使用SHFullScreen。然而SIP按钮仍然可见,忘记做什么了吗?

代码如下:

// SHFullScreen fails if dialog box is not foreground.
SetForegroundWindow();
// Go to the full screen mode
SHFullScreen(m_hWnd, SHFS_HIDESIPBUTTON | SHFS_HIDESTARTICON);


不能在OnInitDialog中使用SHFullScreen,因为对话框还没有可见。你应该传递一个自定义消息,在那个消息调用这个函数。

也许下面这段代码会有用:

void PFCSipButtonShow( BOOL bShow )
{
HWND hWnd = ::FindWindow( _T( "MS_SIPBUTTON" ), NULL );
if (hWnd == NULL)
return;

if (bShow)
::ShowWindow( hWnd, SW_SHOW );
else
::ShowWindow( hWnd, SW_HIDE );

} // PFCSipButtonShow


--------------------------------------------------------------------------------

26.如何在Pocket PC2002模拟器上安装Pocket PC程序?

PPC2002模拟器没有模拟ARM处理器,因此你必须有x86 CPU的二进制文件和相应的安装程序。只需使用文件浏览器复制cab文件到模拟器,然后执行它。商业程序的安装包通常不包含x86的二进制程序。如果你没有x86处理器的程序发布版本,你不能做这个安装。如果程序是你自己的,你可以创建一个x86的版本,之后创建一个安装CAB。


--------------------------------------------------------------------------------

27. 如何在eVC程序中读取普通的图标文件?

在PC程序中使用ExtractIconEx(),但是在Pocket 设备好象不工作。缺少了什么?PC图标文件在Pocket PC环境是非法的?或者需要转换格式?

不幸的是,在Pocket PC上没有API去读取图标。因此,你不得不手工解析图标文件。

--------------------------------------------------------------------------------

28.如何绘制一个透明的圆呢?

我想使用eVC++和GDI在Pocket PC 2002上绘制一个圆。我使用它绘制了直线,它处理的很好:

hbrOld =(HBRUSH) SelectObject(hDC, CreatePatternBrush(RGB(0,255,0)));
hpnOld =(HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 2, RGB(255,0,0)));
Ellipse( hDC, 10, 10, 20, 20);
DeleteObject( SelectObject (hDC, hbrOld) );
DeleteObject( SelectObject (hDC, hpnOld) );

但是如何绘制一个透明的圆呢?有PS_NULL这样画笔类型吗?

可以使用GetStockObject()得到一个NULL_BRUSH或HOLLOW_BRUSH(这两个是相同的)。然后用SelectObject选择它,就象你已经做的那样。

--------------------------------------------------------------------------------

29. 假定我知道程序的名称,关闭运行着的eVC的程序使用什么API?

如果你知道程序的名称,并且假定与主窗口的名称相同,那么你可以使用FindWindow得到那个窗口的句柄,然后传送WM_CLOSE消息到那个窗口。

HWND hwnd = FindWindow(NULL, _T("APPLICATION NAME"));
if ( hwnd)
PostMessage(hwnd, WM_DESTROY, 0, 0);


--------------------------------------------------------------------------------

30. 如何从PC设置PDA的时间?

最简单的办法是写一个自定义的RAPI函数,通过CeRapi调用设备的SetSystemTime.


--------------------------------------------------------------------------------

31. 怎样使用WriteBinary,我不明白第二个参数(LPBYTE):

BOOL CVORegistry::WriteBinary(LPCTSTR pcszKey, LPBYTE pData, DWORD cbData)

第二个参数是指向包含你想写到注册表的二进制数据的缓冲。

BYTE data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef };
extern CVORegistry reg;
reg.WriteData(_T("BinaryData"), data, sizeof(data));

--------------------------------------------------------------------------------

32. Windows CE支持钩子API吗?这样我们可以监视需要的时间。如果支持,用法也象Windows 2000那样吗?

坏消息:CE不支持钩子。
系统不支持,我们还是可以想其他办法的……Stick out tongue

--------------------------------------------------------------------------------

33. 我不能使用Pocket PC上CDialog的TitleBar,我能用静态文本框控件替代,使之与TitleBar相似。有办法显示TitleBar吗?

大多数Pocket PC上的对话框是全屏的,没有自己的主题栏,而是使用系统任务栏。你可以创建一个非全屏对话框(象消息框那样)。


--------------------------------------------------------------------------------

34. 如何在程序中关闭(suspend)Pocekt PC?

方法1:虚拟关机键
::keybd_event(VK_OFF, 0, 0, 0);
::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);

方法2:调用未公开函数PowerOffSystem()
extern "C" __declspec(dllimport) void PowerOffSystem();


--------------------------------------------------------------------------------

35. 如何在程序中重启(soft reset)Pocket PC?

#include
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
BOOL ResetPocketPC()
{
return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}


--------------------------------------------------------------------------------

36.如何在程序中硬启动(hardware reset)Pocekt PC?

注意:使用此段代码会将您的Pocket PC的用户数据全部清空。

#include
#define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
extern "C" __declspec(dllimport)void SetCleanRebootFlag(void);
extern "C" __declspec(dllimport) BOOL KernelIoControl(
DWORD dwIoControlCode,
LPVOID lpInBuf,
DWORD nInBufSize,
LPVOID lpOutBuf,
DWORD nOutBufSize,
LPDWORD lpBytesReturned);
BOOL HardResetPocketPC()
{
SetCleanRebootFlag();
return KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL);
}


--------------------------------------------------------------------------------

37. 以下方法信息不全,无法使用:

1.系统不认识VK_OFF
2.使用哪个dll 和 lib文件?


· 如何在程序中关闭(suspend)Pocekt PC?

方法1:虚拟关机键
::keybd_event(VK_OFF, 0, 0, 0);
::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);

方法2:调用未公开函数PowerOffSystem()
extern /"C/" __declspec(dllimport) void PowerOffSystem();

关闭(suspend)
方法1:
//虚拟关机键
::keybd_event(VK_OFF, 0, 0, 0);
::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0);

方法2:
//调用未公开函数PowerOffSystem()
extern "C" __declspec(dllimport) void PowerOffSystem();


分享到:
评论

相关推荐

    Windows CE开发指南

    Windows CE开发指南、英文版 Windows CE .NET Hands-On Lab

    WINDOWS CE实用开发技术.zip.001

    《WINDOWS+CE实用开发技术》完整版电子书pdf版 该书主要涉及WinCE下的驱动开发技术 压缩文件分三部分 需下载完全才能解压: WINDOWS CE实用开发技术.zip.001 WINDOWS CE实用开发技术.zip.002 WINDOWS CE实用开发技术...

    基于Windows CE系统嵌入式开发教程

    第2章 ARM基础开发 第3章 开发工具EVC的使用 第4章 Windows CE窗口和消息机制 ...第12章 Windows CE底层开发 第13章 Windows CE下的驱动开发 第13章 Windows CE下的驱动开发 第15章 Windows CE下的调试连接

    windows ce 开发教程

    windows ce 学习者的必备书,详细介绍了windows ce 的整个开发流程,尽请关注

    Windows CE常见问题解答精华

    Windows CE常见问题解答精华

    Windows CE开发初步

    许多开发人员都尝试了基于无线装置的软件编程,然而这些思想达于成功的关键之处在于他们能否深 ...本文就此介绍了Windows CE 的一些基本特性,并指出过渡到基于无线装置的软件开发所应具备的知识。

    Windows CE开发入门

    基于windows的嵌入式系统讲解,包括一些主要得开发步骤与注意事项

    Windows CE 开发初步(第一部)

    Windows CE 开发初步(第一部) Windows CE 开发初步(第一部).

    WINDOWS CE实用开发技术pdf.part2.rar

    WINDOWS CE实用开发技术pdf.part2.rar 共五卷 很好的书关于wince ce5.0的

    基于C#的Windows CE程序开发实例教程

    本书以C#语言、Visual 2003为开发环境,深入介绍了Windows CE应用程序开发的实用技术。本书分为基础篇和应用篇两部分。基础篇主要介绍了Windows CE概述、C#程序设计基础、XML基础、SQL CE数据库。应用篇主要通过4个...

    WindowsCE实用开发技术

     《WindowsCE实用开发技术(第2版)》集作者多年来从事WindowsCE技术开发和认证培训方面的经验,系统总结和概括了WindowsCE的基础理论和特点,对WindowsCE开发过程中所涉及到的操作系统定制开发、Bootloader开发、OAL...

    嵌入式Windows CE 5.0驱动程序开发

    windows ce 开发相关论文\嵌入式Windows CE 5.0驱动程序开发及测试.pdf

    使用visual studio开发windows ce程序

    zWindows CE 开发工具介绍 z使用Visual Studio开发Native CE应用程序 z使用Visual Studio开发.NET CE应用程序 z使用Visual Studio开发CE应用程序安装包 z将开发好的应用程序整合到CE映像中

    Windows+CE开发指南

    Windows+CE开发指南

    Windows CE的开发工具包

    本文为你概略地介绍了面向Windows CE的WIN32 API,其目的是为了突出这种被广泛应用的并且十分重要的API的一般的特点和优点。有许多其它的细节你需要在第一次使用Windows CE嵌入式产品之前来学习掌握;做为投石问路的...

    Windows CE高级开发指南

    windows ce开发的相关技术,包括api,evc,evb开发数据库开发等!

    Windows CE设备驱动程序开发指南

    《Windows CE设备驱动程序开发指南》,描述了CE驱动程序的开发

Global site tag (gtag.js) - Google Analytics