![]() |
|
תונולח תביבסב תונושאר תוינכות - C/C++ | |
![]() |
|
ישאר דומע | סינוקא ןד תאמ |
![]() |
הנושארה תינכותה
:Windows-ב םושרל רשפאש הלק יכה תינכותב ליחתנ #include <windows.h> int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { MessageBox(NULL, "Hello World!", "Message", MB_OK); return 0; } :וזה הביתל המודב העדוה תבית לבקת ,תינכותה תא ץירתשכ ![]() :הנטנטקה ונתינכות תא רוקחל ליחתנ ,בוט לע םייתניב תעדל ךירצ התאש המ לכ .כ"חא WinMain לש םינייפאמה תא ריבסא ינא .תונולח תססובמ תינכותב תישארה היצקנופה איהש WinMain :םיאבה םירטמרפה םע ךסמה לע העדוה תבית הארמ MessageBox היצקנופה :ןושאר רטמרפ םילימב וא) העדוהה תבית לש באה-ןולחל תכיישה "תוהזה תדועת" יהוז ול תנתונה (Handle) תוהז תדועת שי ןולח לכל .(וז העדוה תביתל ארק ימ - תורחא .ולש Handle-ה י"ע ול תארוק איה ,ןולחל תארוק Windows רשאכ .תכרעמב יוהיז :ינש רטמרפ .העדוהה תבית ףוגב ללכי הנכות רשא (העובק תזורחמ וא) תזורחמל עיבצמ והז :ישילש רטמרפ .העדוהה תבית תרתוכב ללכי הנכות רשא (העובק תזורחמ וא) תזורחמל עיבצמ והז :יעיבר רטמרפ .העדוהה תביתב ועיפויש םינצחלה גוסו רפסמ תא םירידגמ ונא הפ רטמרפה תא םיחלוש ונייה םא ךא ("OK") דחא רותפכ קר ונשי ,ונלש הרקמב .CANCEL"-"ו "OK" :םירותפכ ינש םילבקמ ונייה ,MB_OKCANCEL .API-ל הרזע ץבוקל הנפ ףסונ עדימל - םיגוס דוע םנשי רתוי השק הייהנ קר וז לבא .תונולח תביבסב תנכתל לק הזיא ךמצעל בשוחו בשוי התא וישכע חטב (- : ךבתסהל טאל טאל הליחתמש ,הלחתהה ?תדבוע WinMain היצקנופה ךיא תלבק םיריכמ ונחנא ...רזומ) םירטמרפ 4 תלבקמ WinMain היצקנופהש םיאור ונא .(DOS תביבסמ ידגאה main-ב רטמרפ ףא וא םירטמרפ ינש :בוש היצקנופה תרתוכ הנה int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) .תינכותה תצרה םע םיחתופ ונחנא ותוא ןולחה לש (?םירכוז) Handle-ה אוה .טעמ דוע וילא רוזחנ .Handle-ל ןווכתמ 'H' תואב ליחתמה תונולח תביבסב רטמרפ לכ :ינש רטמרפ לש Handle-ה אלא ךלש תינכותה לש Handle-ה אל והז םעפה ךא Handle אוה םג .ךלש תינכותה תא חתפש םושייה לש Handle-ה ,רמולכ .ךלש תינכותה לש "אבא"-ה :ישילש רטמרפ ךרעמ אלו תדדוב תזורחמ יהוז םעפה ךא .DOS תביבסמ םסרופמה argv-ל דאמ המוד .תינכותה לש םשה םע רבעומש רטמרפ והז .תוזורחמ לש :יעיבר רטמרפ .(ליגר ,ןטקומ ,לדגומ) הארי אוה ךיאו ןולחה תחיתפ ןפוא לע היצקידניא ןתונש לגד והז ךכ Pascal-ל תפסונ הלימ איה WinMain היצקנופה םש ינפל WINAPI הלימה .לקספ לש םירטמרפ תרבעה י"ע ארקית WinMain-ש .לקספו C :םירטמרפ תרבעהל תוטיש יתש ןנשי ,לקספ תטישב וליאו .תינסחמל ןושאר סנכומ (רתויב ינמיה) ןורחאה רטמרפה ,C תטישב טעמכ תדבוע Windows .תינסחמל רתויב ילאמשה רטמרפה סנכומ היצקנופל האירקב .וזה הלימה תא ףיסוהל ךרטצנ ןכלו לקספ תטישב ןמזה לכ ?Windows לש תועדוהה םע םידדומתמ ךיא תוינכותל םינוש םיגוסמ תועדוה תחלוש ןמזה לכ Windows-ש ,ךכ לע תעמש הארנכ ?וללה תועדוהה םע דדומתהל ךיא איה הלאשה .הילע תוצרש :אמגודב חותפל איה ,הארנכ הבוט יכה ךרדה #include <windows.h> #include <string.h> const char *CLASSNAME="Tutorial", *WINNAME="Tutorial 2 - The Window"; LRESULT CALLBACK WndProc(HWND hWnd, unsigned int iMessage, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { HWND hWnd; MSG Message; WNDCLASS WndClass; // NOTE: The memset() here is to avoid this code crashing on // WinNT. (string.h is for memset() function) memset(&WndClass, 0, sizeof(WndClass)); WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hIcon = LoadIcon(hInstance, NULL); WndClass.hInstance = hInstance; WndClass.lpfnWndProc = WndProc; WndClass.lpszClassName = CLASSNAME; WndClass.style = CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&WndClass)) return 0; hWnd = CreateWindow(CLASSNAME, WINNAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 300, 100, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); while(GetMessage(&Message, hWnd, 0, 0)) { TranslateMessage(&Message); DispatchMessage(&Message); } return Message.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(iMessage) { case WM_CLOSE: case WM_DESTROY: if(MessageBox(hWnd, "Do you really want to quit?", "Message", MB_YESNO) == IDYES) PostQuitMessage(0); break; default: return DefWindowProc(hWnd, iMessage, wParam, lParam); } return 0; } תינכות דלש כ"הסב והז .שואיי לא ךא הלחתהה לע םזגומ תצק הזש םיכסמ ינא הברה היהי ראשה לכ ,דלשה תא ןיבת רשאכש ,רמוא הז .Windows-ב תיטרדנטס תא ץירתשכ הארתש המ הנה .WNDCALSS-ו WinMain םע ליחתנ ,OK .לק רתוי :וזה תינכותה ![]() התאשכ .תכרעמב התוא "םושרל" אוה ,ךלש תינכותה םע תושעל ךילעש ןושאר רבד תועדוה לבקל ןכומ ינא ,וישכעמ" Windows -ל רמוא התא ,ךלש תינכותה תא םשור הקלחמה גוסמ טקייבוא םירצויש הזב םיליחתמ ?תינכותה תא םימשור ךיא ."ךממ חלשנ ,ןכמ רחאל .ךירצ Windows-ש עדימב ולש םינתשמה תא םיאלממו WNDCLASS :ךכ Windows-ל טקייבואה תא WNDCLASS WndClass; // NOTE: memset() is to deal with this code crashing on WinNT memset(&WndClass, 0, sizeof(WndClass)); WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hIcon = LoadIcon(hInstance, NULL); WndClass.hInstance = hInstance; WndClass.lpfnWndProc = WndProc; WndClass.lpszClassName = CLASSNAME; WndClass.style = CS_HREDRAW | CS_VREDRAW; if(!RegisterClass(&WndClass)) return 0; תא בוזענ .Windows NT-ב תינכותה תסירק עונמל ידכ הלעפוה memset הדוקפה םהל ןתינ ןכלו עגרכ םיבושח אל םה הקלחמה לש םינושארה תודשה ינש .וישכע הז .(ןכ תושעל גאדת Windows, 0 ךרעה תא םהל ןתינ אל םא םג) 0 ךרע .ןולחה לש עקרה עבצ תא גציימ hbrBackground הדשה .שמתשת תינכותה וב רבכעה עיבצמ גוס תא גציימ hCursor הדשה .ךלש תינכותה לש (Icon) למסה תא גציימ hIcon הדשה .ךלש תינכותה לש hInstance-ה תא לבקמ hInstance הדשה Windows-ש תועדוהב לפטת רשא היצקנופל עיבצמ אוה pfnWndProc הדשה .ךלש תינכותל תחלוש .תכרעמב ךלש תינכותה לש ימינפ םש אוה pszClassName הדשה ןולחהש יתרחב הז הרקמב .ךלש תינכותה לש ןולחה ןונגס תא גציימ style הדשה .בחורל וא ךרואל (resize) ולדוג תא םינשמ רשאכ שדחמ רייוצי תינכותהש Windows-ל העידומו תכרעמב ןולחה תא תמשור RegisterClass הדוקפה .תופטוש תועדוה לבקל הנכומ ךלש :האבה הרוצב השענ הזו ןולחה תא רוציל אוה רתונש לכ ,וישכע hWnd = CreateWindow(CLASSNAME, WINNAME, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 200, 100, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nCmdShow); .תכרעמב ךתינכות לש ימינפה םשה :1 רטמרפ .ןולחה לש ישממה םשה :2 רטמרפ .(ל"נה הקלחמב style ןייפאמל רשק ןיא) ןולחה ןונגס :3 רטמרפ רמוא CW_USEDEFAULT עובקה .ןולחה לש הנוילעה תילאמשה הניפה :5,4 םירטמרפ .הנוילעה תילאמשה הניפה תא המצעב עובקל Windows-ל רמוא CW_USEDEFAULT עובקה .ןולחה לש בחורהו הבוגה :7,6 םירטמרפ .ןולחה לש הבוגהו בחורה תא המצעב עובקל Windows-ל .(באה-ןולח אוה הדובעה ןחלוש ,NULL אוה םא) באה-ןולח :8 רטמרפ םישמתשמ וא טירפת וננוצרב ןיא םא NULL) תונולח טירפתל 9: Handle רטמרפ .( class menu- טירפת תקלחמב .תכרעמב ךלש תינכותה ההזמ :10 רטמרפ .(NULL אוה ןכל וישכע ול קקדזנ אל) ןולחה תריצי ינותנל עיבצמ :11 רטמרפ היצקנופה .ךסמה לע ותוא גיצהל ידכ ShowWindow היצקנופל ארקנ ,ןכמ ריחאל :םירטמרפ 2 תלבקמ .גצייל םיצור ונא ותוא ןולחה לש ההזמה :1 רטמרפ .ןולחה תגוצת ןפוא תא גציימו WinMain היצקופל ונחלש ותוא לגדה :2 רטמרפ .םירחא םילגד םע שמתשהל תלכיש ןבומכ :בושח ןטק רבד דוע קר ראשנ ,WinMain םע ונמייס טעמכ ,OK while(GetMessage(&Message, hWnd, 0, 0)) { TranslateMessage(&Message); DispatchMessage(&Message); } return Message.wParam; .תכרעמהמ תוחלשנה תושדח תועדוה ונל איבת GetMessage היצקנופה םיילאוטריו-םישקמ תעדוהמ העדוהה תא םגרתת TranslateMessage היצקנופה .WM_CHAR תעדוה לבקל לכות אל ,הב שמתשת אל םא .םיות תעדוהל האלולה םא .הב לפטל רומאש ימל העדוהה תא תחלוש DispatchMessage היצקנופה wParam ןייפאמה לש וכרע תא תכרעמל ריזחנ זא (WM_QUIT תעדוה י"ע) תמייתסמ .העדוהב :WndProc() היצקנופה םע ליחתנ ,בוט :הרדגה LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) .(םיספט תובורמ MDI - תוינכות לשמל) .ינשהמ דחא תרחא הרוצב םיהוזמה תונולח .WinMain היצקנופב ונחתפ ותוא ןולחה הז ,ונלש הרקמב .ןולחל החלשנש העדוהה איה iMessage תחלשנ :לשמל .העדוהה םע םיחלשנה םיפדועה םירטמרפה ינשמ דחא אוה wParam רבכע ינצחל לע עדימ חולשל םג הצרנ .תינכותב רבכעה ןמס תזזה לע העדוה .העדוהה תחילש םע רבכעה ינצחל בצמ תא ליכי הז רטמרפ .וצחלנ אל וא וצחלנש .(עגרכ ןיינעמ אלש ,רתוי בר עדימ ליכמ אוה ,השעמל) ,הלעמל הרקמב) ךרטצנש עדימ ליכמה ףדוע רטמרפ םג אוה lParam ,ףוסבל .(רבכעה ןמס יוצמ ןהב תוטנידרוקה תא .רתוי רחואמ הזל רוזחא .רבדמ ינא המ לע כ"כ ןיבמ אל התא םא הגאד לא :וישכע וזכ העדוה שוגפנ ,השעמל .ףדוע עדימ םע תוחלשנ תועדוהה לכ אל { switch(iMessage) { case WM_CLOSE: if(MessageBox(hWnd, "Do you really want to quit?", "Message", MB_YESNO) == IDYES) PostQuitMessage(0); break; הצור שמתשמה רשאכ Windows-מ ךלש תינכותל תחלשנש העדוה איה WM_CLOSE .(ןולחה תניפב X-ה וא Alt-F4 לע הציחל י"ע) ןולחה תא רוגסל שמתשמה רשאכ .(ןולח תריגס לע עדימב ךרוצ ןיא) םירטמרפ ילב תחלשנ וז העדוה ץחלי שמתשמה רשאכ .הריגסה רושיאל העדוה תבית העיפומ ,ןולחה תא רוגסל הצור .ןולחה תא רוגסתש quit תלועפל ארקנ ,"YES" :אוה תושעל ונל ראשנש המ default: return DefWindowProc(hWnd, iMessage, wParam, lParam); } return 0; } רשאכו םא ,רמולכ .(תכרעמה לש לדחמ תרירב לופיט) ןהב לפטל םיצור אל ונאש תועדוהה ליעפת Windows ,הב יפיצפס לופיט םש היהי אלו ךלש תינכותל העדוה חלשת Windows היצקנופה לש םירטמרפ םתוא תא תלבקמ וז היצקנופ .העדוהב לופיטל הלש הרגשה תא לפטל םיכירצ ונייה .תכרעמה לש לדחמ תרירב תורגש ויה אל םא ונל יוא .WndProc !!!הלאכ הברה שיו .ונלש תינכותל תיטנוולר אל איה םא םג העדוהו העדוה לכב רשאמה 0 ךרע תרזחל הפצמ Windows .תועדוהה בור רובע 0 ךרע םיריזחמ ונחנא ףוסבל .ריזחהל תוכירצ ןה ותוא יטנוולרה ךרעה רוזחי ,תורחא תועדוה רובע .העדוהב לופיט ...ןאכ ץחל ,הצרהה ץבוקו דוקה תדרוהל .....ןיינעמ תויהל ליחתמ קשממב שמתשנ ,ךכ ךרוצל .ונלש ןולחה םע תוטושפ תויפרג תולועפ עצבל דמלנ וישכע .(GDI - Graphics Device Interface) יפרג יעצמא :תינכותב חתפנ ,לכ םדוק HDC hdc; LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) { switch(iMessage) { case WM_LBUTTONDOWN: hdc = GetDC(hWnd); if(hdc) { short xp = LOWORD(lParam); short yp = HIWORD(lParam); MoveToEx(hdc, xp, yp, NULL); } break; case WM_LBUTTONUP: if(hdc) ReleaseDC(hWnd, hdc); hdc = NULL; break; case WM_MOUSEMOVE: if(hdc) { short xp = LOWORD(lParam); short yp = HIWORD(lParam); LineTo(hdc, xp, yp); } break; case WM_CLOSE: if(MessageBox(hWnd, "Do you really want to quit?", "Message", MB_YESNO) == IDYES) { if(hdc) ReleaseDC(hWnd, hdc); PostQuitMessage(0); } break; default: return DefWindowProc(hWnd, iMessage, wParam, lParam); } return 0; } .HDC hdc :תרכומ אל הרוש םג הפסונ .(טעמ דוע וילע ריבסאש) DC-ל (Handle) ההזמ אוה hdc הנתשמה :הז ןולחל המודה ןולח הארת ,רבכעה םע קחשמו תינכותה תצרה רחאל ![]() .DC הז המ ריבסהל אוה ראשנש המ לכ .תינכותה חותיפ תא םיטשפמ (יעצמא רשקה Device Contexts - לש רוציק) DC .םהלש תונוכתהו םייפרג םיטקייבוא רפסמ רידגמה םינותנ הנבמ אוה (DC) יעצמא רשקה Handle-ב שמתשנ טושפ .הלא תויפרג תורוצ לע עדימ הברה ריבעהל ךרטצנ אל ,ותרזעב .םש אצמנ רבכ עדימה לכ .ולש (הז הנבמל עיבצמ) .ותרזעב וילע רייצלו ונלש ןולחה לש DC-ה תא ונחקל ךיא תיאר הלעמל תינכותב .ןולחה לע רויצל טרפ םירבד הברה דוע תושעל רשפא :אמגוד הנה ?הזב שמתשנ ךיא ,OK case WM_LBUTTONDOWN: hdc = GetDC(hWnd); if(hdc) { short xp = LOWORD(lParam); short yp = HIWORD(lParam); MoveToEx(hdc, xp, yp, NULL); } break; עגרל חיננ .(ץוחל שקמה דוע לכ אל) תחא םעפ תחלשנ וז העדוה .רבכעה לש ילאמשה .(ןבלה עקרה) ונלש ןולחה םינפ לש םידמימ םתוא תא ליכמ ונלש ןולחה לש DC-הש ונילא רבעומה רבכעה לש ומוקימ תא לבקנ ,(NULL אל אוה DC-ל עיבצמה) חילצת הדוקפה םא .WM_LBUTTONDOWN העדוהה י"ע (?םירכוז) lParam ףדועה רטמרפה םע :םירטמרפ העברא תלבקמ רשא MoveToEx() היצקנופל ארקנ ןכמ רחאל .ןולחה לש DC-ל עיבצמ :ןושאר רטמרפ .רבכעה םוקימ לש Y-ו X תוטנידראוק :ישילשו ינש רטמרפ תא קיזחמ אוה ,NULL אל אוה םא) .Point תקלחמ גוסמ טקייבואל עיבצמ :יעיבר רטמרפ .(העדוהה םע חלשנש ןורחאה רבכעה םוקימ case WM_LBUTTONUP: if(hdc) ReleaseDC(hWnd, hdc); hdc = NULL; break; .ותוא ררחשל ידכב ReleaseDC() היצקנופל ארקנ ןכ םאו ,ןולחל DC םייק םא קודבנ העדוהב לופיטב :םירטמרפ ינש תלבקמ היצנקופה .DC-ה ךייש וילא ןולחה לש Handle :ןושאר רטמרפ .ןולחה לש DC-ל (Handle) עיבצמ :ינש רטמרפ .היופצ יתלב הסירק עונמל ידכ NULL-ל DC-ל עיבצמה תא הנשנ ןכמ רחאל case WM_MOUSEMOVE: if(hdc) { short xp = LOWORD(lParam); short yp = HIWORD(lParam); LineTo(hdc, xp, yp); } break; לש ןורחאה םוקימהמ וק רייצנ ,ןכ םא .ןולחה לש DC-ל עיבצמ ונלביק םא קודבנ העדוהב לופיטב .רבכעה .ולש יחכונה םוקימה לא רבכעה ...ןאכ ץחל ,הצרהה ץבוקו דוקה תדרוהל |