構造体を用意します
下記のコ-ドをドキュメントクラス・ヘッダ-内に記載します、この構造体は全てのフォ-ムビュで使用します。
//================================================================
//================================================================
//================================================================
typedef struct hbitmap{
int ContNmber.VewNmber;
int item;
CBitmap *bmp;
HBITMAP hBitmap;
BITMAPINFO *pbmi;
HANDLE hFile;
CDC* pDC;
HDC hDCCompat;
BITMAPFILEHEADER bmfh;
CRect rect;
CStatic* m_pStatic;
}s_HbitMap;
同じく下記の様に使用領域をセットします
この変数は動的に領域が増加して行きます、いくらリストコントロ-ルが増加しようと構いませんし有用な構造体になります。
class DietRemedyDoc : public CDocument
{
protected: // シリアル化からのみ作成します。
DietRemedyDoc();
DECLARE_DYNCREATE(DietRemedyDoc)
public:
CArray<s_HbitMap,s_HbitMap> m_Array_ms_HbitMap;
全ての削除は下記の様に
単純な配列宣言ではない為に無駄にリソ-スを使いません、動的に増えていく素晴らしい関数です。
m_Array_ms_HbitMap.RemoveAll();//削除する場合は先の様に行います・
BMPファイル読み込み
下記のコ-ドはBMPファイルを読み出しその有効なハンドルを呼び出し側に返します。
HBITMAP CControlPracticeDoc::BitmapToFilaeRead(CString Dir,CString bmpName)
{
HBITMAP hBitmap ;
BITMAPINFO *pbmi ;
void *pbits;
HANDLE hfile;
BITMAPFILEHEADER bmfh;
DWORD temp;
//==========================================================================
hBitmap=::LoadBitmap(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BMPIMG));
CString OpenFileName=Dir+bmpName+_T("bmp");
//---------------------------------------------------
pbmi=(BITMAPINFO*)new BYTE[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256];
hfile=CreateFile(OpenFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if(hfile!=NULL) {
ReadFile(hfile,&bmfh,sizeof(bmfh),&temp,NULL);
ReadFile(hfile,&pbmi->bmiHeader,sizeof(pbmi->bmiHeader),&temp,NULL);
if(pbmi->bmiHeader.biBitCount<=8){
ReadFile(hfile,pbmi->bmiColors,sizeof(COLORREF)*(1<<pbmi- >bmiHeader.biBitCount),&temp,NULL);
}
//---------------------------------------------------
hBitmap=CreateDIBSection(NULL,pbmi,DIB_RGB_COLORS,&pbits,NULL,0);
GdiFlush();
SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
ReadFile(hfile,pbits,pbmi->bmiHeader.biSizeImage,&temp,NULL);
CloseHandle(hfile) ;
delete[] (BYTE*)pbmi ;
return hBitmap ;
}
//---------------------------------------------------
return hBitmap ;
}
BMPファイルを保存する
/////////////////////////////////////////////////////////////////////////////
///////////////////// ビットマップを保存する ///////////////////////////
/////////////////////////////////////////////////////////////////////////////
void RightFormVew::BitmapToFilaeSave(CString FileName)
{
CControlPracticeDoc* pDoc = GetDocument();
if(FileName=="") return;
//==============================================================
HBITMAP hBitmap,hBitmapPrev;
BITMAPINFO *pbmi;
void *pbits;
HANDLE hfile;
//==============================================================
HDC hDC ;
HDC hDCCompat;
//==============================================================
DWORD temp;
BITMAPFILEHEADER bmfh;
HWND hWnd=RightFormVew::m_hWnd;
hDC=::GetDC(hWnd);
//==============================================================
CString fNam=FileName+_T(".bmp");
hBitmap=m_pStatic->GetBitmap();
CRect rect,rectB;
GetWindowRect(rectB) ;
m_pStaticB->GetWindowRect(rect);
//==============================================================
int ty=rect.top-rectB.top ;
int tx=rect.left-rectB.left;
rect.top=ty ;rect.bottom=rect.top+128;
rect.left=tx;rect.right=rect.left+128;
int wih=rect.Width();
//==============================================================
pbmi=(BITMAPINFO*)new BYTE[sizeof(BITMAPINFO)] ;
ZeroMemory(&pbmi->bmiHeader,sizeof(pbmi->bmiHeader));
pbmi->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth =rect.Width() ;
pbmi->bmiHeader.biHeight=rect.Height();
pbmi->bmiHeader.biBitCount=GetDeviceCaps(hDC,BITSPIXEL);
pbmi->bmiHeader.biPlanes=1;
pbmi->bmiHeader.biSizeImage=(((pbmi->bmiHeader.biWidth*pbmi->bmiHeader.biBitCount+31)>>3)
& 0xfffffffc)*pbmi->bmiHeader.biHeight;
//==============================================================
hBitmap=CreateDIBSection(hDC,pbmi,DIB_RGB_COLORS,&pbits,NULL,0);
hDCCompat=CreateCompatibleDC(hDC);
hBitmapPrev=(HBITMAP)SelectObject(hDCCompat,hBitmap);
BitBlt(hDCCompat,0,0,pbmi->bmiHeader.biWidth,pbmi- >bmiHeader.biHeight,hDC,rect.left,rect.top,SRCCOPY);
//==============================================================
bmfh.bfType=0x4d42;
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfSize=bmfh.bfOffBits+pbmi->bmiHeader.biSizeImage;
//==============================================================
hfile=CreateFile(fNam,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
//==============================================================
WriteFile(hfile,&bmfh,sizeof(bmfh),&temp,NULL);
WriteFile(hfile,&pbmi->bmiHeader,sizeof(pbmi->bmiHeader),&temp,NULL);
SetFilePointer(hfile,bmfh.bfOffBits,NULL,FILE_BEGIN);
WriteFile(hfile,pbits,pbmi->bmiHeader.biSizeImage,&temp,NULL);
//==============================================================
CloseHandle(hfile) ;
delete[] (BYTE*)pbmi;
//==============================================================
}
現在のアプリケ-ション
大分アプリケ-ションらしくなってきましたね!今回はリストコントロ-ルの左上にBMP型式のファイルを読み出し組み込むと言う内容です。応用範囲は無限大ですよね!貴方のスキルアップに役立てて下さい。
今回のBMPを着見込む物
ツリ-コントロ-ルも動作済み
ツリ-コントロ-ル動作
リストコントロ-ルにBMPを組み込むには
リストコントロ-ルにBMPを組み込むには沢山の情報を保持する必要が有ります例えば何行目の何カラムか?表示用デバイスコン・ハンドル等々多くの情報が必要になります又ビュ-が頻繁に切り替わる為に現状状態の情報も必要になります、そこで使われる情報のリストである構造体(s_HbitMap)が必要になります。この構造体は各フレ-ムビュ-でコントロ-ルの現状台を絶えず更新して再度このビュ-が表示された時に再現する情報を保持しています。今私が掲示しているアプリケ-ションは本格的なアプリケ-ションの基礎に当たる機能を持ちビュ-切り替えにも十分意識しています、又リり-スバージョンにも問題なく機能します、このリリ-ス版にはデバッガ-が切り離される為に単独で安定的にアプリケ-ションが起動する必要も重要です、この辺の技術が無い場合にはリリ-ス版に移行は出来ずシステムダウンで諦める企業が非常に多いのですこの辺は既に皆さん経験されているのではないでしょうか?
ツリーコントロール(CTreeCtrl)の初期化 VC++プログラミング