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不支援鉤子。
系統不支援,我們還是可以想其他辦法的……
--------------------------------------------------------------------------------
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();