nikedeforest
|
|
« : 04-11-2005 10:35 » |
|
Вот такой вопрос возник. Есть окно-родитель, на него кинут статик размером 200(высота)х400(ширина). На этом статике рисуется график (не спрашивайте почему именно на статике ). Так вот, иногда график выходит за пределы статика и прорисовывается на окне-родителe. Я не спрашиваю, как так случилось, что график не вписался в статик (знамо как ), масштабирование графика сделать не проблема. Интересует другое: по какой такой причине график вырисовывается на окне-родителе, если используется контекст дочернего окна. Для рисования графика используется доморощенная функция, которая получает в качестве параметров HWND статика и значения, которые надо выводить. Эта функция создает контекст GetDC(hwnd), при этом используется хендл статика. Для рисования использщуются функции SetPixel(), MoveTo(), LineToEx(). Я думал, что если произойдет выход за статик, то график усекется, т.е. ничего не будет нарисовано, но все случилось наоборот. График рисуется и на статике и рисуется продолжение на родителе. Как так?, ведь используется контекст статика, а не родителя. У меня была идея, что окно-родитель контролирует рисование на дочернем окне и имеет очень много информации о нем и возможно контекст статика - это контескт родителся, только отсекается регион, в котором пересчитываются координаты (под пересчетом имеется ввиду, что когда рисуем на статике коордлината (0;0) соответсявует верхнему левому углу статика). Но она кажется неверна. Хотелось бы узнать ответ на этот вопрос, почему вообще так происходит. p.s. пишу на АПИ.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 04-11-2005 10:50 » |
|
Быть не может. Ищи ошибку. Или размеры статика меняются и ты только думаешь, что происходит выход за его границы, или же используется DC родителя. Кидай код.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 04-11-2005 11:02 » |
|
нарисуй чёрный прямоугольник на статике - в размер статика - и увидишь, где выход за границы. Корректировать-с
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #3 : 04-11-2005 11:03 » |
|
Быть не может. Ищи ошибку.
. кидаю код. Рисует функция draw_graph
|
mail.tgz (38.38 Кб - загружено 897 раз.)
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #4 : 04-11-2005 11:06 » |
|
нарисуй чёрный прямоугольник на статике - в размер статика - и увидишь, где выход за границы. Корректировать-с
Алексей, а я там и фон рисую и он немного выходит за размеры статика. Скорректировать не проблема, интересен ответ на вопрос, почему происходит рисование на окне-родителе.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 04-11-2005 11:16 » |
|
(меня ЧУЖИМ обозвали )) ) не знаю, пишу : SetPixel(hdc,0,0,RGB(255,0,0)) ; - исправно ставит точку вверху слева на чёрной рамке а ещё при первом появлении окна у тебя нет автоперерисовки - нужно закрыть окно чем нибудь, чтоб перерисовалось
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #6 : 04-11-2005 11:27 » |
|
А чего делать то надо? ЧТоб график увидеть?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #7 : 04-11-2005 12:29 » |
|
А чего делать то надо? ЧТоб график увидеть?
Вот хотел спросить и не стал (а зря), нужна ли к этой проге инструкция. Для начала, прогу надо обучить. Для этого в самом правом едите (справа от кнопки "начать обучение") необходимо ввести пароль. В маленьком едите (слева от кнопки "начать обучение") необходимо ввести количество раз, которое будет проводится обучение. Далее, в самом левом едите вводишь пароль, подтверждая его нажатием клавиши Enter. Учитывается время нажатия клавиши и интервал между нажатиями клавиш (в том числе и для Enter). Пароль в сам левом едите будешь вводить столько раз, сколько поставил на обучение (цифра в маленьком едите). Для того, чтобы не быть чужим , пару раз введите пароль медленно(но не слишком, а то графики будут просто ужас) и пару раз максимально быстро. Для того, чтобы график выщел за пределы статика не обходимо вводить пароль по медленнее (интервал нажатия клавиши > 200 mc). Поэкспериментируйте короче . SetPixel(hdc,0,0,RGB(255,0,0)) ; - исправно ставит точку вверху слева на чёрной рамке
а теперь задай координаты (0;-20), увидишь точку чуть выше статика. Вот в этом и прикол. а ещё при первом появлении окна у тебя нет автоперерисовки - нужно закрыть окно чем нибудь, чтоб перерисовалось
Там с этим вообще беда. Окно еще много где не перерисовывается. Вообще праильно работать с WM_PAINT - это оказывается целая наука.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 04-11-2005 14:13 » |
|
Ок, я конечно не знаток API, но мне кажется ты слишком вольно создаёшь окна. В стилях у тебя указан только WS_CHILD. А ведь если это контролл, то должны быть другие стили. У родительского окна тоже - ведь ты не можешь просто так кидать одни окна на другие не обращая внимания на стили. Посмотри внимательно - у меня просто нет времени с этим разбираться - в коце концов это теория. Я просто глянул MSDN - например WS_CLIPSIBLINGS Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window. или WS_CLIPCHILDREN Excludes the area occupied by child windows when drawing occurs within the parent window. Я просто попробовал в static_text void CreateControl(HINSTANCE hInst,HWND hw_parent,int x, int y, int width, int height,LPCTSTR winname) { hw_par=hw_parent; hwnd=CreateWindowEx(NULL,"STATIC",winname,WS_CHILD[b]|WS_CLIPSIBLINGS[/b],x,y,width,height,hw_parent,NULL,hInst,0); ShowWindow(hwnd,SW_SHOW); };
графики перестали залазить на кнопку и вообще вверх. Короче в этом направлении копай.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #9 : 04-11-2005 14:46 » |
|
Сейчас убегаю, тьолько завтра смогу все проверить, осознать и скорре всего еще пару вопросов задать. Спасибо.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #10 : 04-11-2005 14:46 » |
|
зы Ещё одно - почему ты вызываешь MessageBox(0, ... ? У тебя же есть хэндл на окно - MessageBox(hWnd, ... - гораздо лучше.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #11 : 04-11-2005 14:50 » |
|
зы Ещё одно - почему ты вызываешь MessageBox(0, ... ? У тебя же есть хэндл на окно - MessageBox(hWnd, ... - гораздо лучше.
Я прбовал и так и так. НЕ увидел в чем разница (визуально) и лень стало лишние буквы набивать . А чем лучше, что MessageBox будет принадлежать кому-то?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 04-11-2005 15:07 » |
|
А ты попробуй в твоей версии окно MessageBox с места на место перетащить.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #13 : 05-11-2005 14:37 » |
|
При перемещении, MessageBox(hWnd) оказывается на заднем фоне, т.е. за родителем. Я вообще-то ожидал другого, что MessageBox не будет выходить за рамки окна родителя. Но тем не менее, в чем удобство-то, неужели только в этом?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 07-11-2005 09:24 » |
|
nikedeforest, Чтобы окно не выходило за рамки родителя оно должно быть ребёнком этого родителя. Этого в данном случае не требуется. Это тебе повезло - у тебя окно сообщения стояло на краю основного окна и ты увидел, что оно прыгает под основное окно. А разверни основное окно на весь экран или просто передвинь его в центр. А теперь представь себе юзера, который хочет перетащить окно, а оно при этом исчезает. Его реакцией будет в лучшем случае - выдернуть сетевой кабель из розетки. В худшем - вызовут неотложку. Или ты считаешь это нормальным? Потом - пожалуй самое главное - у тебя нарушается модальность. Если я показываю подобное сообщение, то заставляю пользователя выбрать только один вариант ответа на данном этапе выполнения программы. У тебя же можно просто послать это окошко и работать с прогой дальше - например нажимать много раз на ту же кнопку, плодя сотни таких же окон. В общем у меня такое ощущение, что ты где-то что-то в теории упустил. Пройдись ещё разок.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
|