📄 doc.txt
字号:
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();
1 取得设备ID
#include
extern "C" __declspec(dllimport)
BOOL KernelIoControl(
DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize,
LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned
);
#define IOCTL_HAL_GET_DEVICEID CTL_CODE(FILE_DEVICE_HAL, 21,
METHOD_BUFFERED, FILE_ANY_ACCESS)
CString GetSerialNumberFromKernelIoControl()
{
DWORD dwOutBytes;
const int nBuffSize = 4096;
byte arrOutBuff[nBuffSize];
BOOL bRes = ::KernelIoControl(IOCTL_HAL_GET_DEVICEID,
0, 0, arrOutBuff, nBuffSize, &dwOutBytes);
if (bRes) {
CString strDeviceInfo;
for (unsigned int i = 0; i
CString strNextChar;
strNextChar.Format(TEXT("%02X"), arrOutBuff);
strDeviceInfo += strNextChar;
}
CString strDeviceId =
strDeviceInfo.Mid(40,2) +
strDeviceInfo.Mid(45,9) +
strDeviceInfo.Mid(70,6);
return strDeviceId;
} else {
return _T("");
}
}
说明:Windows Mobile 5.0已经添加了专门的API完成此任务,对于2003以下的设备可以用
此方法。此方法是否能取道ID还取决与硬件制造商是否已经实现了改方法。因为
smartphone具备2-Tie安全性,所以此方法如果没有授权证书可能会调用失败。
2 取得设备信息
TCHAR wszMachineName[128];
SystemParametersInfo(SPI_GETOEMINFO, sizeof(wszMachineName),
&wszMachineName, 0);
取得设备OEM信息。
TCHAR wszVersion[256];
SystemParametersInfo(SPI_GETPLATFORMTYPE, sizeof(wszVersion),
&wszVersion, 0);
取得平台信息。
3 创建GUID
CString CreateGUID()
{
TCHAR wGuid[37];
SYSTEMTIME systime;
FILETIME filetime;
// construct GUID
GetSystemTime(&systime);
SystemTimeToFileTime(&systime,&filetime);
DWORD tick=GetTickCount();
DWORD highWord=filetime.dwHighDateTime+0x146BF4;
// convert GUID to a string
wsprintf(wGuid,TEXT("%08.8x-%04.4x-%04.4x-%04.4x-%04.4x%04.4x%04.4x"),
filetime.dwLowDateTime,
LOWORD(highWord),
HIWORD(highWord |0x10000000),
LOWORD(rand()),
HIWORD(tick),
LOWORD(tick),
LOWORD(rand()));
return CString(wGuid);
}
当前执行文件目录:
GetModuleFileName(NULL,CurrentFile,sizeof(CurrentFile)/sizeof(TCHAR));//当前正在执行的文件的路径
prt=wcsrchr(CurrentFile,TEXT('\\'));//找到路径当中最后一个\的位置
PathLength=prt-CurrentFile+1;//从第一个字符到最后一个\的字符数
wcsncpy(CurrentDirectory,CurrentFile,PathLength);//将PathLength个字符从CurrentFile复制到CurrentDirecotry就OK了
/////////////////////////////////////////////
透明的控件, 一般继承自TGraphicControl的
(就是那些没有handle属性, 不能有focus的控件, 如image)
都有Transparent属性. 对TWinControl类的控件, 要实现透明只要完成以下
四步基本上就成了.
1.在Create中设定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.
inherited CreateParams(Params);
with Params do
begin
{ 完全重画 }
Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;
{ 增加透明 }
ExStyle := ExStyle or WS_EX_TRANSPARENT;
end;
4. 截获WM_ERASEBKGND, 什么都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect,
所以要实现透明的话还要override 它的paint方法, 自己画.
按钮透明需要进一步处理.
createparams里加上style := style or BS_OWNERDRAW;
然后在WM_DRAWITEM中自己画吧
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
我的研究发现 Style := Style and not WS_CLIPCHILDREN;
Style := Style and not WS_CLIPSIBLINGS;没有作用。
如果你要改变控件位置和颜色,请拦截WM_MOVE,和CN_CTLCOLOREDIT消息,在里面调用invalidate方法,重绘组件。
阅读inside vcl 和 飞思的组件开发书籍。了解如何选择适当的基类去继承然后扩展成自己的类。建议写控件的朋友应先了解这方面的知识,不要从tobject开始写起。ControlStyle :=ControlStyle - [csOpaque];)很关键,看源代码发现它影响了整个控件的画方法。现在已经实现了透明组件,可是用鼠标移动该组件就出现刷新不够,背景混乱的问题。现在正在阅读timage源代码,看它是如何实现。想讨论这方面技术的朋友请email:wenjunwu430@163.com
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -