1.怎樣在一個控件獲得焦點(diǎn)時打開軟鍵盤? 比如一個EditBox獲得焦點(diǎn)后,這個時候自動打開軟鍵盤,這樣可以方便用戶輸入——SIPINFO、SHSIPINFO、SIPSETINFO、SIPGETINFO里面有些參數(shù)弄不明白 //隱藏輸入面板 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 ); //一般只用在調(diào)用SIP_DOWN時的的后面,使這個命令無效 -------------------------------------------------------------------------------- 2.WinCE下字符串-數(shù)字轉(zhuǎn)化的問題! 在VC6.0下,把#include <stdlib.h>、#include <stdio.h>兩個文件包括進(jìn)去后,下面這段代碼一點(diǎn)問題沒有, CString str1,str2; str1="123"; str2="123.4"; int i; float j; i=atoi(str1); j=atof(str2); 但是在EVC3.0里面,卻出現(xiàn)了問題:提示atof沒有定義,atoi也不能正常轉(zhuǎn)化。 用wcstoi,wcstof, wcstol和wcstod -------------------------------------------------------------------------------- 3. 我新拿了一個Pocket Pc,編了幾個程序,但發(fā)現(xiàn)對話框都只能全屏顯示,這是為什么? 一般在Pocket PC中所有的對話框都是全屏顯示,這是操作系統(tǒng)規(guī)定的行為。但如使用系統(tǒng)自定義的信息提示框,則不是全屏顯示。如: Afxmessagebox所激發(fā)的提示框就是如此。 可以重載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. 就是說當(dāng)對話框窗口創(chuàng)建完以后,會發(fā)出一個WM_INITDIALOG 消息,你只要在自己的窗口消息處理函數(shù)里對這個消息進(jìn)行處理,就可以了 比如: 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的窗口消息處理吧 補(bǔ)充: SHINITDLGINFO shidi; SHINITDLGINFO shidi; 上面說的是在純API的程序中的方法 對于MFC創(chuàng)建的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欄隱藏 關(guān)于ToolBar的隱藏: 首先,如果你是用MFC向?qū)?chuàng)建的工程,則默認(rèn)會生成ToolBar,我要說的是,干掉它!自己來創(chuàng)建。:) First,聲明CToolBar成員變量: CToolBar * d_pToolbar2; 然后…… static UINT BASED_CODE Toolbar2Buttons[] = { // 下面是工具欄對應(yīng)菜單的ID,工具欄圖標(biāo)是我弄的一個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, //這是新加入的菜單項,點(diǎn)擊隱藏工具欄,再點(diǎn)擊就顯示工具欄 }; 然后…… 在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,默認(rèn)情況下ToolBar是隱藏的,點(diǎn)擊菜單中的新加入的隱藏/顯示工具欄命令即可來回切換了。 -------------------------------------------------------------------------------- 5.如何制作pocket Pc 下的安裝程序? 在C:\Windows CE Tools\wce300\MS Pocket PC\support\ActiveSync\windows ce application installation 下面有例子. 也有其它第三方的安裝工具,比如installshield。 -------------------------------------------------------------------------------- 6.怎樣在主界面中顯示一幅圖片 我做了一個小程序, 想在主界面中顯示一幅圖片,我的圖片是.JPG格式的,如果需要轉(zhuǎn)換,用什么工具? 把JPG圖轉(zhuǎn)為BMP圖咯,網(wǎng)上有不少這樣的程序。 然后用LoadBitmap、SelectObject、StretchBlt等語句把BMP圖顯示到VIEW中。 -------------------------------------------------------------------------------- 7. 請問,在WinCE下如何截獲所有鼠標(biāo)和鍵盤的消息? wince下只能用三種鉤子 #define WH_JOURNALRECORD 0 #define WH_JOURNALPLAYBACK 1 #define WH_KEYBOARD_LL 20 -------------------------------------------------------------------------------- 8.在Pocket PC下用eVC作的對話框能否做成不是全屏的? 在MFC中 m_bFullScreen = FALSE; -------------------------------------------------------------------------------- 9.如何將char 類型的中文字符串轉(zhuǎn)換成Unicode的字符串? MultiByteToWideChar,在仿真器中無效;你也可以通過其他方法;用wcsprintf這個函數(shù) -------------------------------------------------------------------------------- 10. evc單文檔界面中,菜單左邊總有一個"new",如何將其去掉? 在MainFrm的OnCreate內(nèi)找到這個: m_wndCommandBar.m_bShowSharedNewButton = TRUE; 把TRUE改為FALSE -------------------------------------------------------------------------------- 11.Edit出現(xiàn)上下文菜單問題? 近來我看了一下SDK帶的Sample中的Npp,其中它有一個功能就是在EDIT上出現(xiàn)上下文菜單,可是當(dāng)我仿照它在自己的項目中添加此功能時,即在資源中添加CONTROL "",IDC_STATIC,"SIPPREF",NOT WS_VISIBLE,-10,-10、,6,6,在模擬器中正常,但在PDA中不能顯示包含Edit的對話框。而Npp可以在兩者正常顯示。我又在Npp中增加一個對話框,也相應(yīng)的改變資源,結(jié)果是在模擬器和PDA中都能正常顯示。 調(diào)用SHInitExtraControls()應(yīng)該在構(gòu)造函數(shù),不應(yīng)在OnInitDialog中。如果在OnInitDialog中調(diào)用,包含EDIT的對話框?qū)⒉伙@示。 事實(shí)上在XXXApp::InitInstance函數(shù)中調(diào)用更好,這樣只需調(diào)用一次,就萬事大吉。 -------------------------------------------------------------------------------- 12. 如何將.mdb數(shù)據(jù)庫轉(zhuǎn)換為.cdb數(shù)據(jù)庫 如何將.mdb數(shù)據(jù)庫轉(zhuǎn)換為.cdb數(shù)據(jù)庫,在沒有實(shí)際PDA,只有Pocket PC Emuliation和EVB的情況下。 Pocket PC Emuliation運(yùn)行時為何提示“存儲器不足,無法完成操作”? 此問題微軟已經(jīng)給出了答案。 在SDK文檔中有一個叫做device的例子程序,它就是將tdb文件轉(zhuǎn)化成cdb文件的,而還有一個desktop的程序,它是將mdb文件轉(zhuǎn)化成tdb文件的。 -------------------------------------------------------------------------------- 13.請問如何用EVC建立和調(diào)用DLL 我按照幫助中用MFC開發(fā)DLL的例子做,但是另外一個程序調(diào)用的時候的時候卻出現(xiàn)連接錯誤,說找不到那個函數(shù)。后來看了EVC的例子spintest之后也是這樣。 和在WINDOWS下的一樣 是不是LINK2001 ERROR? 你如果是隱式調(diào)用(就是不用LOADLIBRARY()的),要把你的DLL的LIB文件在PROJECT-->SETTINGS--->LINK--->INPUT里指明。 -------------------------------------------------------------------------------- 14.編輯框如何自動會換行 ? 請教,Plam中的table控件,在Wince上怎么做? 就是編輯框自動會換行.當(dāng)你輸入的內(nèi)容超過一行,自動切換到下一行,下面的內(nèi)容自動往下滾。 勾選編輯控件的MultiLine,如果想輸入回車換行,再勾選want renturn -------------------------------------------------------------------------------- 15.是否在adoce,pocket access中的update語句不能執(zhí)行? ADOCE不能直接執(zhí)行UPDATE語句,但ADOCE有Update方法,你可用它實(shí)現(xiàn)。 -------------------------------------------------------------------------------- 16.請問如何在Windows CE中實(shí)現(xiàn)BC++中的inport(...)與outportb(...)函數(shù)功能? CE下,可以用WINDOWS API函數(shù)來對端口操作。 比較簡單。 API一般只要用到CreateFile(打開端口,串口操作和文件操作只有一點(diǎn)不同就是打開方式不同,所以第三個參數(shù)要用 OPEN_EXISTING ) COMMTIMEOUTS、DCB兩個結(jié)構(gòu)是存放設(shè)置參數(shù)的,可以改 WriteFile、WriteFile(讀寫端口) 因?yàn)榇谕ㄓ嵱玫氖钱惒酵ㄓ崳韵旅鎯删浔容^重要 SetCommMask(指定監(jiān)視的端口事件) WaitCommEvent(等待端口事件) -------------------------------------------------------------------------------- 17. 如何顯示一個對話框讓用戶選擇一個目錄而不是文件 沒有標(biāo)準(zhǔn)的函數(shù)處理這個,你只好自己實(shí)現(xiàn)活使用第三方的解決方案。 -------------------------------------------------------------------------------- 18.有沒有辦法(API)激活或禁止電源保存模式? 參看SystemIdleTimerReset()的安裝文檔。創(chuàng)建一個包含象睡眠的無限循環(huán)的線程,然后調(diào)用SystemIdleTimerReset()。也許有一種中斷線程的辦法就是程序退出。 -------------------------------------------------------------------------------- 19. Windows CE的文件名最小程度是多少? 在windef.h定義了MAX_PATH,普遍應(yīng)該是260個字符。 20. 我使用CFileDialog創(chuàng)建了一個瀏覽按鈕,默認(rèn)目錄始終是顯示"All Folders"和在"\My Device\My do***ents"下。怎樣改變初始目錄到"\My Device"。使用fileDlg.m_ofn.lpstrInitialDir = TEXT("file://My/ Device");,但是沒有改變默認(rèn)顯示的目錄。 lpstrInitialDir指向一個指定初始文件目錄的字符串。如果為NULL,將使用系統(tǒng)的根目錄。盡量嘗試一下lpstrInitialDir為NULL。 -------------------------------------------------------------------------------- 21.在Pocket PC任務(wù)欄上可能有X和OK按鈕嗎? 不可能,至少沒有象WisBar的第三方工具。 -------------------------------------------------------------------------------- 22.如何禁止用戶改變?nèi)掌诤蜁r間?有可能實(shí)現(xiàn)嗎? 你可能用自己的程序替代\windows\clock.exe,但是,它們可以通過另外的程序處理這個。同樣,在同步時ActiveSync改變設(shè)備的時間與PC匹配。 -------------------------------------------------------------------------------- 23. 我有一個xscal cpu的ipaq 3970設(shè)備,但是在eMbedded Visual C++ 3.0上沒有目標(biāo)類型。我應(yīng)該在EVC3.0上使用什么類型。這個問題也發(fā)生在安裝程序Cabwiz.exe上。 你可以使用ARM類型。XScal基于ARM體系。 -------------------------------------------------------------------------------- 24. 如何使程序在后臺運(yùn)行? 最小化程序?qū)⑹钩绦蜻M(jìn)入后臺,因此只要在程序啟動時最小化,那么它將運(yùn)行在后臺。 補(bǔ)充:還可以做成service。 -------------------------------------------------------------------------------- 25. 我準(zhǔn)備去掉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,因?yàn)閷υ捒蜻€沒有可見。你應(yīng)該傳遞一個自定義消息,在那個消息調(diào)用這個函數(shù)。 也許下面這段代碼會有用: 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的二進(jìn)制文件和相應(yīng)的安裝程序。只需使用文件瀏覽器復(fù)制cab文件到模擬器,然后執(zhí)行它。商業(yè)程序的安裝包通常不包含x86的二進(jìn)制程序。如果你沒有x86處理器的程序發(fā)布版本,你不能做這個安裝。如果程序是你自己的,你可以創(chuàng)建一個x86的版本,之后創(chuàng)建一個安裝CAB。 -------------------------------------------------------------------------------- 27. 如何在eVC程序中讀取普通的圖標(biāo)文件? 在PC程序中使用ExtractIconEx(),但是在Pocket 設(shè)備好象不工作。缺少了什么?PC圖標(biāo)文件在Pocket PC環(huán)境是非法的?或者需要轉(zhuǎn)換格式? 不幸的是,在Pocket PC上沒有API去讀取圖標(biāo)。因此,你不得不手工解析圖標(biāo)文件。 -------------------------------------------------------------------------------- 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選擇它,就象你已經(jīng)做的那樣。 -------------------------------------------------------------------------------- 29. 假定我知道程序的名稱,關(guān)閉運(yùn)行著的eVC的程序使用什么API? 如果你知道程序的名稱,并且假定與主窗口的名稱相同,那么你可以使用FindWindow得到那個窗口的句柄,然后傳送WM_CLOSE消息到那個窗口。 HWND hwnd = FindWindow(NULL, _T("APPLICATION NAME")); if ( hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0); -------------------------------------------------------------------------------- 30. 如何從PC設(shè)置PDA的時間? 最簡單的辦法是寫一個自定義的RAPI函數(shù),通過CeRapi調(diào)用設(shè)備的SetSystemTime. -------------------------------------------------------------------------------- 31. 怎樣使用WriteBinary,我不明白第二個參數(shù)(LPBYTE): BOOL CVORegistry::WriteBinary(LPCTSTR pcszKey, LPBYTE pData, DWORD cbData) 第二個參數(shù)是指向包含你想寫到注冊表的二進(jìn)制數(shù)據(jù)的緩沖。 BYTE data[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef }; extern CVORegistry reg; reg.WriteData(_T("BinaryData"), data, sizeof(data)); -------------------------------------------------------------------------------- 32. Windows CE支持鉤子API嗎?這樣我們可以監(jiān)視需要的時間。如果支持,用法也象Windows 2000那樣嗎? 壞消息:CE不支持鉤子。 系統(tǒng)不支持,我們還是可以想其他辦法的……
-------------------------------------------------------------------------------- 33. 我不能使用Pocket PC上CDialog的TitleBar,我能用靜態(tài)文本框控件替代,使之與TitleBar相似。有辦法顯示TitleBar嗎? 大多數(shù)Pocket PC上的對話框是全屏的,沒有自己的主題欄,而是使用系統(tǒng)任務(wù)欄。你可以創(chuàng)建一個非全屏對話框(象消息框那樣)。 -------------------------------------------------------------------------------- 34. 如何在程序中關(guān)閉(suspend)Pocekt PC? 方法1:虛擬關(guān)機(jī)鍵 ::keybd_event(VK_OFF, 0, 0, 0); ::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0); 方法2:調(diào)用未公開函數(shù)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的用戶數(shù)據(jù)全部清空。 #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.系統(tǒng)不認(rèn)識VK_OFF 2.使用哪個dll 和 lib文件? · 如何在程序中關(guān)閉(suspend)Pocekt PC? 方法1:虛擬關(guān)機(jī)鍵 ::keybd_event(VK_OFF, 0, 0, 0); ::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0); 方法2:調(diào)用未公開函數(shù)PowerOffSystem() extern \"C\" __declspec(dllimport) void PowerOffSystem(); 關(guān)閉(suspend) 方法1: //虛擬關(guān)機(jī)鍵 ::keybd_event(VK_OFF, 0, 0, 0); ::keybd_event(VK_OFF, 0, KEYEVENTF_KEYUP, 0); 方法2: //調(diào)用未公開函數(shù)PowerOffSystem() extern "C" __declspec(dllimport) void PowerOffSystem();
|