תכנות וזיהוי/קובץ פונקציות פלט למשתמש
מראה
הקובץ ImageOut.cpp
[עריכה]/* ImageOut.cpp
הראה בחלון את האות המפוענחת */
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "MyProcs.h"
#include "MyContR.h"
FILE *fopen();
/* שלוף מקובץ את המיספר הסידורי
של האות המפוענחת */
int GetComputerObjectInI()
{int TheSign[1]={-1};
FILE *InpFp;
InpFp=fopen(OutFile,"r");
if(IsFileNotExistInF(InpFp)) return -1;
fscanf(InpFp,"%d",&TheSign[0]);
fclose(InpFp);
return TheSign[0];
}
/* צייר על החלון את המלבן
המכיל את האות שהמשתמש טוען שזה מה
שהוא התכוון לצייר */
void ShowArgueRectInI(HDC Myhdc,int AnElement,
int X1,int Y1,int X2,int Y2)
{RECT ObjectQuad;
ObjectQuad.left = X1;
ObjectQuad.top = Y1;
ObjectQuad.right = X2;
ObjectQuad.bottom = Y2;
if (AnElement<RecComps)
{ ObjectQuad=VectLocationInL(
AnElement,
ObjectQuad);
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// הראה שמחפשים את וקטור המכסימום
// בין הוקטורים היורדים מלמעלה
if (AnElement == RecComps)
{ ObjectQuad.left = X1+ AbsDelta(X1,X2)/3;
ObjectQuad.top = Y1;
ObjectQuad.right = ObjectQuad.left ;
ObjectQuad.bottom = Y2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ AbsDelta(X1,X2)/2;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
// הדגש ע"י שני
//חצים קרובים את חיפוש המכסימום
ObjectQuad.left = X1+ AbsDelta(X1,X2)/2 +1;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ (2*AbsDelta(X1,X2))/3 ;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
}// מכסימום משמאל לימיו
if (AnElement == RecComps+1)
{ ObjectQuad.left = X1;
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/3;
ObjectQuad.right = X2 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/2;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/2 +1;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ (2*AbsDelta(Y1,Y2))/3 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// בין הוקטורים היורדים מלמעלה
if (AnElement == RecComps+2)
{ ObjectQuad.left = X1+ AbsDelta(X1,X2)/3;
ObjectQuad.top = Y1;
ObjectQuad.right = ObjectQuad.left ;
ObjectQuad.bottom = Y2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ AbsDelta(X1,X2)/2;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ (2*AbsDelta(X1,X2))/3 ;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
}// ממוצע ציון לוקטורים
// משמאל לימין
if (AnElement == RecComps+3)
{ ObjectQuad.left = X1;
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/3;
ObjectQuad.right = X2 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/2;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ (2*AbsDelta(Y1,Y2))/3 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// בין הוקטורים היורדים מלמעלה
// בחצי השמאלי של האות
if (AnElement == RecComps+4)
{ ObjectQuad.left = X1+ AbsDelta(X1,X2)/6;
ObjectQuad.top = Y1;
ObjectQuad.right = ObjectQuad.left ;
ObjectQuad.bottom = Y2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ AbsDelta(X1,X2)/4;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ (2*AbsDelta(X1,X2))/6 ;
ObjectQuad.right = ObjectQuad.left ;
DrawAimFrameInL(Myhdc,ObjectQuad);
}// ממוצע ציון לוקטורים
// משמאל לימין
// בחצי השמאלי של האות
if (AnElement == RecComps+5)
{ ObjectQuad.left = X1;
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/6;
ObjectQuad.right = X2 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/4;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ (2*AbsDelta(Y1,Y2))/6 ;
ObjectQuad.bottom = ObjectQuad.top;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// הנעים באלכסון משמאל למעלה
// עד לימין למטה
// בחצי העליון של האות
if (AnElement == RecComps+6)
{ ObjectQuad.left = X1+ AbsDelta(X1,X2)/8;
ObjectQuad.top = Y1;
ObjectQuad.right = X2 ;
ObjectQuad.bottom = Y1+(7*AbsDelta(Y1,Y2))/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ AbsDelta(X1,X2)/2;
ObjectQuad.bottom = Y1+ AbsDelta(Y1,Y2)/2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+(7*AbsDelta(X1,X2))/8;
ObjectQuad.bottom = Y1+ AbsDelta(Y1,Y2)/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// הנעים באלכסון משמאל למעלה
// עד לימין למטה
// בחצי התחתון של האות
if (AnElement == RecComps+7)
{ ObjectQuad.left = X1;
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/8;
ObjectQuad.right = X1+(7*AbsDelta(X1,X2))/8;
ObjectQuad.bottom = Y2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/2;
ObjectQuad.right = X1+ AbsDelta(X1,X2)/2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+(7*AbsDelta(Y1,Y2))/8;
ObjectQuad.right = X1+ AbsDelta(X1,X2)/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// הנעים באלכסון מימין למעלה
// עד לשמאל למטה
// בחצי העליון של האות
if (AnElement == RecComps+8)
{ ObjectQuad.left = X1+(7*AbsDelta(X1,X2))/8 ;
ObjectQuad.top = Y1;
ObjectQuad.right = X1 ;
ObjectQuad.bottom = Y1+(7*AbsDelta(Y1,Y2))/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+ AbsDelta(X1,X2)/2;
ObjectQuad.bottom = Y1+ AbsDelta(Y1,Y2)/2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.left = X1+AbsDelta(X1,X2)/8;
ObjectQuad.bottom = Y1+AbsDelta(Y1,Y2)/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
// ממוצע ציון לוקטורים
// הנעים באלכסון מימין למעלה
// עד לשמאל למטה
// בחצי התחתון של האות
if (AnElement == RecComps+9)
{ObjectQuad.left = X2;
ObjectQuad.top = Y1+AbsDelta(Y1,Y2)/8;
ObjectQuad.right = X1+AbsDelta(X1,X2)/8 ;
ObjectQuad.bottom = Y2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+ AbsDelta(Y1,Y2)/2;
ObjectQuad.right = X1+ AbsDelta(X1,X2)/2;
DrawAimFrameInL(Myhdc,ObjectQuad);
ObjectQuad.top = Y1+(7*AbsDelta(Y1,Y2))/8;
ObjectQuad.right = X1+(7*AbsDelta(X1,X2))/8;
DrawAimFrameInL(Myhdc,ObjectQuad);
}
}
/* הפוך את צבע החלון
לדוגמה משחור ללבן */
void InvertColorInI(HWND hwnd)
{RECT *rect;
HDC hdc=GetDC(hwnd);
rect = new RECT;
GetWindowRect(hwnd,rect);
BitBlt(hdc,0,0,
rect->right,
rect->bottom,
hdc,0,0,PATINVERT);
/* עדכן את החלק הגרפי של החלון */
InvalidateRect(hwnd,rect,FALSE);
UpdateWindow(hwnd);
/* שחרר את החלק הגרפי של החלון */
ReleaseDC(hwnd, hdc);
}
/* הראה בחלון מלבן המכיל את האות שהמחשב חושב
שזה מה שהמשתמש התכוון לצייר
מעל אותה אות הראה את ההסתברות
שהמחשב צודק
מתחת לאות הראה מלבן שהמשתמש טוען
שזה מה שהוא התכוון לצייר
ומתחת לשני המלבנים
הראה את המלבן שמכיל את האות שהמשתמש צייר*/
HBITMAP VisualArgumentInI(
HWND TheWin,
bool IsUserClaimed,
int UserSerialNum,
int TheElement)
{int X1,X2,Y1,Y2,YOnWindow;
int UserY1;
int TheSign[1],TheProb[1];
char CompuText[50];
FILE *InpFp;
HDC DeskHDC, hdcWin, hdcMem;
HBITMAP hbmOut, outHB, hbmSketch;
BITMAP bm;
HGDIOBJ hPen;
hdcWin = GetDC(TheWin);
hdcMem = CreateCompatibleDC(hdcWin);
/* שלוף את מספר הסידורי של פענוח האות
ואת ההסתברות מקובץ */
InpFp=fopen(OutFile,"r");
if (!IsFileNotExistInF(InpFp))
fscanf(InpFp,"%5d%5d", // עיגול ההסתברות ממספר ממשי
// למספר שלם
&TheSign[0],&TheProb[0]);
fclose(InpFp);
wsprintf(CompuText,
"%4d/100 המחשב חושב שזה %4d בהסתברות של",
// Y/100 המחשב טוען שזה משהוא בהסתברות של
TheProb[0],TheSign[0]+1);
X1 =int(DataRecs[0]);
X2 =int(DataRecs[2]);
Y1 =int(DataRecs[1]+
float(TheSign[0])*
(DataRecs[5]+DataRecs[3]));
/* אם המשתמש נתן את המספר הסידורי
של האות שהוא חושב שזה מה שהוא צייר */
if (IsUserClaimed)
UserY1=int(DataRecs[1] +
/* החל לספור מ - 0 לא מ - 1 */
float(UserSerialNum-1)*
(DataRecs[5]+DataRecs[3]));
Y2 =int(DataRecs[3]);
/* טען בזיכרון את תמונת המופעים */
hbmOut=LoadBMPFileInF(BmpRectsFile);
/* טען בזיכרון את ציור המשתמש */
hbmSketch=LoadBMPFileInF(SaveBMF);
GetObject(hbmSketch,sizeof(bm),&bm);
/* צור בזכרון מקון עבודה זמני
ליצירת תמונה משלוש תמונות */
DeskHDC = CreateCompatibleDC(hdcWin);
outHB = CreateCompatibleBitmap(
hdcWin,
GetWinWidthInL(TheWin),
GetWinWidthInL(TheWin)+ bm.bmHeight);
SelectObject(DeskHDC, outHB);
WhitenDCInL(NULL, outHB, DeskHDC);
/* התחל לעבוד - צור צבע צהוב לשרטוט מסגרות */
LOGPEN logpen = { PS_SOLID, { 0, 0 }, MyYellow };
hPen=SelectObject(DeskHDC,HGDIOBJ(
//CreatePen(PS_SOLID,1,MyYellow)));
CreatePenIndirect(&logpen))); // for WinXp
/* תשובת המחשב */
YOnWindow=int(DataRecs[1]+
float(1)* /* הדפס את העצם במקום השני */
(DataRecs[5]+DataRecs[3]));
/* כתוב שורה הקובעת את ההסתברות
מעל האוביקט הראשון */
TextOut(DeskHDC,0,YOnWindow-(Y2/2)-9,
CompuText,40);
SelectObject(hdcMem,hbmOut);
BitBlt(DeskHDC,0,YOnWindow,
X2,Y2,hdcMem,X1,Y1,SRCCOPY);
/* אם המשתמש בחר מרכיב תכונה
נניח כי הוא רוצה לראות
איזה מרכיב גרם לטעות בפיענוח
הראה אותה על העצמים
כמלבן צהוב
או כוקטור אם התכונה
היא מספר החיתוכים
לאורך מסלול */
if (TheElement != -1)
{ ShowArgueRectInI(DeskHDC,TheElement,
0,YOnWindow,
0+X2,YOnWindow+Y2);
}
/* העצם על פי טענת המשתמש */
if (IsUserClaimed)
{ YOnWindow=int(DataRecs[1]+
float(3)* /* רד למטה 4 יחידות */
(DataRecs[5]+DataRecs[3]));
TextOut(DeskHDC,0,YOnWindow-(Y2/2),
"אתה טוען",8);
BitBlt(DeskHDC,0,YOnWindow,
X2,Y2,hdcMem,X1,UserY1,SRCCOPY);
if (TheElement != -1)
ShowArgueRectInI(DeskHDC,TheElement,
0,YOnWindow,X2,YOnWindow+Y2);
}
/* השרטוט של המשתמש */
YOnWindow=int(DataRecs[1]+
float(5)* /* רד למטה שש יחידות */
(DataRecs[5]+DataRecs[3]));
TextOut(DeskHDC,0,YOnWindow-(Y2/2),
"השרטוט שלך",10);
SelectObject(hdcMem,hbmSketch);
StretchBlt( DeskHDC,0,YOnWindow,100, 100,
hdcMem ,0,0,bm.bmWidth,bm.bmHeight,
SRCCOPY); /* התאם לגודל */
/* הפסק למתוח זה מפריע לצייר מסגרת */
SetStretchBltMode(DeskHDC,STRETCH_DELETESCANS);
if (TheElement != -1)
ShowArgueRectInI(DeskHDC,TheElement,
0,YOnWindow,100, YOnWindow+100);
/* נקה זכרון */
DeleteDC(DeskHDC);
DeleteDC(hdcMem);
DeleteObject(hbmSketch);
DeleteObject(hbmOut);
DeleteObject(SelectObject(DeskHDC,hPen));
ReleaseDC(TheWin, hdcWin);
/* החזר את המבנה המכיל תמונה המכילה
את שלושת התמונות */
return outHB;
}
/* מצא את האות הקשורה לעצם */
char GetSerialInI(int TheN)
{char Out = ' ';
FILE *ReferF;
int IntF[1],LineN;
char CharF[1];
ReferF = fopen("Refer.txt","r");
if (! ReferF)return Out;
for(LineN=0;
fscanf(ReferF,"%d %c",
&IntF[0],&CharF[0])!= EOF;
LineN++)
if (TheN ==IntF[0])
{Out = CharF[0]; break; }
fclose(ReferF);
return Out;
}
/* הראה את העצמים ללא המופעים
כשלכל עצם מספר סידורי
לאפשר למשתמש מקרא
על העצמים */
HBITMAP ShowSerialInI(HWND TheWin,
int The_Elements)
{int X1,X2,Y1,Y2,ImageDeltax;
int Y1catch,MyMone=0,PicRow;
char s[3]=" ",d[3]=" ";
/* מצביעים על החלק הגרפי של החלון */
HDC hdcWin, hdcMem, DeskHDC;
/* מצביעים לעבודה עם תמונת מפת סיביות */
HBITMAP hbmOut, outHB ;
/* הכן נתונים */
hdcWin = GetDC(TheWin);
hbmOut=LoadBMPFileInF(BmpRectsFile);
DeskHDC = CreateCompatibleDC(hdcWin);
outHB = CreateCompatibleBitmap(
hdcWin, PicW,
GetWinHeightInL(TheWin) *
//נניח 10 עצמים לאורך החלון
The_Elements /10);
SelectObject(DeskHDC, outHB); /* קשר */
WhitenDCInL(NULL, outHB, DeskHDC); /* הלבן רקע */
hdcMem=CreateCompatibleDC(hdcWin);
SelectObject(hdcMem, hbmOut);
X1 =int(DataRecs[0]);
X2 =int(DataRecs[2]);
Y2 =int(DataRecs[3]);
ImageDeltax = X2 + int(DataRecs[4]);
for(PicRow=0;
MyMone < The_Elements;
PicRow++)
{
Y1catch = int(DataRecs[1] +
float(MyMone)*
(DataRecs[5]+ DataRecs[3]));
Y1 = int(DataRecs[1]+
float(PicRow)*
(DataRecs[5]+ DataRecs[3]));
MyMone++;
/* הפוך מספר לתו כך שיוכלו לראותו
במסך הגרפי */
// wsprintf(s,"%2d %2c ",MyMone ,
// GetSerialInI(MyMone));
wsprintf(d,"%2d",MyMone);
wsprintf(s,"%2c",GetSerialInI(MyMone));
BitBlt(DeskHDC,0,
Y1,X2,Y2,
hdcMem,X1,Y1catch,SRCCOPY);
/* רשום את האות המתאימה לעצם */
TextOut(DeskHDC,X1+30,Y1+3,s,3);
/* רשום מספר סידורי */
TextOut(DeskHDC,X1+50,Y1+3,d,3);
}
/* נקה - שחרר זכרון */
DeleteDC (DeskHDC);
DeleteDC (hdcMem);
ReleaseDC(TheWin, hdcWin);
DeleteObject(hbmOut);
/* החזר מבנה עם כל העצמים
אורכו יכול להיות יותר מהמסך
לשם כך אפשר לגלול
את התמונה שבמבנה
בעזרת פסי הגלילה */
return outHB;
}
/* הוסף ורינט לתמונת האוביקטים */
HBITMAP AddVar2PicInI(HWND hwnd, /* החלון */
int NumElements,/* 0=>1 מספר אוביקטים */
int ObjectNumbe /* האוביקט המתעדכן */
)
{ RECT rc ; /* מיקום השינוי */
int X, Y,X2,Y2,X3,Y3,Mone;
SIZE RateOfX, RateOfY;
/* מספר האוביקטים שהיו בעדכון הקודם */
int ObjecNum[1];
int EndObjects; /* מספר האוביקטים לאחר החישוב */
int *UpdateFrom;
FILE *InpFp;/* קובץ רשימת העידכונים הקודמת */
HDC hdcWin, DeskHDC,PicHDC;
HBITMAP outHB,hbmSketch;
/* הכן נתונים */
hdcWin = GetDC(hwnd);
/* טען בזיכרון את תמונת המופעים */
outHB = LoadBMPFileInF(BmpRectsFile);
X = BmWidthInL( outHB);
Y = BmHeightInL( outHB);
/* צור מקום עבודה זמני בזיכרון */
DeskHDC = CreateCompatibleDC(hdcWin);
SelectObject(DeskHDC, outHB); /* קשר */
/* טען בזיכרון את ציור המשתמש */
hbmSketch=LoadBMPFileInF(SaveBMF);
X2 = BmWidthInL(hbmSketch);
Y2 = BmHeightInL(hbmSketch);
PicHDC = CreateCompatibleDC(hdcWin);
SelectObject(PicHDC, hbmSketch); /* קשר */
/* שלוף את רשימת העידכון */
InpFp=fopen(VarsAdd,"r");
if (InpFp)
{fscanf(InpFp,"%5d",&ObjecNum[0]);
if (ObjecNum[0] >= NumElements )
EndObjects = ObjecNum[0];
else EndObjects= NumElements;
UpdateFrom = new int[EndObjects];
for(Mone=0;Mone<EndObjects;Mone++)
UpdateFrom[Mone] = 0;
for(Mone=0;
Mone<ObjecNum[0]||Mone<NumElements;
Mone++)
fscanf(InpFp,"%5d",&UpdateFrom[Mone]);
if (UpdateFrom[ObjectNumbe] >= NumVariants)
UpdateFrom[ObjectNumbe] = 1;
else UpdateFrom[ObjectNumbe]+=1;
fclose(InpFp);
}
else
{ EndObjects= NumElements;
UpdateFrom = new int[EndObjects];
for(Mone=0;Mone<EndObjects;Mone++)
UpdateFrom[Mone] = 0;
UpdateFrom[ObjectNumbe] = 1;
}
InpFp=fopen(VarsAdd,"w");
fprintf(InpFp,"%5d \n",EndObjects);
for(Mone=0;Mone<EndObjects;Mone++)
fprintf(InpFp,"%5d",UpdateFrom[Mone]);
fclose(InpFp);
/* מצא את מיקום ההדבקה */
rc = PicLocationInL(
UpdateFrom[ObjectNumbe]-1, ObjectNumbe);
/* רתק את העכבר והראה שהמחשב עסוק */
SetCapture(NULL);
SetCursor(LoadCursor(NULL,IDC_WAIT));
RateOfX.cx = X2;
RateOfY.cx = Y2;
RateOfX.cy = X3= rc.right - rc.left;
RateOfY.cy = Y3= rc.bottom - rc.top;
SelectObject(PicHDC,
MyStretchInI(hwnd,PicHDC,RateOfX,RateOfY ));
BitBlt(DeskHDC,rc.left,rc.top,
X3,Y3,PicHDC,0,0,SRCCOPY);
Win2HBFileInF(DeskHDC,X,Y,BmpRectsFile);
/* נקה */
delete [] UpdateFrom;/* נקה את מערך המצביעים */
DeleteObject(hbmSketch);
DeleteDC(DeskHDC);
DeleteDC(PicHDC);
ReleaseDC(hwnd, hdcWin);
ReleaseCapture(); /* שחרר את העכבר */
/* החזר את העיקר */
return outHB;
}
/* הוסף וריאנט לכל שורת המופעים של האוביקט */
HBITMAP AddVarsLineInI(HWND hwnd, /* החלון */
int NumElements,/* 0=>1 מספר אוביקטים */
int ObjectNumbe /* האוביקט המתעדכן */
)
{ RECT rc ; /* מיקום השינוי */
int X, Y,X2,Y2,X3,Y3,Mone;
SIZE RateOfX, RateOfY;
HDC hdcWin, DeskHDC,PicHDC;
HBITMAP outHB,hbmSketch;
/* הכן נתונים */
hdcWin = GetDC(hwnd);
/* טען בזיכרון את תמונת המופעים */
outHB = LoadBMPFileInF(BmpRectsFile);
X = BmWidthInL( outHB);
Y = BmHeightInL( outHB);
/* צור מקום עבודה זמני בזיכרון */
DeskHDC = CreateCompatibleDC(hdcWin);
SelectObject(DeskHDC, outHB); /* קשר */
/* טען בזיכרון את ציור המשתמש */
hbmSketch=LoadBMPFileInF(SaveBMF);
X2 = BmWidthInL(hbmSketch);
Y2 = BmHeightInL(hbmSketch);
PicHDC = CreateCompatibleDC(hdcWin);
SelectObject(PicHDC, hbmSketch); /* קשר */
/* רתק את העכבר והראה שהמחשב עסוק */
SetCapture(NULL);
SetCursor(LoadCursor(NULL,IDC_WAIT));
//מצא גודל ראשוני
rc = PicLocationInL(0 , ObjectNumbe);
RateOfX.cx = X2;
RateOfY.cx = Y2;
RateOfX.cy = X3= rc.right - rc.left;
RateOfY.cy = Y3= rc.bottom - rc.top;
SelectObject(PicHDC,
MyStretchInI(hwnd,PicHDC,RateOfX,RateOfY ));
for(Mone=0;Mone<NumElements+1; Mone++)
{ /* מצא את מיקום ההדבקה */
rc = PicLocationInL(Mone , ObjectNumbe);
BitBlt(DeskHDC,rc.left,rc.top,
X3,Y3,PicHDC,0,0,SRCCOPY);
}
Win2HBFileInF(DeskHDC,X,Y,BmpRectsFile);
/* נקה */
DeleteObject(hbmSketch);
DeleteDC(DeskHDC);
DeleteDC(PicHDC);
ReleaseDC(hwnd, hdcWin);
ReleaseCapture(); /* שחרר את העכבר */
/* החזר את העיקר */
return outHB;
}
/* תפיסת תוכן גרפי של חלון אחר
אלגוריתם מתורגם ממיקרוסופט לכן לא כתבתי את תוכן
הפונקציה */
HBITMAP CaptureOneWindowInI(HWND hwnd,HWND hwnd2)
{HBITMAP outHB;
RECT *rect;
rect = new RECT;
int ClassTextLength=0,TitleTextLength=0;
char TheClassName[100],TheTitle[100],TextIn[100];
HWND TheWin;
POINT ThePoint;
MessageBox(NULL,
" בשתי השניות הבאות
,אחרי סגירת חלון ההודעה הזאת
הזז את הסמן למקום כלשהוא
.באחד החלונות הנמצאים על המרקע
כדי לראות חלנות אחרים
אפשר להקטין את החלון הראשי
בלחיצה על הכפתור השני
.בפינתו הימנית העליונה
",
"...התכונן",0);
Sleep(2000);
/* עדכן את החלק הגרפי של החלון
כמו בדוגמא המובאת באתר של מיקרוסופטט
DRAGBMP */
return outHB;
}
/* הפונקציה מותחת תמונה
או מכווצת את התמונה
בלי לעשות ממוצעים ולרכך
.את השינויים בגוון
:הפונקציה מקבלת את
WinBase מאפיני החלון בו ידביקו את התמונה במשתנה
InHdc התמונה כחלק הגרפי של חלון במשתנה
RateX.cx רוחב התמונה המקורית במשתנה
RateY.cx ואת אורך התמונה המקורית במשתנה
RateX.cy את הרוחב הרצוי במשתנה
RateY.cy את האורך הרצוי במשתנה
:הפונקציה מחזירה את
MyOutHB התמונה כמצביע למפת סיביות במשתנה
:הערות
אומנם אפשר למתוח תמונה
:על ידי הדוגמא מפונקציות הספריה
StretchBlt( DeskHDC,0,0,PicW, PicL,
TheHdc ,X1,Y1,ImageW ,ImageL,
SRCCOPY); התאם לגודל יצוגי
SetStretchBltMode(DeskHDC,STRETCH_DELETESCANS);
אבל זה פועל רק בשחור לבן
אם שולפים קובץ ומותחים אותו מייד
המתיחה פועלת גם בצבעוני אבל זו מתיחה
:המרככת את הצבע כמו בדוגמא
BmpS->Image=(HBITMAP)LoadImage(NULL,
SaveBMF,IMAGE_BITMAP,
BmpS->Width,BmpS->Height,
LR_LOADFROMFILE );
*/
HBITMAP MyStretchInI(HWND WinBase,HDC InHdc,
SIZE RateX,SIZE RateY )
{
COLORREF ColoRef;
int MoneX,MoneY;
HBITMAP MyOutHB;
int fx,fy;
float Xtimes ,Ytimes ;
/* (r,g,b) ==(אדום ירוק כחול) */
int r,g,b,bufsize;
if ( RateX.cx <= 0 || RateY.cx <= 0 ||
RateX.cy <= 0 || RateY.cy <= 0 )
{MessageBox(NULL,
" ערכי יחס משונים בניסיון מתיחת תמונה ",
"...בעיה",0);
return MyOutHB;
}
long* MyNewSize;
MyNewSize = new long;
bufsize = RateX.cy*RateY.cy*BytesPerColor;
BYTE* thebuf = new BYTE[bufsize];
// מציאת היחס במתיחת רוחב
Xtimes = float(RateX.cy) /float (RateX.cx) ;
// מציאת היחס במתיחת אורך
Ytimes = float(RateY.cy) / float(RateY.cx) ;
for(MoneY=0 ;MoneY<RateY.cy;MoneY++)
for(MoneX=0;MoneX<RateX.cy;MoneX++)
{fx = int(float(MoneX)/Xtimes) ;
fy = int(float(MoneY)/Ytimes) ;
ColoRef=GetPixel(InHdc,fx,fy);
r = ColoRef & RedMask ;
g = (ColoRef & GreenMask)/(DuBites+1);
b = (ColoRef & BlueMask) /(QuBites+1);
thebuf[BytesPerColor*(MoneY*RateX.cy+MoneX)+0]=r;
thebuf[BytesPerColor*(MoneY*RateX.cy+MoneX)+1]=g;
thebuf[BytesPerColor*(MoneY*RateX.cy+MoneX)+2]=b;
}
BYTE* NeWBuffer =RGB2BMPBufferInF(thebuf,
RateX.cy, RateY.cy ,MyNewSize );
SaveBMPfileInF(NeWBuffer, RateX.cy, RateY.cy,
*MyNewSize, SaveBMF );
MyOutHB = LoadBMPFileInF(SaveBMF);
delete [] thebuf ;
delete [] NeWBuffer ;
delete MyNewSize ;
return MyOutHB;
}