Efectuat de studentul
grupei IA21: Ghiderman Ion
Chişinău, 2015
1
Condiția laboratorului:
Salvați imagnea desenată în editorul grafic Adobe Photoshop în formatul .bmp pe 4 bit.
Încărcați imaginea obținută în Microsoft Visual Studio și mutați – o cu ajutorul mouse – lui.
mouse-ul provoacă pe Windows să genereze unul sau mai multe mesaje de evenimente
respective. De exemplu, utilizatorul a executat un click stânga, sau a deplasat cursorul, sau a
Mersul laboratorului:
Indicator Descriere
MK_LBUTTON Arată că este apăsat butonul sting al mouse - lui
MK_RBUTTON Arată că este apăsat butonul drept al mouse - lui
MK_MBUTTON Arată că este apăsat butonul de mijloc al mouse – lui
MK_CONTROL Arată că este apăsată tasta Ctrl
MK_SHIFT Arată că este apăsată tasta Shift
5. După ce executăm programul ținem apăsat pe butonul stîng al mouse – lui și mutăm
imaginea.
2
#include"conio.h"
#include"stdlib.h"
#include"stdio.h"
#include"string.h"
unsignedchar hex[16]={'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char bmp[5]=".bmp";
char txt[5]=".txt";
main()
{
Rezultatul:
3
Listingul GraphLab2View.h:
4
class CGraphLab2View : public CView
{
protected: // create from serialization only
CGraphLab2View();
DECLARE_DYNCREATE(CGraphLab2View)
// Attributes
public:
CGraphLab2Doc* GetDocument() const;
// Operations
public:
// Overrides
public:
virtual void OnDraw(CDC* pDC); // overridden to draw this view
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// Implementation
public:
virtual ~CGraphLab2View();
public:
CPoint m_ptMouse;
public:
CPoint st;
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
public:
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
public:
int da;
public:
int des;
struct BITMAPFILEHEADER
{
char bfType[2];
unsigned int bfSize;
short int bfReserved1;
short int bfReserved2;
unsigned int bfOffBits;
};
struct BITMAPINFOHEADER
{
unsigned int biSize;
unsigned int biWidth;
unsigned int biHeight;
short int biPlanes;
short int biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
unsigned int biXPelsPerMeter;
unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
};
struct PALETA
{
unsigned char B;
5
unsigned char G;
unsigned char R;
unsigned char Z;
};
BITMAPFILEHEADER antet_fis;
BITMAPINFOHEADER antet_img;
unsigned char *p;
unsigned char cul;
unsigned char *pim;
int noct;
PALETA *pal;
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
Listingul GraphLab2View.cpp:
void CGraphLab2View::OnDraw(CDC* pDC)
{
CGraphLab2Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if(des<1){
FILE* f;
FILE* f1;
int NBPP;
f=fopen("G:\\Grafica\\grafika2\\l2_4bit.bmp","rb");
f1=fopen("G:\\Grafica\\grafika2\\l2_4bit.txt","wt");
if ((antet_fis.bfType[0]!='B') || (antet_fis.bfType[1]!='M'))
{
CString mesl(CString("Format not available!"));
AfxMessageBox(mesl);
return;
6
}
fread (&antet_fis.bfSize, sizeof(int),1,f);
fprintf (f1,"\n%d\n",antet_fis.bfSize);
NBPP=antet_img.biBitCount;
if (NBPP!=4)
{
CString mesl(CString("Imaginea nu este pe 4 b/p"));
AfxMessageBox(mesl);
return;
}
int nculori=antet_img.biClrUsed;
if (nculori==0)
nculori=16;
//citim paleta
pal=new PALETA [nculori];
for (int i=0; i<nculori; i++)
{
fread (&(pal[i].B),1,1,f);
fread (&(pal[i].G),1,1,f);
fread (&(pal[i].R),1,1,f);
fread (&(pal[i].Z),1,1,f);
//citim imaginea
fread(pim,noct,antet_img.biHeight,f);
fclose(f);
7
//desenam imaginea
//pru 4 b/p
p=pim+noct*(antet_img.biHeight-1);
fprintf (f1,"culorile: \n");
pDC->
SetPixel(j+m_ptMouse.x,i+m_ptMouse.y,RGB(pal[cul].R,pal[cul].G, pal[cul].B));
fprintf (f1,"%02X",cul);
}
fprintf (f1,"\n");
p-=noct;
}
fprintf (f1,"\n des=%d", des);
fclose (f1);
des++;
}
else
{
p=pim+noct*(antet_img.biHeight-1);
}
ReleaseDC(pDC);
8
if((point.x>=m_ptMouse.x)&&(point.x<=m_ptMouse.x+antet_img.biWidth)&&(point.y
>=m_ptMouse.y)
&&(point.y<=m_ptMouse.y+antet_img.biHeight))
{st=point-m_ptMouse;
da=1;
}
else
da=2;
CView::OnLButtonDown( nFlags, point);
}
Rezultatul final:
Poziția inițială:
9
Poziția după mutare:
Concluzie:
În lucrea dată am folosit o aplicație de tip Dialog Based creată în Microsoft Visual
Studio. În funcția OnDraw am făcut citirea din fișier și înscrierea înapoi a informației despre
imagine: înălțimea, lățimea , numarul de biți, culorile utilizate ș.a.. Apoi am scris funcția care
mută imaginea pe suprafața de lucru cu butoanele necesare.
10