לדלג לתוכן

תכנות וזיהוי/אינטגרציה של התוכנה

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

גלילה והזזה

[עריכה]

כדי לראות ברור תמונות של סימנים ואותיות של שפה שלמה, ולכל אות או סימן שורה של מופעים ,

כנראה חייבת להיות אפשרות לגלילת המסך.

חלון בצדיו פסי גלילה, אחד מאוזן והשני מאונך

דוגמה לתוכנית לגלילת מסך (המכילה קבצי מקור )יש באתר של פבריס פופיניו ( 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;