תכנות וזיהוי/אינטגרציה של התוכנה
גלילה והזזה
[עריכה]כדי לראות ברור תמונות של סימנים ואותיות של שפה שלמה, ולכל אות או סימן שורה של מופעים ,
כנראה חייבת להיות אפשרות לגלילת המסך.
דוגמה לתוכנית לגלילת מסך (המכילה קבצי מקור )יש באתר של פבריס פופיניו ( Fabrice Popineau ) :
tagenDC.org/texlive/devsrc/Bulid/source/ texk/web2/window/win32.c
שם יש שימוש בפסי גלילה בחלון, לשם גלילת מסך.
משום שרצוי שלתוכנה יהיו כמה שיותר אפשרויות גרפיות כמו לצייר החלוני ,
ראוי שבתוכנה יוכלו לגרור באופן חלק תמונה על תמונת החלון הראשי.
לשם הזזה חלקה של תמונת מפת סיביות על תמונת הרקע בחלון ישנה הדוגמה DRAGBMP
( Bitmap Dragging Sample )של פטריק שריבר ( Patric Schreiber) מחברת מיקרוסופט,
גם לדוגמה הזו מצורפים באתר קבצי מקור . שתי התוכניות לא עבדו ביחד .
פתירת הבעיה
[עריכה]בתוכנה תורגמה התוכנית לגלילת מסך, ופעולתה נוטרלה , ובמקום לגלול בעזרתה את תמונת הרקע של החלון ,כל פעם שהמשתמש
גורר את פס הגלילה , התוכנית מחשבת כמה מהחלון צריך להיגלל , וצובעת את כל הרקע בתמונת מפת הסיביות החדשה .
נטרול הגלילה מאפשר לעשות דברים נוספים עם פסי הגלילה : להרחיב ולכווץ ולהזיז תמונה שנוספה מעל תמונת הרקע .
בחירה מתוך רשימת התכונות
[עריכה]התוכנה מזהה עצם על פי תכונות . כאשר נוצר זיהוי מוטעה ראוי שהמשתמש יוכל לבדוק ממה נוצר הזיהוי המוטעה.
המשתמש יכול לדעת על פי אילו תכונות העצם זוהה (בדוח ויכוח) ,
ואחר כך לבחור תכונות מִרְשימה , ולשחזר את הזיהוי המוטעה של המחשב.
כך נראה חלק של דוח ויכוח עבור תכונה מספר 11 :
המחשב טוען שזה עצם מספר 2 <-> המשתמש טוען עצם מספר 3
המרכיב 11 מבדיל בין שני העצמים : של המחשב 2 ושלך 3 .
הציון למרכיב 11 בעצם שנבחר על ידי המחשב : 5 ובעצם שאתה בחרת : 3 ובפענוח הציור : 3
בחירה מִרְשימה
[עריכה]דוגמה ליצירת רשימה (List Box) בתוך חלון, יש באתר ( WINPROG ( The Forger בפרק : Standard Controls: Button,Edit,List Box .
שם נרמז שיש אפשרות לבחירה פשוטה של עצם מתוך רשימה על ידי הדגל LB_GETCURSEL בפונקציה SendMessege .
זה לא הולך פשוט:
- מה פתאום צריך להתחיל את הרשימה מהמספר 2 ?
- כשנבחר אלמנט מהרשימה אפשר לדעת את מספרו היחסי ולא את תוכנו, למה ?!
לכן התוכנה יוצרת רשימה משלה בקובץ, רשימה המסודרת באותו סדר כמו בחלון , ושולפת מהקובץ את תוכן התכונה .
קוד מקור לבחירה מרשימה
[עריכה]// MyContR.h קובץ
// קבועים ליצירת תפריט וחלון דושיח
// מתוכו נבחרו הקבועים המגדירים
// פקדים היוצרים את הרשימה וכפתוריה וכותרותיה
....
#define IDC_ATT_LIST 1005
#define IDC_SELECTION_TITLE 1006
#define IDC_SELECTED 1007
#define IDC_SHOW_COMP 1008
...
// Rsrc4.rc קובץ
// . מתוכו נבחר מבנה הרשימה וכפתורי העזר לטיפול ברשימה
// GROUPBOX בשורה הבאה מוגדר מלבן שחור המקיף את הפקדים הבאים ע"י ההגדרה
// . וגורם למשתמש לראות אותם כקבוצה אחת
// 1,2,69,105 מיקום המלבן מוגדר על ידי ארבעת המספרים
// 1,2 זוג המספרים
//. מגדיר את מיקום הפינה השמאלית עליונה של המלבן ביחס לחלון הפקדים
// 69,105 זוג המספרים
//. קובע את הרוחב והאורך של המלבן
GROUPBOX "מרכיבי התכונות",IDC_STATIC,1,2,69,105
// בשתי השורות הבאות מוגדרת כותרת האומרת כמה תכונות יש ברשימה
// . בהתחלה (בררת מחדל) אין מרכיבים (תכונות)
// , אבל בהמשך התוכנה סופרת כמה תכונות יש ברשימה
// LTEXT הופכת את המספר למשתנה מסוג טקסט חלוני
// 15,12,30,8 וכותבת בחלון הפקדים במיקום
//. את מספר התכונות ברשימה
LTEXT "מרכיבים",IDC_STATIC,15,12,30,8
CTEXT "אין",IDC_ATTCOUNT,45,12,20,8
// בשורה הבאה מוגדר מבנה מקום לרשימה בחלון הפקדים
// WS_VSCROLL שמכיל פס גלילה LISTBOX
LISTBOX IDC_ATT_LIST,20,25,40,60,
WS_VSCROLL | WS_TABSTOP
CTEXT " בחר",IDC_SELECTION_TITLE,10,78,50,8
// . בשורה הבאה מוגדר מקום להקלדת מספר
// ES_NUMBER מקום להקלדה שאפשר להקליד בו רק מספרים שלמים: EDITTEXT
// באותו מקום המחשב טוען את מספר התכונה
//. שנבחרה ע"י המשתמש
EDITTEXT IDC_SELECTED,40,88,25,14 ,ES_NUMBER
// בשורה הבאה מוגדר כפתור , שהמשתמש לוחץ עליו כשהוא רוצה לראות
// . איך התכונה נראת על כל מופעי האותיות
PUSHBUTTON "הראה",IDC_SHOW_COMP,10,88,25,14
// AtDialog.cpp קובץ
// שימוש ברשימה וכפתורי העזר
...
case WM_INITDIALOG:/* בזמן אתחול חלון הדושיח */
/* קרא את קובץ מספרי מרכיבי התכונות
וטען כרשימה בחלון הדושיח*/
fAttri = fopen(ElementsInSerial,"r");
if(IsFileNotExistInF(fAttri)) break;
fscanf(fAttri,"%d",&count[0]);
intbuf = new int[count[0]];
for(buflocate=0;buflocate<count[0];buflocate++)
fscanf(fAttri,"%d",&intbuf[buflocate]);
fclose(fAttri);
for(buflocate=0;
buflocate<count[0];
buflocate++)
{wsprintf(strbuf,"%d",intbuf[buflocate]);
/* שבץ בדלגלג את מספרי מרכיבי התכונות שנבחרו */
SendDlgItemMessage(hwnd,IDC_ATT_LIST,
LB_ADDSTRING,0,long(strbuf));
}
delete [] intbuf;/* נקה את הזיכרון */
...
case IDC_ATT_LIST: /* נבדוק מה נבחר מהרשימה */
{ case LBN_SELCHANGE: /* היה שינוי - המשתמש בחר משהוא */
hListNew=GetDlgItem(hwnd,IDC_ATT_LIST);
index=SendMessage(hListNew,LB_GETCURSEL,0,0);
fAttri = fopen(ElementsInSerial,"r");
if(IsFileNotExistInF(fAttri)) break;
for(buflocate=0;
/* אנני יודע למה צריך להתחיל מ - 2 ברשימה */
buflocate<index+2;
buflocate++)
fscanf(fAttri,"%d",&count[0]);
fclose(fAttri);
SetDlgItemInt(hwnd,IDC_SELECTED,count[0],FALSE);
SetDlgItemText(hwnd,
IDC_SELECTION_TITLE," נבחר");
MyComponent=count[0];
break;
}
case IDC_LETTERS_LIST :/* אות נבחרה מרשימה */
/* היה שינוי - המשתמש בחר משהוא */
if( LBN_SELCHANGE)
{LPSTR ThePoCH ;
hListNew=GetDlgItem(hwnd,IDC_LETTERS_LIST);
index=SendMessage(hListNew,LB_GETCURSEL,0,0);
ThePoCH = new CHAR;
wsprintf(ThePoCH,"%c",char(index+33));
SetDlgItemText(hwnd,IDC_THE_CHAR,ThePoCH);
SetDlgItemText(hwnd,
IDC_A_CHAR_SELECTED,"נבחר");
break;
}
break;
.......
case IDC_SHOW_COMP: /* בחירת מרכיב התכונה על ידי המשתמש */
if (IsDialogEmptyInD(IDC_SELECTED))/* בדוק אם לא בחר */
{ SetFocus(
GetDlgItem(g_hToolbar,
IDC_SELECTED));
SetDlgItemText(hwnd,
IDC_SELECTION_TITLE,"הקלד מספר");
break;
}
MyComponent=GetDlgItemInt(
hwnd,IDC_SELECTED,
NULL,FALSE);
/* ?האם בחר מספר גדול מידי */
if (MyComponent > AllComps -1)
{ SetFocus(
GetDlgItem(g_hToolbar,IDC_SELECTED));
SetDlgItemText(hwnd,
IDC_SELECTION_TITLE,"קטן יותר");
break;
}
SetDlgItemText(hwnd,
IDC_SELECTION_TITLE,
"בוצעה בחירה");
*ShowWhat=AComponent;
ShowWindow(hwnd,SW_HIDE);
/* הראה את האותיות יחד עם מקום התכונה */
LoadTheImageInD(MainPaintInL(
hwndShow,MyComponent,ShowWhat,
GetNObjectsInF()));
break;