sauvgarder les données de CDC sous forme d'une image
Slt les amis. J'ai une probleme et j'espere qui vous m'aidiez a le résolu. ma probleme consiste a sauvgarder les données de contexte graphique sous forme d'une image (Bmp,...). bon si vous n'avez pas une reponse precise j'espere qui vous me donnez le principe et je veut essayer de completer le reste. merci d'avoir m'aider.
aide pour la Classe CImage
slt, je vue ta remarque pour la classe CImage, mais est ce qu'il n'y a pas d'autre methode pour sauvgarder le contenu de CDC sans la classe CImage (bon qqu ma renseigné à la fonction CreateDIBSection mais je ne sais quelle est son utilité).
Et est ce que la migration vers Visual 2005 est diffcile!
merci pour ton aide... :lol:
Merci pour la classe CPicture
La classe CPicture ne permet pas de sauvgardé le contenu de CDC mais seulement le contenu de l'image chargée en avance. Mais J'essayé de trouvé une solution pour ma problème. la solution consiste a déclaré dans Ma CView(CTestSaveView) 4 variables*:
Code:
1 2 3 4 5
|
CRect m_Drawing;
HBITMAP m_Bm;
BYTE *m_BmByte;
BITMAPINFOHEADER m_BMIH; |
Puis dans la fonction membre
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
void CTestSaveView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
// device context for painting
CDC *pDC=GetDC();
// TODO: Add your message handler code here
CTestSaveDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
////////////////////////////////////////////////////////////
GetClientRect(&m_Drawing);
ScreenToClient(&m_Drawing);
if(pDC==NULL)
return ;
InitBMTH();
m_Bm = CreateDIBSection(pDC->GetSafeHdc(), (CONST BITMAPINFO*)&m_BMIH ,DIB_RGB_COLORS, (void**)&m_BmByte, NULL, 0);
if((m_Bm == NULL) || (m_BmByte == NULL))
{
//We could not create the bitmap -- quit
AfxMessageBox("Impossible", MB_OK | MB_ICONSTOP);
PostQuitMessage(0);
}
} |
Vous pouvez ensuite declaré une fonction qui vous nommez Dessin*(Dans cette fonction vous pouvez dessiné tous ce qui vous voulez):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
void CTestSaveView::Dessin()
{
CDC* pDC = GetDC();
if(pDC != NULL)
{
CDC dcMem;
//Create a memory dc and select the drawing surface into it
if(dcMem.CreateCompatibleDC(pDC) == TRUE)
{
HBITMAP hOldBitmap = (HBITMAP)SelectObject(dcMem.GetSafeHdc(), m_Bm);
/////////////////////////////////////////////////////////////////////////////////////
dcMem.FillSolidRect(0, 0, m_Drawing.Width(), m_Drawing.Height(), RGB(255,0,0));
BOOL bResult = BitBlt(pDC->GetSafeHdc(), m_Drawing.left, m_Drawing.top, m_Drawing.Width(), m_Drawing.Height(),
dcMem.GetSafeHdc(), 0, 0, SRCCOPY);
//And deselect the drawing surface
SelectObject(dcMem.GetSafeHdc(), hOldBitmap);
}
ReleaseDC(pDC);
}
} |
Ensuite vous definissez le message CTestSaveView*:: OnFileSave comme suit
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
void CTestSaveView::OnFileSave()
{
// TODO: Add your command handler code here
CFileDialog dlg(FALSE, DEFAULT_BITMAP_FILE_EXTENSION, DEFAULT_BITMAP_FILE_NAME, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"Windows Bitmap Files (*.BMP; *.DIB)|*.BMP; *.DIB||" , NULL);
if(dlg.DoModal() == IDOK)
{
CString szPathName = dlg.GetPathName();
//Create a new file for writing
FILE *pFile = fopen(szPathName, "wb");
if(pFile == NULL)
{
AfxMessageBox("Erreur");
return;
}
BITMAPFILEHEADER bmfh;
int nBitsOffset = sizeof(BITMAPFILEHEADER) + m_BMIH.biSize;
LONG lImageSize = m_BMIH.biSizeImage;
LONG lFileSize = nBitsOffset + lImageSize;
bmfh.bfType = 'B'+('M'<<8);
bmfh.bfOffBits = nBitsOffset;
bmfh.bfSize = lFileSize;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
UINT nWrittenFileHeaderSize = fwrite(&bmfh, 1, sizeof(BITMAPFILEHEADER), pFile);
UINT nWrittenInfoHeaderSize = fwrite(&m_BMIH, 1, sizeof(BITMAPINFOHEADER), pFile);
UINT nWrittenDIBDataSize = fwrite(m_BmByte, 1, lImageSize, pFile);
fclose(pFile);
}
} |
Si vous trouvez autre solution vous pouvez me renseigné (On est la pour apprendre*!)
Pense à mettre la balise de code, Merci Farscape:yaisse2: :yaisse2: :yaisse2: Et Merci Farscape pour ton aide vraiment merci.