/*
שם הקובץ: ScreenColor.cpp
צייר קו אלכסוני שחור על
על צג המחשב חלקים, חלקים בהפסקות
לכל נקודה שהגעת כתוב את צבעה
בפינה השמלית עליונה של המסך
*/
#include <windows.h>
// הספרייה הזאת מייבאת
// פונקציות חלוניות וקבועים
#include <stdlib.h>
// _sleep לייבא את פונקציית השהיית התוכנית
#include <stdio.h>
// ליבא פונקציות העוסקות בקבצים
#include "mmain.h"
// ליבא קבועים שהוגדרו על ידי התכנת
// שישובצו בתוכנית זאת
HBITMAP hbmMain; //מצביע כדי להגדיר תמונת מפת סיביות
FILE *fopen(),*fp; //מצביעים שיגדירו קבצי מלל
/*
הפונקציה : BdokTseva
תאור :
בדוק בעזרת 3 מרכיבי הצבע
של שתי נקודות שונות האם
הצבעים שווים.
אם ההפרש בין כל מרכיב
של צבע בשני הצבעים קטן ממספר קבוע מסוים
אזי שני הצבעים שווים.
*/
int BdokTseva(int MyRed,int MyGreen ,int MyBlue,
int rColor,int gColor,int bColor )
{
if (( AbsDelta(rColor,MyRed) < Kavua )&&
( AbsDelta(gColor,MyGreen) < Kavua ) &&
( AbsDelta(bColor,MyBlue) < Kavua ) ) return 1;
else
return 0 ;
}
/*
הפונקציה MyPixelColor
תיאור:
מצא את בהירות הנקודה
לשם כך טען את מהמשתנה
MyColorf
שהוא מטיפוס נתונים
COLORREF
בעזרת פונקציית הספרייה
GetPixel
בנתונים על הצבע .
אחר כך תפרק את המספר
שקיבלת כך שתמצא בו
את כמות האדום הכחול והירוק.
MyColorf
מורכב בצורה כזאת :
שתי הספרות הראשונות מכילות את כמות הצבע האדום
שתי הספרות הבאות מכילות כמות הצבע הירוק.
שתי הספרות הבאות מכילות את כמות הצבע הכחול.
שתי הספרות הבאות אומרות לנו אם דגמנו צבע מהחלון
או שמע המיקום שניתן הוא מחוץ לחלון
הערה :
מבנה כזה של צבע מתאים
לגרסאות ישנות של חלונות
מומלץ לשנות את התוכנית
כך שתתאים לגרסת חלונות חדשה.
*/
int MyPixelColor(HDC Myhdc,
int ScreenLocateX,
int ScreenLocateY)
{
COLORREF myColorf;
// (r,g,b)==(אדום,ירוק,כחול)
int r, g, b ,InImeg;
int output;
myColorf = GetPixel(Myhdc, ScreenLocateX ,ScreenLocateY);
r = myColorf & RedMask ;
g = ( myColorf & GreenMask )/DuBites ;
b = ( myColorf & BlueMask )/ QuBites;
InImeg = ( myColorf & InMask )/ SeBites;
Beep(r,r); // צפצף על פי המרכיב האדום של הצבע
Beep(g,g); // צפצף על פי המרכיב הירוק של הצבע÷
Beep(b,b); //צפצף על פי המרכיב הכחול של הצבע
//שמור את מרכיבי הצבע בקובץ טקסט.
fp = fopen(ColorFile,"w");
fprintf(fp," red %3d green %3d blue %3d ",
r, g, b);
if(fp) fclose(fp);
output = gray1 ; //אם לא מצאתי צבע מתאים נחזיר ערך אפור.
if ( InImeg > 0 ) return out1 ; //
//השווה את מרכיבי הצבע
//עם צבעים ידועים
if (BdokTseva(79,240,55,r,g,b)) return green1 ;
if (BdokTseva(27,241,37,r,g,b)) return green1 ;
if (BdokTseva(0,255,255,r,g,b)) return green1 ;
if (BdokTseva(0,255,128,r,g,b)) return green1 ;
if (BdokTseva(46,194,150,r,g,b)) return green1 ;
if (BdokTseva(0,128,128,r,g,b)) return green1 ;
if (BdokTseva(9,81,85,r,g,b)) return gray1 ;
if (BdokTseva(192,192,192,r,g,b)) return gray1 ;
if (BdokTseva(216,216,216,r,g,b)) return gray1 ;
if (BdokTseva(128,128,128,r,g,b)) return gray1 ;
if (BdokTseva(0,0,0,r,g,b)) return black1 ;
if (BdokTseva(31,32,0,r,g,b)) return black1 ;
if (BdokTseva(64,0,64,r,g,b)) return black1 ;
if (BdokTseva(0,0,64,r,g,b)) return black1 ;
if (BdokTseva(255,255,244,r,g,b)) return white1 ;
if (BdokTseva(100,150,230,r,g,b)) return blue1;
if (BdokTseva(166,166,255,r,g,b)) return skyblue1 ;
if (BdokTseva(103,177,233,r,g,b)) return skyblue1 ;
if (BdokTseva(128,0,128,r,g,b)) return violet1 ;
if (BdokTseva(255,0,128,r,g,b)) return violet1 ;
if (BdokTseva(255,255,0,r,g,b)) return yellow1 ;
if (BdokTseva(239,249,51,r,g,b)) return yellow1 ;
if (BdokTseva(255,255,170,r,g,b)) return yellow1 ;
if (BdokTseva(255,0,128,r,g,b)) return bpurple1 ;
if (BdokTseva(128,128,64,r,g,b)) return khaki1 ;
if (BdokTseva(128,128,0,r,g,b)) return brown1 ;
if (BdokTseva(128,0,0,r,g,b)) return brown1 ;
if (BdokTseva(255,128,128,r,g,b)) return pink1;
if (BdokTseva(235,176,152,r,g,b)) return pink1 ;
if (BdokTseva(236,184,64,r,g,b)) return orange1;
if (BdokTseva(255,128,0,r,g,b)) return orange1 ;
if (BdokTseva(164,84,184,r,g,b)) return purple1 ;
if (BdokTseva(90,0,90,r,g,b)) return purple1 ;
if (BdokTseva(90,60,90,r,g,b)) return purple1 ;
return output ;
}
/*הפונקציה : BuildBMP
תיאור
על פי המספר הסידורי של הצבע
הוצא את תמונת מפת הסיביות שמראה את שם הצבע
בנה אותה בפינה השמאלית עליונה של מסך המחשב */
void BuildBMP(HDC hdc,HINSTANCE Hi, int NumbColor )
{
HDC hdcMemory;
HBITMAP hbmMain ;
BITMAP b;
switch (NumbColor)
{
case green1:
hbmMain = LoadBitmap( Hi, "green");
break;
case gray1:
hbmMain = LoadBitmap( Hi, "gray");
break;
case blue1:
hbmMain = LoadBitmap( Hi, "blue");
break;
case black1:
hbmMain = LoadBitmap( Hi, "black");
break;
case red1:
hbmMain = LoadBitmap(Hi, "red");
break;
case white1:
hbmMain = LoadBitmap( Hi, "white");
break;
case skyblue1:
hbmMain = LoadBitmap( Hi, "skyblue");
break;
case violet1:
hbmMain = LoadBitmap( Hi, "violet");
break;
case yellow1:
hbmMain = LoadBitmap( Hi, "yellow");
break;
case bpurple1:
hbmMain = LoadBitmap( Hi, "bpurple");
break;
case khaki1:
hbmMain = LoadBitmap(Hi, "khaki");
break;
case brown1:
hbmMain = LoadBitmap( Hi, "brown");
break;
case pink1:
hbmMain = LoadBitmap( Hi, "pink");
break;
case orange1:
hbmMain = LoadBitmap( Hi, "orange");
break;
case purple1:
hbmMain = LoadBitmap( Hi, "purple");
break;
case out1:
hbmMain = LoadBitmap( Hi, "out");
break;
}
// צור בזיכרון משתנה המתאים לחלק הגרפי של החלון
hdcMemory = CreateCompatibleDC(hdc);
// צור בעזרתו תמונת מפת סיביות מתאימה לחלון
SelectObject(hdcMemory, hbmMain);
GetObject(hdcMemory, sizeof(BITMAP), &b);
// הראה את התמונה עם שם הצבע
// בפינה השמאלית עליונה של שולחן העבודה
BitBlt(hdc,0,0,b.bmHeight,b.bmWidth,
hdcMemory, 0, 0, SRCAND);
BitBlt(hdc,0,0,b.bmHeight,b.bmWidth,
hdcMemory,0,0,SRCPAINT);
// שחרר זיכרון
DeleteDC(hdcMemory);
}
/*
הפונקציה WinMain
הפונקציה הראשית של הפרויקט
תיאור
תפוס את התמונה בחלון שולחן העבודה
כולל כל החלונות הנלווים
נסה לדגום עד 100 נקודות
על האלכסון של החלון
האלכסון המתחיל בפינה
השמאלית עליונה של המסך
צייר קו ישר שחור
בין כל שתי נקודות נדגמות
צור הפסקה של רבע שנייה
בין כל דגימה .*/
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
HWND hwnd;
HDC MyHdc ,hdcWindow;
int Colorr ,mone ,ezer ;
int MyNum;
int WinHeight ,WinWidth;
RECT r;
// מציאת גובה ורוחב של שולחן העבודה
GetWindowRect(HWND_DESKTOP,&r);
WinHeight =r.bottom - r.top;
WinWidth =r.right - r.left;
// יצירת חלון מנוון
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
"MyWindowClass" ,
" זיהוי צבע ",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
WinHeight,WinWidth,
NULL, NULL, hInstance, NULL);
// תפוס את החלק הגרפי של החלון במשתנה
hdcWindow = GetDC(hwnd);
// צור לולאה, צא ממנה אם עברת את מספר
// הנקודות הנדגמות משולחן העבודה
// או אם יצאת משטח שולחן העבודה
for (ezer = 0;
Colorr!=out1 && ezer <NumJumps;
ezer ++)
{
mone = ezer *ScaleJumpWith;
// תפוס את כל החלונות על שולחן העבודה
// כך שיראו כתמונה אחת
MyHdc = GetDCEx(
hwnd,NULL,
DCX_PARENTCLIP|
DCX_EXCLUDERGN);
// תפוס את צבע הנקודה הנדגמת
Colorr = MyPixelColor(MyHdc,mone,mone);
// עצור לרבע שנייה לאפשר למשתמש לראות את הנקודה הנדגמת
_sleep(Second/4);
// צור תמונה עם שם הצבע בפינה השמאלית עליונה של המסך
BuildBMP(hdcWindow,hInstance, Colorr );
// צור קו ישר לכיוון הנקודה הנדגמת
LineTo(MyHdc,mone,mone);
} ;
// שחרר זיכרון
ReleaseDC(hwnd,MyHdc);
ReleaseDC(hwnd,hdcWindow);
// נקה מסך
ChangeDisplaySettingsA(NULL,0);
return 0;
}