2007年10月8日

Display PNG file in WinCE 5.0







PNG圖檔支援背景透明的效果,不過一開始使用時,卻發現原本應該是要透明的背景,卻仍然顯示出來,這樣在將來若做UI介面時會使的美觀上大打折扣

##CONTINUE##
後來在書上發現,可以利用程式來自行處理,不過,處理時必須要指定要變為透明的顏色,也就是說,每載入一張PNG圖都必須去取得透明色的RGB值,才能將它變為透明,這樣會使得設計上非常不方便,同時,在處理後的圖示上,由於只譨指定一種顏色為透明,因此,若圖示上有陰影的效果,會使得圖示的邊緣處理的不漂亮!







後來,發現在WinCE 5.0上其實有提供透明背景顯示,不過需要加入Component後才行,可以在platform builder上搜尋SYSGEN_GDI_ALPHABLEND,加入"Alphablend API",重新Build image後即可!







至於顯示PNG的方便,有很多library可以使用,不過還需要時間比較一下,微軟也有提供
IImage class可以使用。


CoInitializeEx(NULL, 0);
IImagingFactory* pImageFactory;
IImage *pImage = NULL;


HRESULT hr = CoCreateInstance(CLSID_ImagingFactory, NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IImagingFactory),
(LPVOID *)&pImageFactory);

// Load image from file
pImageFactory->CreateImageFromFile(L"info.png", &pImage);

// Get image information
ImageInfo info;
pImage->GetImageInfo(&info);

RECT rc={0,0,info.Width, info.Height};

pImage->Draw(dc, &rc, NULL);

// Clean up
pImage->Release();
pImageFactory->Release();

CoUninitialize();

2007年10月1日

修正Reset Registry to default問題

藉由更動TOC中變數來判斷是否要將系統回復為預設值

AP部分:將TOC中bReserved[3]的值設為0X45

TOC *p;
BYTE InBuf[2048];
DWORD psize,val=0;
if(::KernelIoControl(IOCTL_READ_TOC, NULL,0,&InBuf, 2048,&psize))
{
p = (TOC *)InBuf;
p->bReserved[3] =0x45;
::KernelIoControl(IOCTL_WRITE_TOC, &InBuf, 2048,NULL,0,&psize);
KernelIoControl(IOCTL_HAL_REBOOT, NULL, 0, NULL, 0, NULL); //reboot device
}


##CONTINUE##
Driver部分:

  • 在IsAnyKeyDown()加入判斷:若值為0x45則將系統回復為預設值

if(toc->bReserved[3] == 0x45)
{
RETAILMSG(1, (TEXT("#####toc->bReserved[3]=%d \r\n"),toc->bReserved[3]));
return TRUE;
}
.........


  • 在XXXDaemon中加入判斷:若值為0x45,則將PETestFolder刪除,並將值設為0避免重複作回復預設值的動作!

if(toc->bReserved[3] == 0x45)
{
if(::KernelIoControl(IOCTL_READ_TOC, NULL,0,&InBuf, 2048,&psize))
{
p = (TOC *)InBuf;
p->bReserved[3] =0;
::KernelIoControl(IOCTL_WRITE_TOC, &InBuf, 2048,NULL,0,&psize);
}
hFind = FindFirstFile (L"\\My Flash Disk\\PETestFolder", &FindFileData);
if(hFind != INVALID_HANDLE_VALUE)
{
FindClose(hFind);
if(EmptyDirectory(_T("\\My Flash Disk\\PETestFolder"),TRUE))
{
RemoveDirectory(_T("\\My Flash Disk\\PETestFolder"));
}
}