
Новичок
Профиль
Группа: Участник
Сообщений: 28
Регистрация: 1.3.2010
Репутация: нет Всего: нет
|
Добрый вечер!  Помогите пожалуйста найти ошибку в программе: При щелчке левой клавиши мыши внутри прямоугольника, дожно выводится сообщение: "Вы попали в прямоугольник!" При щелчке правой клавиши мыши внутри эллипса, дожно выводится сообщение: "Вы попали в эллипс!" В любом другом случае должно выводится сообщение: "Здравствуй мир!" Все сообщения выводить в левом верхнем углу окна Исходный код программы: | Код | #include <windows.h>
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg); char szWinName[] ="MyWin";
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode ) {
/* дескриптор окна */ HWND hwnd; /* сообщение */ MSG msg; /* класс окна */ WNDCLASSEX wcl; /* определение класса окна */ wcl.hInstance=hThisInst; wcl.lpszClassName=szWinName; /* имя класса окна */ wcl.lpfnWndProc=WindowFunc; /* функция окна */ wcl.style=0; /* стиль по умолчанию */ wcl.cbSize = sizeof(WNDCLASSEX); /* размер структуры WNDCLASSEX */ wcl.hIcon = LoadIcon(NULL,IDI_WINLOGO); /* большая пиктограмма */ wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO); /* малая пиктограмма */ wcl.hCursor = LoadCursor(NULL,IDC_ARROW); /* форма курсора */ wcl.lpszMenuName = NULL; /* меню не используется */ wcl.cbClsExtra = 0; /* дополнительная информация отсутствует */ wcl.cbWndExtra = 0; wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); /* фон окна задается белым */
if(!RegisterClassEx(&wcl)) return 0; /* регистрация класса окна */
/* создание окна */ hwnd = CreateWindow ( szWinName, /* имя класса окна */ "Демонстрация рисования графических примитивов, работы с мышью и клавиатурой", /* заголовок */ WS_CAPTION|WS_BORDER, /* стили окна */ CW_USEDEFAULT, /* координата Х - определяется Windows */ CW_USEDEFAULT, /* координата Y - определяется Windows */ 640, /* ширина - определяется Windows */ 480, /* высота - определяется Windows */ HWND_DESKTOP, /* родительского окна нет */ NULL, /* меню нет */ hThisInst, /* дескриптор данного экземпляра приложения */ NULL /* дополнительных аргументов нет */ );
/* отображение окна */ ShowWindow(hwnd,nWinMode); UpdateWindow(hwnd);
/* цикл сообщений */ while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); /* разрешает использование клавиатуры */ DispatchMessage(&msg); /* возвращает управление Windows */ } return msg.wParam; }
/* эта функция вызывается Windows 95, которая передает ей сообщения из очереди сообщений */ LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { /* контекст устройства */ HDC hDC; /* координаты */ int xPos,yPos; /* буфер для текста */ char buf[40]; /* обработка сообщений */ switch (message) { case WM_DESTROY: /* завершение программы */ PostQuitMessage(0); break; /* обработка сообщений при нажатии левой клавиши мыши */ case WM_LBUTTONDOWN: xPos = LOWORD(lParam); yPos = HIWORD(lParam); DWORD xx; hDC=GetDC(hwnd); xx = GetPixel(hDC,xPos,yPos); if (xx == 16711680) { wsprintf(buf,"Сообщение: Вы попали в прямоугольник!",xx); TextOut(hDC,10,25,buf,lstrlen(buf)); } else { wsprintf(buf,"Сообщение: Здравствуй мир! "); TextOut(hDC,10,25,buf,lstrlen(buf)); } ReleaseDC(hwnd,hDC); break;
/* обработка сообщений при нажатии правой клавиши мыши */ case WM_RBUTTONDOWN: xPos = LOWORD(lParam); yPos = HIWORD(lParam); DWORD yy; hDC=GetDC(hwnd); yy = GetPixel(hDC,xPos,yPos); if (yy == 255255) { wsprintf(buf,"Сообщение: Вы попали в эллипс!",yy); TextOut(hDC,10,25,buf,lstrlen(buf)); } else { wsprintf(buf,"Сообщение: Здравствуй мир! "); TextOut(hDC,10,25,buf,lstrlen(buf)); } ReleaseDC(hwnd,hDC); break; /* обработка сообщений перерисовки */ case WM_PAINT: /* отрисовка графических примитивов и вывод сообщения */ DrawMessageAndEllipse(hwnd,10,10,"Для выхода из программы нажмите клавишу [ESC]"); break; default: /* позволяет Windows обрабатывать любые сообщения, не указанные в предыдущем случае */ return DefWindowProc(hwnd, message,wParam,lParam); /* выход из программы при нажатии на ESC */ case WM_KEYDOWN: switch (wParam) { case VK_ESCAPE: exit(0); break; } } return 0; }
/* выводит сообщение в окно в позицию с координатами х,у */ void DrawMessageAndEllipse(HWND hwnd,int x,int y,char *msg) { HDC hDC; PAINTSTRUCT paintStruct; RECT clientRect;
/* объявление кисти */ HBRUSH br1; HBRUSH br2; /* объявление цветов */ COLORREF color1,color2,color3,color4,color5; /* объявление перьев */ HPEN pen1,pen2,pen3;
color1=0x00FF0000; /* цвет - красный */ color2=0x000000FF; /* цвет - синий */ color3=0x0000CD00; /* цвет - зеленый */ color4=0x0000FFFF; /* цвет - желтый */ color5=0x00000000; /* цвет - черный */
/* создание кистей */ br1=CreateSolidBrush(color1); br2=CreateSolidBrush(color4);
/* создание пера */ pen1=CreatePen(PS_DASH,3,color2); pen2=CreatePen(PS_DASH,5,color3); pen3=CreatePen(PS_DASH,2,color5);
/* получение контекста окна */ hDC = BeginPaint(hwnd, &paintStruct); if (hDC != NULL) { /* получение клиентского окна прямоугольника */ GetClientRect(hwnd, &clientRect); /* выбор кисти */ SelectObject(hDC,br1); /* выбор пера */ SelectObject(hDC,pen1); /* рисуем прямоугольник */ Rectangle(hDC,50,50,150,100); /* выбор кисти */ SelectObject(hDC,br2); /* выбор пера */ SelectObject(hDC,pen2); /* рисуем эллипс */ Ellipse(hDC,450,350,550,400); /* задаем цвет текста */ SetTextColor(hDC, RGB(255,0,0)); /* вывод сообщения */ TextOut(hDC,x,y,msg,lstrlen(msg)); /* выбор пера */ SelectObject(hDC, pen3); /* рисуем треугольник по линиям */ MoveToEx(hDC,270,280,NULL); LineTo(hDC,320,220); LineTo(hDC,370,280); LineTo(hDC,270,280); /* удаляем перо */ DeleteObject(pen1); /* удаляем кисти */ DeleteObject(br1); DeleteObject(br2); /* заканчиваем отрисовку */ EndPaint(hwnd, &paintStruct); } }
|
Это сообщение отредактировал(а) koshkarjov - 21.10.2010, 23:13
|