Today プラグインサンプルプログラム3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#analog
#norelated
#contents
* Today プラグインサンプルプログラム3 [#ya388a19]
[[Today プラグインサンプルプログラム2]]では、背景を透過し...
文字が表示できたら、今度は画像を表示してみたくなるのが人...
というわけで、ただ表示するだけでは面白くないので、α(アル...
具体的には、以下のような画像を用意し、数字を背景上に描画...
#ref(digital.png,left,nowrap,デジタル数字)
絵じゃなくて字じゃん!というツッコミはなしでw~
わかりにくいかもしれませんが、背景が透過しており、なおか...
白一色だと見にくいと思うので、同じサイズの黒の画像を裏に...
** ファイルパス作成 [#b53c2144]
まずは、読み込む画像ファイルのフルパスを作る必要がありま...
WindowsMobileは、相対パスが使えないという制限もありますし...
今回は、DLLと同じところに画像ファイルを置きます。~
なのでまず、DLLがアタッチされた時に、自分自身のパスを保存...
現状、DLLアタッチ時に、リソースのロードをしているので、そ...
自分自身のパスを得るには、DllMainの第1引数を指定して、Get...
通常、実行ファイルが自分自身のパスを得るには、第1引数にNU...
(Todayプラグインだと、「\Windows\shell32.exe」)~
今回は、DLL自身のパスを知りたいので、ちゃんとDLLのインス...
実際に画像ファイルのパスを作りたい時には、このDLLのパスを...
本当は、makepathやsplitpathといった関数が使用できれば楽で...
処理としては、後ろから文字を調べて、最初に「\」が出てきた...
// パス作成
bool CApp::makePath( LPTSTR path, LPCTSTR fname )
{
int len = 0;
int len2 = 0;
int i = 0;
if( NULL == path || NULL == fname ){
return false;
}
if( NULL == ::lstrcpy( path, m_dllPath )){
return false;
}
len = ::lstrlen( path );
len2 = ::lstrlen( fname );
if( 0 >= len || 0 >= fname ){
return false;
}
if( MAX_PATH < len + len2 + 1 ){
return false;
}
for( i = 0; i < len; i++ ){
if( TEXT( '\\' ) == path[len-i-1] ){
break;
}
}
if( i == len ){
return false;
}
if( NULL == ::lstrcpy( path + len - i, fname )){
return false;
}
return true;
}
** DIBSection [#e399e3eb]
PNGファイルをロードする前に、ロードした画像を保存しておく...
しかも、ただ保存しておくだけではなく、そこから裏画面に転...
さらに、今回はそこまではやりませんが、ピクセルデータをメ...
というわけで、これらが可能なDIBSectionを作成することにし...
今回は、ロード用のDIBSectionだけではなく、今まで表画面と...
将来的にやりたい(やるかもしれない)事として、ロードした画...
この時、裏画面の形式が表画面によって変わってしまうと、Ble...
裏画面はそのまま表画面へと転送するので、透明度を持つ必要...
画像をロードする領域は、透明度を扱える必要があるので、32b...
もちろん、ロードする画像に透明度がないようであれば、こち...
このように固定しておけば、RGBのそれぞれが1バイトずつのBle...
ただし、今まで裏画面は表画面との互換性があるものを作成し...
異なるとどうなるかというと、裏画面を表画面に転送(BitBlt)...
まぁ、ゲーム等の頻繁に画面の書き換えが発生するような用途...
DIBSection作成処理は、以下のような感じです。~
// DIBセクション作成
bool CDIBSection::create( HWND hwnd, int width, int heig...
{
HDC hdc = NULL; // Windowデバイスコンテキストハンドル
destroy();
// デバイスコンテキストの作成
hdc = ::GetDC( hwnd );
if( NULL == hdc ){
goto Error;
}
m_hdc = CreateCompatibleDC( hdc );
if( NULL == m_hdc ){
goto Error;
}
// BITMAPINFOHEADER構造体の初期化
ZeroMemory( &m_bi, sizeof( m_bi ));
m_bi.biSize = sizeof( m_bi );
m_bi.biWidth = width;
m_bi.biHeight = height;
m_bi.biPlanes = 1;
m_bi.biBitCount = cbit;
m_bi.biCompression = BI_RGB;
m_bi.biSizeImage = 0;
m_bi.biXPelsPerMeter = 0;
m_bi.biYPelsPerMeter = 0;
m_bi.biClrUsed = 0;
m_bi.biClrImportant = 0;
// DIBSectionの作成
m_hBitmap = CreateDIBSection( m_hdc, ( LPBITMAPINFO )&m...
if( NULL == m_hBitmap ){
goto Error;
}
// ビットマップの関連付け
m_hOldBitmap = SelectBitmap( m_hdc, m_hBitmap );
if( NULL == m_hOldBitmap ){
goto Error;
}
if( hdc ){
::ReleaseDC( hwnd, hdc );
hdc = NULL;
}
return true;
Error:
destroy();
if( hdc ){
::ReleaseDC( hwnd, hdc );
hdc = NULL;
}
return false;
}
** IImagingFactory [#o39ac0df]
透明度付きの画像をロードするには、SHLoadImageFileではなく...
このため、まずはCOMを初期化する必要があり、CoInitializeEx...
CoInitializeExとCoUninitializeはペアで呼び出す必要があり...
しかし、DllMainのプロセスアタッチ/デタッチはスレッド毎で...
このため、COMの初期化/解放は、Windowに同期して行うように...
WindowプロシージャのWM_CREATEとWM_DESTROYは、毎回同じスレ...
InitializeCustomItemがコールされて、Windowを作成しようと...
画像データは、本来であればリソースとして、Dllのプロセスア...
また、ロードを行うWindowと互換性のあるデバイスコンテキス...
TodayアイテムのWindowは、何個も生成されるようなものではな...
COMからPNGファイルをロードして保持する手順としては、CoCre...
IImageからImageInfoの画像情報を取得し、画像情報からサイズ...
DIBSectionができたら、IImageからDIBSectionのデバイスコン...
この辺りのソース的な流れは以下のような感じです。~
// イメージロード
bool CTodayWnd::loadImage( HWND hwnd, LPCDIBSection lpCD...
{
IImagingFactory *lpImageFactory = NULL; // ImagingFact...
IImage *lpImage = NULL; // Imageインターフェイスへの...
ImageInfo imageInfo; // 画像情報
RECT rect; // 描画矩形
bool ret = false; // 戻り値
// ImagingFactoryインスタンス生成
if( S_OK != ::CoCreateInstance( CLSID_ImagingFactory, N...
goto Error;
}
if( NULL == lpImageFactory ){
goto Error;
}
// 画像ファイル読み込み
if( S_OK != lpImageFactory->CreateImageFromFile( path, ...
goto Error;
}
if( NULL == lpImage ){
goto Error;
}
// 画像情報取得
ZeroMemory( &imageInfo, sizeof( imageInfo ));
if( S_OK != lpImage->GetImageInfo( &imageInfo )){
goto Error;
}
// DIBセクション作成
if( !lpCDib->create( hwnd, &imageInfo )){
goto Error;
}
// DIBセクションに描画
ZeroMemory( &rect, sizeof( rect ));
rect.right = imageInfo.Width;
rect.bottom = imageInfo.Height;
if( S_OK != lpImage->Draw( m_digital.getDC(), &rect, NU...
goto Error;
}
ret = true;
Error:
if( NULL != lpImage ){
lpImage->Release();
lpImage = NULL;
}
if( NULL != lpImageFactory ){
lpImageFactory->Release();
lpImageFactory = NULL;
}
return ret;
}
色深度は、ImageInfoのPixelFormatの、PixelFormatAlphaが立...
終了行:
#analog
#norelated
#contents
* Today プラグインサンプルプログラム3 [#ya388a19]
[[Today プラグインサンプルプログラム2]]では、背景を透過し...
文字が表示できたら、今度は画像を表示してみたくなるのが人...
というわけで、ただ表示するだけでは面白くないので、α(アル...
具体的には、以下のような画像を用意し、数字を背景上に描画...
#ref(digital.png,left,nowrap,デジタル数字)
絵じゃなくて字じゃん!というツッコミはなしでw~
わかりにくいかもしれませんが、背景が透過しており、なおか...
白一色だと見にくいと思うので、同じサイズの黒の画像を裏に...
** ファイルパス作成 [#b53c2144]
まずは、読み込む画像ファイルのフルパスを作る必要がありま...
WindowsMobileは、相対パスが使えないという制限もありますし...
今回は、DLLと同じところに画像ファイルを置きます。~
なのでまず、DLLがアタッチされた時に、自分自身のパスを保存...
現状、DLLアタッチ時に、リソースのロードをしているので、そ...
自分自身のパスを得るには、DllMainの第1引数を指定して、Get...
通常、実行ファイルが自分自身のパスを得るには、第1引数にNU...
(Todayプラグインだと、「\Windows\shell32.exe」)~
今回は、DLL自身のパスを知りたいので、ちゃんとDLLのインス...
実際に画像ファイルのパスを作りたい時には、このDLLのパスを...
本当は、makepathやsplitpathといった関数が使用できれば楽で...
処理としては、後ろから文字を調べて、最初に「\」が出てきた...
// パス作成
bool CApp::makePath( LPTSTR path, LPCTSTR fname )
{
int len = 0;
int len2 = 0;
int i = 0;
if( NULL == path || NULL == fname ){
return false;
}
if( NULL == ::lstrcpy( path, m_dllPath )){
return false;
}
len = ::lstrlen( path );
len2 = ::lstrlen( fname );
if( 0 >= len || 0 >= fname ){
return false;
}
if( MAX_PATH < len + len2 + 1 ){
return false;
}
for( i = 0; i < len; i++ ){
if( TEXT( '\\' ) == path[len-i-1] ){
break;
}
}
if( i == len ){
return false;
}
if( NULL == ::lstrcpy( path + len - i, fname )){
return false;
}
return true;
}
** DIBSection [#e399e3eb]
PNGファイルをロードする前に、ロードした画像を保存しておく...
しかも、ただ保存しておくだけではなく、そこから裏画面に転...
さらに、今回はそこまではやりませんが、ピクセルデータをメ...
というわけで、これらが可能なDIBSectionを作成することにし...
今回は、ロード用のDIBSectionだけではなく、今まで表画面と...
将来的にやりたい(やるかもしれない)事として、ロードした画...
この時、裏画面の形式が表画面によって変わってしまうと、Ble...
裏画面はそのまま表画面へと転送するので、透明度を持つ必要...
画像をロードする領域は、透明度を扱える必要があるので、32b...
もちろん、ロードする画像に透明度がないようであれば、こち...
このように固定しておけば、RGBのそれぞれが1バイトずつのBle...
ただし、今まで裏画面は表画面との互換性があるものを作成し...
異なるとどうなるかというと、裏画面を表画面に転送(BitBlt)...
まぁ、ゲーム等の頻繁に画面の書き換えが発生するような用途...
DIBSection作成処理は、以下のような感じです。~
// DIBセクション作成
bool CDIBSection::create( HWND hwnd, int width, int heig...
{
HDC hdc = NULL; // Windowデバイスコンテキストハンドル
destroy();
// デバイスコンテキストの作成
hdc = ::GetDC( hwnd );
if( NULL == hdc ){
goto Error;
}
m_hdc = CreateCompatibleDC( hdc );
if( NULL == m_hdc ){
goto Error;
}
// BITMAPINFOHEADER構造体の初期化
ZeroMemory( &m_bi, sizeof( m_bi ));
m_bi.biSize = sizeof( m_bi );
m_bi.biWidth = width;
m_bi.biHeight = height;
m_bi.biPlanes = 1;
m_bi.biBitCount = cbit;
m_bi.biCompression = BI_RGB;
m_bi.biSizeImage = 0;
m_bi.biXPelsPerMeter = 0;
m_bi.biYPelsPerMeter = 0;
m_bi.biClrUsed = 0;
m_bi.biClrImportant = 0;
// DIBSectionの作成
m_hBitmap = CreateDIBSection( m_hdc, ( LPBITMAPINFO )&m...
if( NULL == m_hBitmap ){
goto Error;
}
// ビットマップの関連付け
m_hOldBitmap = SelectBitmap( m_hdc, m_hBitmap );
if( NULL == m_hOldBitmap ){
goto Error;
}
if( hdc ){
::ReleaseDC( hwnd, hdc );
hdc = NULL;
}
return true;
Error:
destroy();
if( hdc ){
::ReleaseDC( hwnd, hdc );
hdc = NULL;
}
return false;
}
** IImagingFactory [#o39ac0df]
透明度付きの画像をロードするには、SHLoadImageFileではなく...
このため、まずはCOMを初期化する必要があり、CoInitializeEx...
CoInitializeExとCoUninitializeはペアで呼び出す必要があり...
しかし、DllMainのプロセスアタッチ/デタッチはスレッド毎で...
このため、COMの初期化/解放は、Windowに同期して行うように...
WindowプロシージャのWM_CREATEとWM_DESTROYは、毎回同じスレ...
InitializeCustomItemがコールされて、Windowを作成しようと...
画像データは、本来であればリソースとして、Dllのプロセスア...
また、ロードを行うWindowと互換性のあるデバイスコンテキス...
TodayアイテムのWindowは、何個も生成されるようなものではな...
COMからPNGファイルをロードして保持する手順としては、CoCre...
IImageからImageInfoの画像情報を取得し、画像情報からサイズ...
DIBSectionができたら、IImageからDIBSectionのデバイスコン...
この辺りのソース的な流れは以下のような感じです。~
// イメージロード
bool CTodayWnd::loadImage( HWND hwnd, LPCDIBSection lpCD...
{
IImagingFactory *lpImageFactory = NULL; // ImagingFact...
IImage *lpImage = NULL; // Imageインターフェイスへの...
ImageInfo imageInfo; // 画像情報
RECT rect; // 描画矩形
bool ret = false; // 戻り値
// ImagingFactoryインスタンス生成
if( S_OK != ::CoCreateInstance( CLSID_ImagingFactory, N...
goto Error;
}
if( NULL == lpImageFactory ){
goto Error;
}
// 画像ファイル読み込み
if( S_OK != lpImageFactory->CreateImageFromFile( path, ...
goto Error;
}
if( NULL == lpImage ){
goto Error;
}
// 画像情報取得
ZeroMemory( &imageInfo, sizeof( imageInfo ));
if( S_OK != lpImage->GetImageInfo( &imageInfo )){
goto Error;
}
// DIBセクション作成
if( !lpCDib->create( hwnd, &imageInfo )){
goto Error;
}
// DIBセクションに描画
ZeroMemory( &rect, sizeof( rect ));
rect.right = imageInfo.Width;
rect.bottom = imageInfo.Height;
if( S_OK != lpImage->Draw( m_digital.getDC(), &rect, NU...
goto Error;
}
ret = true;
Error:
if( NULL != lpImage ){
lpImage->Release();
lpImage = NULL;
}
if( NULL != lpImageFactory ){
lpImageFactory->Release();
lpImageFactory = NULL;
}
return ret;
}
色深度は、ImageInfoのPixelFormatの、PixelFormatAlphaが立...
ページ名: