p align="left"> &msg)) // message data { TranslateMessage(&msg); DispatchMessage(&msg); } } DestroyAcceleratorTable(hAccel); return msg.wParam; } BOOL RegClass(WNDPROC Proc, LPCSTR szName,UINT brBackground,UINT ic,UINT cur,UINT menu) CS_VREDRAW /* Оконная процедура */ LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam ) { HDC hCompDC, hdc; // хендли контекстів пристрою HBITMAP hBmpBckGrnd, hBmpTrain, oBitmap, hBmpCar1, hBmpShlagbaym; // хендли нашого зображення і старого BITMAP bitmap; // для зберігання розмірів зображення RECT r; // для зберігання розмірів екрану RECT train, car1, shlagbm; static HWND hStatus; int pParts[2]; SetTimer(hWnd,1,Speed,NULL); GetClientRect(hWnd, &r); pParts[0]=500; pParts[1]=1000; shlagbm.top=Y3; shlagbm.left=X3; shlagbm.bottom=Y3+215; shlagbm.right=X3+215; car1.left=X2; car1.top=Y2; car1.right=X2+96+13; car1.bottom=Y2+168+13; train.left=X-10; train.top=Y; train.right=X+538; train.bottom=Y+118; Y=85; switch(msg) { case WM_CREATE: hStatus=CreateStatusWindow(WS_CHILD case WM_NOTIFY: { LPTOOLTIPTEXT t; t=(LPTOOLTIPTEXT)lParam; if (t->hdr.code!=TTN_NEEDTEXT) return 0; switch (t->hdr.idFrom) { case IDM_START: t->lpszText="Старт поїзда"; break; case IDM_EDIT: t->lpszText="Керування шлагбаумом"; break; case IDM_INFO: t->lpszText="Інформація про виконавця"; break; case IDM_EXIT: t->lpszText="Вихід"; break; } } case WM_PAINT: { PAINTSTRUCT ps; // структура для параметрів контексту hdc = BeginPaint(hWnd, &ps); // отримуємо хендл контексту пристрою hBmpBckGrnd = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); GetObject ( hBmpBckGrnd, sizeof(BITMAP),&bitmap); // отримали розміри зображення hCompDC = CreateCompatibleDC ( hdc ); oBitmap = (HBITMAP)SelectObject ( hCompDC, hBmpBckGrnd ); // ввели наше зображення у контекст в пам'яті // і запам'ятали те, що витіснили звідти StretchBlt (hdc, r.left, r.top, r.right, r.bottom, // куди hCompDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, // звідки SRCCOPY); // як // “натягнули” зображення в пам'яті на екран SelectObject ( hCompDC, oBitmap );// повернули в контекст в пам'яті попередній вміст DeleteObject ( hBmpBckGrnd ); // знищили об'єкт if (car==0) { hBmpCar1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP4)); DrawTransparentBitmap(hdc,// Конечный DC. hBmpCar1,// Битмап, который будет нарисован. X2, // координата X. Y2, // координата Y. 0x00FFFFFF); // Цвет для прозрачных // пикселей (в данном случае белый DeleteObject ( hBmpCar1 ); // знищили об'єкт } if (car==1) { hBmpCar1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP10)); DrawTransparentBitmap(hdc, // Конечный DC. hBmpCar1, // Битмап, который будет нарисован. X2, // координата X. Y2, // координата Y. 0x00FFFFFF); // Цвет для прозрачных // пикселей (в данном случае белый DeleteObject ( hBmpCar1 ); // знищили об'єкт } if(par==1) { SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Увага!!!Їде Поїзд!!!"); hBmpTrain = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2)); DrawTransparentBitmap(hdc, // Конечный DC. hBmpTrain, // Битмап, который будет нарисован. X, // координата X. Y, // координата Y. 0x00FFFFFF); // Цвет для прозрачных // пикселей (в данном случае DeleteObject ( hBmpTrain ); // знищили об'єкт } else SendMessage(hStatus, SB_SETTEXT, 0, (LONG)"Поїзд ще далеко :)"); if(shlagbaym==0) { SendMessage(hStatus, SB_SETTEXT, 1, (LONG)"Увага! Шлагбаум відкрито!"); if (w==0) { InvalidateRect(hWnd, &shlagbm, FALSE); w++; } hBmpShlagbaym = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP9)); DrawTransparentBitmap(hdc, // Конечный DC. hBmpShlagbaym,// Битмап, который будет нарисован. X3, // координата X. Y3, // координата Y. 0x00FFFFFF); // Цвет для прозрачных // пикселей (в данном случае белый DeleteObject ( hBmpShlagbaym ); // знищили об'єкт } if(shlagbaym==1) { SendMessage(hStatus, SB_SETTEXT, 1, (LONG)"Увага! Шлагбаум закрито!"); if (w==1) { InvalidateRect(hWnd, &shlagbm, FALSE); w--; } hBmpShlagbaym = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP5)); DrawTransparentBitmap(hdc, // Конечный DC. hBmpShlagbaym,// Битмап, который будет нарисован. X3, // координата X. Y3, // координата Y. 0x00FFFFFF); // Цвет для прозрачных // пикселей (в данном случае белый DeleteObject ( hBmpShlagbaym ); // знищили об'єкт } DeleteDC ( hCompDC ); EndPaint(hWnd, &ps); // знищуємо контекст пристрою return 0; } case WM_TIMER: { if ((shlagbaym==0)||(Y2<330)||(Y2>350)) { if (car==0) { Y2-=13; InvalidateRect(hWnd, &car1, FALSE); } if (car==1) { if (wham==0) SND_ASYNC); wham++; X2+=13; InvalidateRect(hWnd, &car1, FALSE); } if ((Y2<-200)||(X2>1000)) { Y2=800; X2=450; } } if (par==1) { X+=10; InvalidateRect(hWnd, &train, FALSE); if(X<=(X2+45)&&(X+538)>=(X2-1)&&(Y+118)>=(Y2+1)&&(Y<=Y2+85)) car=1; if (X>1001) { X2=450; par=0; car=0; wham=0; } } return 0; } case WM_COMMAND: { switch(LOWORD(wParam)) { case IDM_EXIT: int k=MessageBox(hWnd, "Ви впевнені?","Вихід?", MB_OKCANCEL case IDM_VARIANT: { DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProg2); return 0; } case IDM_INFO: { DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG3), hWnd, DlgProg3); return 0; } case IDM_EDIT: { int i=0; i=1; DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProg); InvalidateRect(hWnd, &shlagbm, FALSE); return 0; } case IDM_HELP: { DialogBox (hInstance, MAKEINTRESOURCE(IDD_DIALOG4), hWnd, DlgProg4); return 0; } case IDM_START: SND_ASYNC); InvalidateRect(hWnd, &r, FALSE); X=-500; par=1; car=0; X2=450; wham=0; return 0; } return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc (hWnd, msg, wParam, lParam); } BOOL CALLBACK DlgProg(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: { EndDialog(hdWnd, 0); return 1; } case WM_COMMAND: { switch (wParam) { case IDC_UPBUTTON: { if (par!=1) { shlagbaym=0; } EndDialog(hdWnd, 0); return 1; } case IDC_DOWNBUTTON: { shlagbaym=1; EndDialog(hdWnd, 0); return 1; } } return 1; } } return 0; } BOOL CALLBACK DlgProg2(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CLOSE: { EndDialog(hdWnd, 0); return 1; } } return 0; } BOOL CALLBACK DlgProg3(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: { switch (wParam) { case IDOK: { EndDialog(hdWnd, 0); return 1; } } return 1; } case WM_CLOSE: { EndDialog(hdWnd, 0); return 1; } } return 0; } BOOL CALLBACK DlgProg4(HWND hdWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: { switch (wParam) { case IDOK: { EndDialog(hdWnd, 0); return 1; } } return 1; } case WM_CLOSE: { EndDialog(hdWnd, 0); return 1; } } return 0; } void DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart, short yStart, COLORREF cTransparentColor) { BITMAP bm; COLORREF cColor; HBITMAP bmAndBack, bmAndObject, bmAndMem, bmSave; HBITMAP bmBackOld, bmObjectOld, bmMemOld, bmSaveOld; HDC hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave; POINT ptSize; hdcTemp = CreateCompatibleDC(hdc); SelectObject(hdcTemp, hBitmap); // Выбираем битмап GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm); ptSize.x = bm.bmWidth; // Получаем ширину битмапа ptSize.y = bm.bmHeight; // Получаем высоту битмапа DPtoLP(hdcTemp, &ptSize, 1); // Конвертируем из координат // устройства в логические // точки // Создаём несколько DC для хранения временных данных. hdcBack = CreateCompatibleDC(hdc); hdcObject = CreateCompatibleDC(hdc); hdcMem = CreateCompatibleDC(hdc); hdcSave = CreateCompatibleDC(hdc); // Создаём битмап для каждого DC. // Монохромный DC bmAndBack = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); // Монохромный DC bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL); bmAndMem = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); bmSave = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y); // В каждом DC должен быть выбран объект битмапа для хранения // пикселей. bmBackOld = (HBITMAP)SelectObject(hdcBack, bmAndBack); bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject); bmMemOld = (HBITMAP)SelectObject(hdcMem, bmAndMem); bmSaveOld = (HBITMAP)SelectObject(hdcSave, bmSave); // Устанавливаем режим маппинга. SetMapMode(hdcTemp, GetMapMode(hdc)); // Сохраняем битмап, переданный в параметре функции, так как // он будет изменён. BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); // Устанавливаем фоновый цвет (в исходном DC) тех частей, // которые будут прозрачными. cColor = SetBkColor(hdcTemp, cTransparentColor); // Создаём маску для битмапа путём вызова BitBlt из исходного // битмапа на монохромный битмап. BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY); // Устанавливаем фоновый цвет исходного DC обратно в // оригинальный цвет. SetBkColor(hdcTemp, cColor); // Создаём инверсию маски. BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, NOTSRCCOPY); // Копируем фон главного DC в конечный. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart, SRCCOPY); // Накладываем маску на те места, где будет помещён битмап. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND); // Накладываем маску на прозрачные пиксели битмапа. BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND); // XOR-им битмап с фоном на конечном DC. BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT); // Копируем на экран. BitBlt(hdc, xStart, yStart, ptSize.x, ptSize.y, hdcMem, 0, 0, SRCCOPY); // Помещаем оригинальный битмап обратно в битмап, переданный в // параметре функции. BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY); // Удаляем битмапы из памяти. DeleteObject(SelectObject(hdcBack, bmBackOld)); DeleteObject(SelectObject(hdcObject, bmObjectOld)); DeleteObject(SelectObject(hdcMem, bmMemOld)); DeleteObject(SelectObject(hdcSave, bmSaveOld)); // Удаляем DC из памяти. DeleteDC(hdcMem); DeleteDC(hdcBack); DeleteDC(hdcObject); DeleteDC(hdcSave); DeleteDC(hdcTemp); }
Страницы: 1, 2, 3, 4
|