⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 doc.txt

📁 Windows mobile下的透明控件(皮肤控件) 当前Windows mobile下的皮肤控件还很少
💻 TXT
📖 第 1 页 / 共 2 页
字号:

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 + -