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下,把#i nclude
一般在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(); ……
}
关于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是隐藏的,点击菜单中的新加入的隐藏/显示工具栏命令即可来回切换了。
在C:\Windows CE Tools\wce300\MS Pocket PC\support\ActiveSync\windows ce application installation 下面有例子. 也有其它第三方的安装工具,比如installshield。
把JPG图转为BMP图咯,网上有不少这样的程序。然后用LoadBitmap、SelectObject、StretchBlt等语句把BMP图显示到VIEW中。 -
wince下只能用三种钩子 #define WH_JOURNALRECORD 0 #define WH_JOURNALPLAYBACK 1 #define WH_KEYBOARD_LL 20 -
在MFC中 m_bFullScreen = FALSE; -
MultiByteToWideChar,在仿真器中无效;你也可以通过其他方法;用wcsprintf这个函数
在MainFrm的OnCreate内找到这个: m_wndCommandBar.m_bShowSharedNewButton = TRUE; 把TRUE改为FALSE
近来我看了一下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函数中调用更好,这样只需调用一次,就万事大吉。
如何将.mdb数据库转换为.cdb数据库,在没有实际PDA,只有Pocket PC Emuliation和EVB的情况下。 Pocket PC Emuliation运行时为何提示“存储器不足,无法完成操作”?此问题微软已经给出了答案。在SDK文档中有一个叫做device的例子程序,它就是将tdb文件转化成cdb文件的,而还有一个desktop的程序,它是将mdb文件转化成tdb文件的。
我按照帮助中用MFC开发DLL的例子做,但是另外一个程序调用的时候的时候却出现连接错误,说找不到那个函数。后来看了EVC的例子spintest之后也是这样。和在WINDOWS下的一样是不是LINK2001 ERROR?你如果是隐式调用(就是不用LOADLIBRARY()的),要把你的DLL的LIB文件在PROJECT-->SETTINGS--->LINK--->INPUT里指明。 ---
请教,Plam中的table控件,在Wince上怎么做? 就是编辑框自动会换行.当你输入的内容超过一行,自动切换到下一行,下面的内容自动往下滚。勾选编辑控件的MultiLine,如果想输入回车换行,再勾选want renturn
ADOCE不能直接执行UPDATE语句,但ADOCE有Update方法,你可用它实现。
CE下,可以用WINDOWS API函数来对端口操作。 比较简单。 API一般只要用到CreateFile(打开端口,串口操作和文件操作只有一点不同就是打开方式不同,所以第三个参数要用 OPEN_EXISTING ) COMMTIMEOUTS、DCB两个结构是存放设置参数的,可以改 WriteFile、WriteFile(读写端口)因为串口通讯用的是异步通讯,所以下面两句比较重要 SetCommMask(指定监视的端口事件) WaitCommEvent(等待端口事件)
没有标准的函数处理这个,你只好自己实现活使用第三方的解决方案。
参看SystemIdleTimerReset()的安装文档。创建一个包含象睡眠的无限循环的线程,然后调用SystemIdleTimerReset()。也许有一种中断线程的办法就是程序退出。
在windef.h定义了MAX_PATH,普遍应该是260个字符。
使用fileDlg.m_ofn.lpstrInitialDir = TEXT("file://My/Device");,但是没有改变默认显示的目录。 lpstrInitialDir指向一个指定初始文件目录的字符串。如果为NULL,将使用系统的根目录。尽量尝试一下lpstrInitialDir为NULL。
不可能,至少没有象WisBar的第三方工具。 -
你可能用自己的程序替代\windows\clock.exe,但是,它们可以通过另外的程序处理这个。同样,在同步时ActiveSync改变设备的时间与PC匹配。
这个问题也发生在安装程序Cabwiz.exe上。你可以使用ARM类型。XScal基于ARM体系。
最小化程序将使程序进入后台,因此只要在程序启动时最小化,那么它将运行在后台。补充:还可以做成service。
代码如下:
// 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 -
PPC2002模拟器没有模拟ARM处理器,因此你必须有x86 CPU的二进制文件和相应的安装程序。只需使用文件浏览器复制cab文件到模拟器,然后执行它。商业程序的安装包通常不包含x86的二进制程序。如果你没有x86处理器的程序发布版本,你不能做这个安装。如果程序是你自己的,你可以创建一个x86的版本,之后创建一个安装CAB。
在PC程序中使用ExtractIconEx(),但是在Pocket 设备好象不工作。缺少了什么?PC图标文件在Pocket PC环境是非法的?或者需要转换格式?不幸的是,在Pocket PC上没有API去读取图标。因此,你不得不手工解析图标文件。
我想使用eVC++和GDI在Pocket PC 2002上绘制一个圆。我使用它绘制了直线,它处理的很好:
hbrOld =(HBRUSH) SelectObject(hDC, CreatePatternBrush(#00ff00));
hpnOld =(HPEN) SelectObject(hDC, CreatePen(PS_SOLID, 2, #ff0000));
Ellipse( hDC, 10, 10, 20, 20);
DeleteObject( SelectObject (hDC, hbrOld) );
DeleteObject( SelectObject (hDC, hpnOld) );
但是如何绘制一个透明的圆呢?有PS_NULL这样画笔类型吗?可以使用GetStockObject()得到一个NULL_BRUSH或HOLLOW_BRUSH(这两个是相同的)。然后用SelectObject选择它,就象你已经做的那样。
如果你知道程序的名称,并且假定与主窗口的名称相同,那么你可以使用FindWindow得到那个窗口的句柄,然后传送WM_CLOSE消息到那个窗口。
HWND hwnd = FindWindow(NULL, _T("APPLICATION NAME"));
if ( hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0);
最简单的办法是写一个自定义的RAPI函数,通过CeRapi调用设备的SetSystemTime.
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));
这样我们可以监视需要的时间。如果支持,用法也象Windows 2000那样吗?坏消息:CE不支持钩子。系统不支持,我们还是可以想其他办法的……
大多数Pocket 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();
#i nclude
#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);
}
注意:使用此段代码会将您的Pocket PC的用户数据全部清空。
#i nclude
#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);
}
· 如何在程序中关闭(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();