Ваша реклама могла б бути тут!
1 млн переглядів на місяць!
Google Page Rank: 5

Помогите разобратся в оконном приложени виндовс

🔴 06:33 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 28.01.2009
Повідом.: 176
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #1
Помогите разобратся в оконном приложени виндовс

Задача:
Написать программу, позволяющую рисовать линии. Нажатие левой кнопки мыши определяет первую точку линии. Не отпуская кнопки пользователь перемещает мышь во вторую точку отрезка. Отпускание кнопки приводит к фиксации второй точки линии. Во время движения с нажатой кнопкой мыши, линия должна перерисовываться.

Я все смастерил, НО:

1) Не получается нарисовать линию с того места где кликнул мышь, в то где находится в данный момент: кажется, что начало лини находится далеко за пределами окна (хотя должно быть иначе), не смотря на то, что я запоминаю координаты нахождения мыши во время клика в переменные:
x=LOWORD(lParam);
y=HIWORD(lParam);
а потом начинаю рисовать с того места:
MoveToEx(hdc,x,y,NULL);
LineTo(hdc, LOWORD(lParam),HIWORD(lParam));

2) Все очищается, если свернуть и развернуть окно (я рисую линию, когда приходит сообщение WM_MOUSEMOVE, а когда приходит WM_PAINT ничего не делаю)

Подскажите, помогите разобратся

По желанию могу выложить весь листинг
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #2
2) при свернуть и развернуть происходит перерисовка окна, я бы Вам советовал создать массив, в котором бы хранились линии, и при перерисовке окна их перерисовывать.
1) Вы наверно считываете координаты мыши на экране, а как я помню в "оконном приложени виндовс" малость другая ось координат, их надо преобразовать. хотя не работал с этим уже лет 1000
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #3
кури
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
и
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
.

Рисовать надо не на hdc, а в bitmap. bitmap выводить на hdc при WM_PAINT.
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #4
спасибо, щас попробую что-нибудь сделать

делаю вот так
points[++i].x=LOWORD(lParam);
points[++i].y=HIWORD(lParam);
ScreenToClient(hWnd,points);
а потом использую
MoveToEx(hdc,points[++i].x,points[++i].y,NULL);
всеравно не получается
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #5
Задача:
Написать программу, позволяющую рисовать линии. Нажатие левой кнопки мыши определяет первую точку линии. Не отпуская кнопки пользователь перемещает мышь во вторую точку отрезка. Отпускание кнопки приводит к фиксации второй точки линии. Во время движения с нажатой кнопкой мыши, линия должна перерисовываться.

Я все смастерил, НО:

1) Не получается нарисовать линию с того места где кликнул мышь, в то где находится в данный момент: кажется, что начало лини находится далеко за пределами окна (хотя должно быть иначе), не смотря на то, что я запоминаю координаты нахождения мыши во время клика в переменные:
x=LOWORD(lParam);
y=HIWORD(lParam);
а потом начинаю рисовать с того места:
MoveToEx(hdc,x,y,NULL);
LineTo(hdc, LOWORD(lParam),HIWORD(lParam));

2) Все очищается, если свернуть и развернуть окно (я рисую линию, когда приходит сообщение WM_MOUSEMOVE, а когда приходит WM_PAINT ничего не делаю)

Подскажите, помогите разобратся

По желанию могу выложить весь листинг

1) Как вариант. Вызвать функцию GetClientRect и определить координаты клиенской области.
2) Как вариант. Создать контекст в памяти memDC_, обернуть в класс. Отрисовывать фигуры в этом контексте. При обновлении, отрисовке... окна копировать контекст функцией например: BitBlt(hdc, 0, 0, sizex_, sizey_, memDC_, 0, 0, SRCCOPY);
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #6
спасибо, щас попробую что-нибудь сделать

делаю вот так
points[++i].x=LOWORD(lParam);
points[++i].y=HIWORD(lParam);
ScreenToClient(hWnd,points);
а потом использую
MoveToEx(hdc,points[++i].x,points[++i].y,NULL);
всеравно не получается

Да не надо начинать с массивов. Так запутаешся еще сильнее.
Создай четыре переменный типа int x1, y1, x2, y2. При нажатии мышки заносят координаты в первые две переменные, а при отжатии во вторые две. Рисуешь при помощи тех функций которые ты описал в WM_PAINT.
Когда вывелась линия сверни и разверни окно. Убудесь, что линия рисуется. Потом эти четыре переменные преврати в две переменные типа POINT. А вот после этого уже переход к массивам. У тебя будет глобальная переменная которая будет счетчиком. Она будет увеличиваться при отжатии клика. Осталось в сообщении WM_PAINT добавить цикл который выполниться столько раз сколько точек находится в массиве.
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #7
Да не надо начинать с массивов. Так запутаешся еще сильнее.
Создай четыре переменный типа int x1, y1, x2, y2. При нажатии мышки заносят координаты в первые две переменные, а при отжатии во вторые две. Рисуешь при помощи тех функций которые ты описал в WM_PAINT.
Когда вывелась линия сверни и разверни окно. Убудесь, что линия рисуется. Потом эти четыре переменные преврати в две переменные типа POINT. А вот после этого уже переход к массивам. У тебя будет глобальная переменная которая будет счетчиком. Она будет увеличиваться при отжатии клика. Осталось в сообщении WM_PAINT добавить цикл который выполниться столько раз сколько точек находится в массиве.

если я так делаю, (без преобразования координат) то при вызове функции MoveToEx(hdc,x1,y1,&pt); выдает ошибку. Главная проблема - получить координаты LOWORD(lParam) HIWORD(lParam) в виде, удобном к использованию в программе (например 100 200 или 200 300) а то в х1 и у1 записываются какие-то большие значения
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #8
если я так делаю, (без преобразования координат) то при вызове функции MoveToEx(hdc,x1,y1,&pt); выдает ошибку. Главная проблема - получить координаты LOWORD(lParam) HIWORD(lParam) в виде, удобном к использованию в программе (например 100 200 или 200 300) а то в х1 и у1 записываются какие-то большие значения

Я на винапи давно не програмил поэтому подумал, что чегото не понимаю. Запустил студию. Создал вот такие глобальные переменные
bool key=false;
int x1,y1,x2,y2;
Потом обработал вот такие сообщения
case WM_LBUTTONDOWN:
x1=LOWORD(lParam);
y1=HIWORD(lParam);
break;
case WM_LBUTTONUP:
x2=LOWORD(lParam);
y2=HIWORD(lParam);
key=true;
InvalidateRect(hWnd,NULL,TRUE);
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
if(key==true)
{
MoveToEx(hdc,x1,y1,NULL);
LineTo(hdc,x2,y2);
}

EndPaint(hWnd, &ps);
break;
В итоге рисуется линия между двумя точками. Я не понял зачем нам нужно преобразование координат? Вроде и так все замечательно работает.
 
  • 🔴 06:33 Повітряна тривога в Харків.обл.
  • #9
Agentx86

Большое спасибо, все получилось, я потом создал 2 масива, в один из которых записывал координаты точка начала отрезка, а в другой координаты конца. Теперь все работает отлично!
Только я не могу сделать чтобы во время движения с нажатой кнопкой мыши, линия линия перерысовывалась. Я делаю так:
case WM_MOUSEMOVE:

if(wParam & MK_LBUTTON )
{
InvalidateRect(hWnd,NULL,TRUE);
};

и тут

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);
if(key==true)
{
for(int k=0; k<=i; k++)
{
MoveToEx(hdc,point_b[k].x,point_b[k].y,NULL);
LineTo(hdc,point_e[k].x,point_e[k].y);
};
};

if(wParam & MK_LBUTTON )
{
SelectObject(hdc, GetStockObject(BLACK_PEN));

MoveToEx(hdc,point_b.x,point_b.y,NULL);

LineTo(hdc, LOWORD(lParam),HIWORD(lParam));

};
но линия не перерисовывается, а мигает, при чем когда я останавливаю мышь - нет текущей линии (которую я рисую)

Все, сам разобрался!
Спасибо всем за помощь!
Все работает отлично!!!!!!!
 
Назад
Зверху Знизу