דלג לתוכן הראשי
היכנס דרך Microsoft
היכנס או צור חשבון.
שלום,
בחר חשבון אחר.
יש לך חשבונות מרובים
בחר את החשבון שברצונך להיכנס באמצעותו.

סיכום

יישומים מבוססי-Windows מציגים לעתים קרובות תיבות דו-שיח של הזנת נתונים כדי לבקש מידע ממשתמשים. תיבות דו-שיח אלה עשויות להכיל כמה פקדי עריכה ושני לחצני פקודה (דחיפה), המסומנים באישור וביטול. דוגמה של תיבת הדו ' הזנת נתונים ' היא אחת שמבקשת מידע אישי, כגון מספר תעודת זהות, כתובת, מזהה (מזהה), תאריך/שעה וכן הלאה, ממשתמשים. כל אחד מהפריטים הללו מוזן לפקד עריכה. כברירת מחדל, מקש TAB משמש בתיבת דו-שיח כדי להעביר את המוקד בין עריכת פקדים. עם זאת, כממשק משתמש נפוץ, ניתן גם להשתמש במקש ENTER (RETURN) כדי לעבור בין פקדי העריכה (לדוגמה, לאחר שהמשתמש מזין פיסת מידע, הקשה על ENTER מעבירה את המוקד לשדה הבא). קיימות כמה דרכים להפיכת השימוש במקש ENTER לזמין כדי לעבור בין פקדי עריכה. שיטה אחת היא לבצע שימוש בWM_COMMAND ובהודעות הדיווח הכלולות אותה בתיבת הדו לעריכת פקדים ולחצנים. שיטה נוספת כרוכה בsubclassing העריכה '. שלישי כולל שימוש באשף היישומים ובאשף הכיתה ויצירת פונקציית חבר חדשה בתיבת הדו.

מידע נוסף

שיטה I: (WM_COMMAND)

שיטה זו מבוססת על אופן הפעולה הבא של תיבות דו-שיח (מנהל הדו) וטיפול במיקוד ב-Windows. אם תיבת דו-שיח או אחד מהפקדים שלה כוללים את מוקד הקלט, ולאחר מכן הקשה על מקש ENTER גורמת ל-Windows לשלוח הודעת WM_COMMAND עם הפרמטר idItem (wParam) למזהה של לחצן הפקודה המוגדר כברירת אם תיבת הדו אינה כוללת לחצן פקודה המוגדר כברירת מחדל, הפרמטר idItem מוגדר ל-IDOK כברירת מחדל. כאשר יישום מקבל את ההודעה WM_COMMAND עם idItem מוגדר למזהה של לחצן הפקודה המוגדר כברירת מחדל, המוקד נשאר עם הפקד שהמוקד הפעיל לפני שמקש ENTER הקיש. שיחות GetFocus () בנקודה זו מחזירה את נקודת האחיזה של הפקד שהיה במוקד לפני הלחיצה על מקש ENTER. היישום יכול לבדוק את נקודת האחיזה לבקרה זו ולקבוע אם הוא שייך לאחד מפקדי העריכה בתיבת הדו. אם כן, המשתמש הזין נתונים באחד מפקדי העריכה ולאחר מכן, הקש ENTER. בשלב זה, היישום יכול לשלוח את הודעת הWM_NEXTDLGCTL לתיבת הדו כדי להעביר את המוקד לפקד הבא. עם זאת, אם המוקד היה עם אחד מלחצני הפקודות (ביטול או אישור), הפונקציה GetFocus () מחזירה נקודת אחיזה לבקרה של לחצן, שבה ניתן לבטל את תיבת הדו. הקוד המדומה עבור לוגיקה זו דומה לבאים בהליך תיבת הדו של היישום:

     case WM_COMMAND:     if(wParam=IDOFDEFBUTTON || IDOK) {          // User has hit the ENTER key.          hwndTest = GetFocus() ;          retVal = TesthWnd(hWndTest) ;          //Where retVal is a boolean variable that indicates whether        //the hwndTest is the handle of one of the edit controls.          if(hwndTest) {         //Focus is with an edit control, so do not close the dialog.            //Move focus to the next control in the dialog.         PostMessage(hDlg, WM_NEXTDLGCTL, 0, 0L) ;         return TRUE ;          }          else {            //Focus is with the default button, so close the dialog.            EndDialog(hDlg, TRUE) ;            return FALSE ;          }        }     break ;

שיטה II

שיטה זו כוללת את subclassing/superclassing את פקד העריכה בתיבת הדו. לאחר שפקדי העריכה הם subclassed או superclassed, קלט לוח המקשים נשלח להליך המשנה/מחלקת המשנה של פקד העריכה המכיל כעת את מוקד הקלט, בין אם תיבת הדו כוללת לחצן פקודה המהווה ברירת מחדל. היישום יכול ללכוד את הודעות מקש ENTER (או char), לחפש את מקש ENTER ולבצע את העיבוד בהתאם. להלן שגרת מחלקת מחלקת מדגם שמחפשת את מקש ENTER:

   //*-------------------------------------------------------------------   //| Title:   //|     SubClassProc   //|   //| Parameters:   //|     hWnd            - Handle to the message's destination window   //|     wMessage        - Message number of the current message   //|     wParam          - Additional info associated with the message   //|     lParam          - Additional info associated with the message   //|   //| Purpose:   //|     This is the window procedure used to subclass the edit control.   //*---------------------------------------------------------------------   long FAR PASCAL SubProc(HWND hWnd, WORD wMessage,WORD wParam,LONG                           lParam)   {       switch (wMessage)        {             case WM_GETDLGCODE:               return (DLGC_WANTALLKEYS |                       CallWindowProc(lpOldProc, hWnd, wMessage,                                      wParam, lParam));             case WM_CHAR:             //Process this message to avoid message beeps.            if ((wParam == VK_RETURN) || (wParam == VK_TAB))              return 0;               else              return (CallWindowProc(lpOldProc, hWnd,                                        wMessage, wParam, lParam));          case WM_KEYDOWN:               if ((wParam == VK_RETURN) || (wParam == VK_TAB)) {                 PostMessage (ghDlg, WM_NEXTDLGCTL, 0, 0L);                 return FALSE;               }            return (CallWindowProc(lpOldProc, hWnd, wMessage,                                      wParam, lParam));            break ;          default:               break;        } /* end switch */ 

שיטה 3

שיטה זו כרוכה בשימוש ב-App Studio וב-ClassWizard וביצירת פונקציית חבר חדשה של תיבת הדו. שיטה זו תאפשר למשתמש להקיש על מקש ENTER ולהקדמת המוקד לפקד העריכה הבא. אם המוקד נמצא כעת בפקד העריכה האחרון בתיבת הדו, המוקד יקדם את פקד העריכה הראשון. תחילה, השתמש ב-App Studio כדי לשנות את המזהה של לחצן אישור של תיבת הדו. אופן הפעולה המוגדר כברירת מחדל של האפליקציה Studio הוא לתת ללחצן אישור את מזהה IDOK. המזהה של לחצן אישור אמור להיות משתנה לערך אחר, כגון IDC_OK. בנוסף, שנה את המאפיינים של לחצן אישור כך שהוא לא pushbutton ברירת מחדל. לאחר מכן, השתמש ב-ClassWizard כדי ליצור חבר חדש של תיבת הדו funciton. תן שם לפונקציית החבר החדש משהו כמו OnClickedOK. יש לקשור פונקציה זו להודעה BN_CLICKED מפקד הIDC_OK. לאחר הסיום, כתוב את הגוף של הפונקציה OnClickedOK. עליך למקם את הקוד שאתה מציב בדרך כלל בפונקציה OnOK בפונקציה OnClickedOK החדשה, כולל הפונקציה OnOK של הכיתה. הוסף את האב-טיפוס הבא לקובץ הכותרת של תיבת הדו:

   protected:      virtual void OnOK();

הוסף פונקציה OnOK לתיבת הדו והקוד כפי שמוצג להלן:

   void CMyDialog::OnOK()   {        CWnd* pwndCtrl = GetFocus();        CWnd* pwndCtrlNext = pwndCtrl;        int ctrl_ID = pwndCtrl->GetDlgCtrlID();        switch (ctrl_ID) {            case IDC_EDIT1:                pwndCtrlNext = GetDlgItem(IDC_EDIT2);                break;            case IDC_EDIT2:                pwndCtrlNext = GetDlgItem(IDC_EDIT3);                break;            case IDC_EDIT3:                pwndCtrlNext = GetDlgItem(IDC_EDIT4);                break;            case IDC_EDIT4:                pwndCtrlNext = GetDlgItem(IDC_EDIT1);                break;            case IDOK:                CDialog::OnOK();                break;            default:                break;        }        pwndCtrlNext->SetFocus();   }

זקוק לעזרה נוספת?

מעוניין באפשרויות נוספות?

גלה את יתרונות המנוי, עיין בקורסי הדרכה, למד כיצד לאבטח את המכשיר שלך ועוד.

קהילות עוזרות לך לשאול שאלות ולהשיב עליהן, לתת משוב ולשמוע ממומחים בעלי ידע עשיר.

האם מידע זה היה שימושי?

עד כמה אתם מרוצים מאיכות השפה?
מה השפיע על החוויה שלך?
בלחיצה על 'שלח', אתה מאפשר למשוב שלך לשפר מוצרים ושירותים של Microsoft. מנהל ה-IT שלך יוכל לאסוף נתונים אלה. הצהרת הפרטיות.

תודה על המשוב!

×