Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» C++ WinAPI

Автор: ShIvADeSt
Дата сообщения: 17.04.2004 03:14

Цитата:
АК ВОТ! все красиво рисуется, быстро, но! если начинать баловаться и взять мышкой уголок окошка и начать быстро водить по всему экрану, иногда вылазят офигенные клюки - окно перестает прорисовываться нормально, пропадают иконки с рабочего стола

То же самое и у меня в том же самом случае. Единственный способ ИМХО это использовать скины, то есть вместо того чтобы самому рисовать все создаешь набор картинок из кусков интерфейса и потом их уже отрисовываешь, я уже писал по этой теме в одном из топиков, если хочешь пиши в ПМ. Видно несмотря ни на что, когда винде приходитмя часто отрисовывать контекст устройства (ты ведь через DC рисуешь ) происходит утечка рисурсов, и в качесвте указателя на ДС возвращается не то число и границы у него не верные, попробуй поставить бейкпойнты и увидишь что когда происходит эта ерунда значение ДС становится совсем другим по сравнению с первоначальным. Несмотря на все попытки перехватывать это и закрывать все указатели. Так что я думаю именно по этому многие исполльзуют скины, а не врчуную рисуют сложные объекты.

react

Цитата:
подскажите плиз как определить ушла ли мыша за пределы какого-то окна, может
винда посылает сообщение об уходе мыши из окна.

Поставь обработчик движения мыши например по таймеру, и смотри через GetCursorPos, находится ли он внутри активного тебе окна, есть несколько способов или проверяй по границам или через PtInRegion, PtInRect.
Автор: react
Дата сообщения: 17.04.2004 03:32
ShIvADeSt
А сообщений что никаких не приходит ???
Автор: krisik
Дата сообщения: 17.04.2004 11:32

Цитата:
Видно несмотря ни на что, когда винде приходитмя часто отрисовывать контекст устройства (ты ведь через DC рисуешь ) происходит утечка рисурсов, и в качесвте указателя на ДС возвращается не то число и границы у него не верные, попробуй поставить бейкпойнты и увидишь что когда происходит эта ерунда значение ДС становится совсем другим по сравнению с первоначальным. Несмотря на все попытки перехватывать это и закрывать все указатели. Так что я думаю именно по этому многие исполльзуют скины, а не врчуную рисуют сложные объекты.


Я вообще-то именно через скины и делаю - в ресурсах есть 8 картинок, четыре - на углы, не маштабируются, 4 - на бордюр между углами, маштабируются, их и рисую каждый раз по нужным сообщениям.
Все потому и быстро рисуется, но... с такими глюками.
Было бы классно использовать нечто вроде CS_OWNDC но для неклиентской области...
но как - не знаю.
Автор: TeXpert
Дата сообщения: 18.04.2004 01:27
krisik
Попробуй с помощью Spy++ последить за сообщениями с твоими выкрутасами и без, отфильтровывая постепенно ненужные. Вообще, когда отрисовываешь то, что обычно делать должна система, легко что-нибудь забыть, да и ошибки/недоговорки (сокрытие информации?) в документации обычное дело.

react

Цитата:
Народ, помогите плиз:
подскажите плиз как определить ушла ли мыша за пределы какого-то окна, может
винда посылает сообщение об уходе мыши из окна. По крайней мере когда мыша
двигается внутри окна приходит сообщение WM_MOUSEMOVE.

Заранее сенькс !!!

Заглянул бы в Рихтера в первую очередь -- там мышиная возня хорошо описана.

Добавлено
vito333

Цитата:
ну есть вероятность неправильного определения юникода, так что? разве это критично?

Ещё как бывает критично.


Цитата:
Ты же посмотри - в своей программе я ставлю целью скорость и минимальный размер (кстати из 38 кб кода около 10-12 кб - ресурсы) с реализацией основных фич, присущих Notepad-клонам (я для себя так и решил, что mark - это заменитель Notepad-заменителей )).

Я сам любитель маленьких по весу программ, но если вопрос стоит о качестве и надёжности -- то пойду на увеличение веса.


Цитата:
Вот если бы от правильного определения кодировки по первым 2-3 словам зависело что-то важное и критичное, пришлось бы усиливать алгоритм определения.
А так конечно ты прав - но только где 100% вероятности?
Вероятность просто глюка в моей программе (да наверно и во многих других) с этой точки зрения просто огромна.

Тут дело даже не в глюках в твоей программе или ошибках функций Win API, а в принципиально неосуществимых вещах, в тех областях, где требуется надёжность. Тут сколько ни усиливай алгортим, ничего не поможет -- проблема лежит в другой области, а именно -- в проблемах кодирования. Вот прикидывай, до сих пор ведь не прекращаются попытки изобрести Perpetuum Mobile!


Цитата:
хм, я не спорю, все верно - наверно не стоит больше программированием заниматься - результат один - хаос


Цитата:
чего ж так печально!
-- это я твоими словами отвечаю. Ты не понял, о на чём я пытаюсь заострить внимание: просто есть вещи, принципиально неразрешимые, вот о них-то как раз не стоит забывать. Правильно отличать, где алхимия, а где точная наука, чего стоит делать и чего нет. А так, программируй себе на удовольствие.


Цитата:
Я и сам могу примеров привести, даже больше, наверное, чем ты...

Ну а кто мешал-то? Дело даже не в количестве, а в качестве, у нас, у математиков, говорят -- для опровержения достаточно одного контрпримера. Кстати, думаю, вручную все примеры не отловишь, поэтому

Цитата:
думаю неправильные песни больше не проскочат

будет весьма и весьма непросто осуществить (а по отдельным словам -- и вовсе бессмысленно)! Но всё же, успехов!


Цитата:
...продумывал трудные моменты

Ну, без этого никуда. Меня же смутило твоё безапелляционное

Цитата:
я же написал, что уже реализовал.

Думаю "смелый парень!".


Цитата:
Я вообще, кстати, не программер - это так, хобби

Я тоже.


Цитата:
...тем более, что прогу делаю именно минимальной, как уже писал, без рантаймов, со своей точкой входа и прочей минимизацией на VC++.NET

Тогда почему не ассемблер? Кстати, msvcrt всё же "цепляется".


Цитата:
...а это дико усложняет все - заморился иногда ошибки отлавливать.

А оно того стоило? Я бы сначала отладил как следует саму прогу, а потом бы занялся прибамбасами.
А так, когда свою первую Windows-программу писал, решил её делать самомодифицирующейся -- программа хранила результаты в exe-файле. В итоге она оказалась непереносимой на Win32 платформу -- там не разрешается модификация exe-файла (не путать с модификацией кода в памяти), запускается как Win16 приложение.


Цитата:
Вот только нафиг это мне?

Ты сам же ответил

Цитата:
...я уже убедился и сам решил ПОКА лишний раз с отрисовками не связываться.

Его величество опыт. Хотел то же примерное советовать. У начинающих часто привычка сразу быка за рога хватать (сам был когда-то такой, да вот никто меня не учил, приходилось самому, и ни Internet, ни FAQ там разных у меня тогда не было
Автор: vito333
Дата сообщения: 19.04.2004 02:45
TeXpert
ок, думаю теперь мы поняли друг друга.


Добавлено
кстати, вопрос с проверкой орфографии средствами ворда - как это реализуется?
Автор: ShIvADeSt
Дата сообщения: 19.04.2004 04:29
react

Цитата:
А сообщений что никаких не приходит

Я не нашел ни одного.
krisik
Попробуй отказаться от рисования в неклиентской части, а все делай в клиенте, глюков станет гораздо меньше, по крайней мере у меня когда я рисовал в NC прога падала на раз, не смотря ни на что, а вот когда я все что в неклиенте стал отрисовывать в клиенте, тоь есть заголовок бордюры и тд прога стала гораздо устойчивей, а так как ты юзаешь картинки, то у тебя она вообще по идее должна работать хорошо (кстати рисуешь на деюсь в Off-screen DC?) Иначе моного глюков будет это мне подсказал один человек из форума спасибо ему когда я все стал делать так, не стало мерцания при частой отрисовке и все шустрее работает
Автор: krisik
Дата сообщения: 19.04.2004 15:57
ShIvADeSt

Цитата:
когда я все что в неклиенте стал отрисовывать в клиенте, тоь есть заголовок бордюры и тд прога стала гораздо устойчивей, а так как ты юзаешь картинки, то у тебя она вообще по идее должна работать хорошо


т.е. ты вообще создавал окно без заголовка/бордюров а внутрях уже сам все рисовал?
а как ты делал чтобы у при наведении на новый бордюр - который в клиенте - менялся курсор мыши, размер проги можно было менять и т.п.? через postmessage и WM_HITTEST?


Цитата:
(кстати рисуешь на деюсь в Off-screen DC?)


пока нет. это может спасти от описанных глюков?


Цитата:
Иначе моного глюков будет это мне подсказал один человек из форума спасибо ему когда я все стал делать так, не стало мерцания при частой отрисовке и все шустрее работает


беспокоит то, что нужно будет очень настоичиво говорить винде, что вот это - бордюр...


Кстати! Мне нужно будет все что написано в винапишном приложении переносить в mfc-шное, это реально без геммороя?
Как мне приписать обработку неклиентских сообщений?
Автор: ShIvADeSt
Дата сообщения: 20.04.2004 00:52

Цитата:
.е. ты вообще создавал окно без заголовка/бордюров а внутрях уже сам все рисовал

Да

Цитата:
а как ты делал чтобы у при наведении на новый бордюр - который в клиенте - менялся курсор мыши, размер проги можно было менять и т.п.? через postmessage и WM_HITTEST?

А какая разница есть неклиентская область или нет по идее курсор все равно меняться должен, в крайнем случае поставь условие на движение и если мышь на краю окна меняй курсор, на WM_NCHITTEST вообще не заморачивайся, ИМХО глючит сильно.

Цитата:
ока нет. это может спасти от описанных глюков?

От всех не знаю, но от многих да. Опять же если отказаться от неклиентской области, так как рисоване в неклиенте очень мерцает при быстром движении.

Цитата:
беспокоит то, что нужно будет очень настоичиво говорить винде, что вот это - бордюр.

А зачем это говорить винде, сам обрабатывай

Цитата:
стати! Мне нужно будет все что написано в винапишном приложении переносить в mfc-шное, это реально без геммороя?

Не знаю, пишу на Дельфи
Автор: TeXpert
Дата сообщения: 20.04.2004 22:45
vito333

Цитата:
кстати, вопрос с проверкой орфографии средствами ворда - как это реализуется?

Понятия не имею, так как не люблю сей шедевр. Ещё раз повотрюсь -- не проще использовать вещи типа WinOrfo -- она сама встраивается куда надо, да и MS Word вроде лицензирует её (если не ошибаюсь).

А если сам хочешь реализовать -- в MS Word, насколько мне известно, этим занимается просто другой поток, в фоновом режиме, грубо говоря. Вполне и сам можешь реализовать, если у тебя свой словарь есть.
Автор: react
Дата сообщения: 23.04.2004 08:38
Народ, тут такая проблема - пишу мультипотоковую прогу, причем есть три потока
(кроме основного), которые должны записывать некоторые данные каждый в свой
ListView control. Причем для создания и завершения потоков используются функции
_beginthreadNT и _endthread - для совместимости с сишными библиотеками...
Так вот, когда создаю очередной поток передаю ему как аргумент hwnd ListView -
проверял, передается все нормально, только вот в потоке при вызове функции
добавления в ListView строки ничего не добавляется
Переписал этот же кусок кода через CreateThreadEx - все нормально...

Может я чего не учел, может есть какие-то особенности использования API функций
в потоках стартанутых через _beginthreadNT ???


Помогите разобраться... Очень надо... Заранее спасибо !!!
Автор: vito333
Дата сообщения: 24.04.2004 17:38
такая проблема:
содрал у Петзольда функцию печати, а на печать вместо русских букв идут знаки вопроса ...
не могу пока ничего поделать ...
может кто подскажет, где копать .
Автор: TeXpert
Дата сообщения: 24.04.2004 22:55
vito333

Цитата:
...на печать вместо русских букв идут знаки вопроса ...

Скорее всего, проблема в кодировке шрифта
Автор: vito333
Дата сообщения: 26.04.2004 06:22
TeXpert
это понятно, но я вроде все что можно и в ANSI_charset, и в RUSSIAN_charset ставил - нифига...
я только один раз создаю CreateFontIndirect-ом фонт - потом им инициализирую ричедит окно - тут тже разные код. страницы пробую - нифига ...
как обычно - мелочь какая-то, а раскопать пока не могу ...
Автор: ShIvADeSt
Дата сообщения: 26.04.2004 06:59
vito333
Попробуй содрать из Bred2 там вроде все нормально идет
Автор: vito333
Дата сообщения: 07.05.2004 17:08
ShIvADeSt
оказывается, если раскладка клавы русская, все проходит на печать ровно, если англ, то вопросики - отсюда вопрос, что же, перед печатью ставить русскую раскладку что-ли? или еще есть варианты?
Автор: ShIvADeSt
Дата сообщения: 08.05.2004 00:33

Цитата:
оказывается, если раскладка клавы русская, все проходит на печать ровно, если англ, то вопросики - отсюда вопрос,

А это что за покемон . Как печатаешь какими функциями? Попробуй сравнить реализацию с хелпом, может где косячок какой, если сможешь дай код печати вместе покопаем, пока время есть.
Автор: react
Дата сообщения: 08.05.2004 01:56
ShIvADeSt

Цитата:
Поставь обработчик движения мыши например по таймеру, и смотри через GetCursorPos, находится ли он внутри активного тебе окна, есть несколько способов или проверяй по границам или через PtInRegion, PtInRect.


Я так и сделал, да только вот в чем проблема: если мое окно перекрывается другим, то
PtInRect говорит что я попадаю в Rectangle, хотя мыша физически находится в другом
окне... Я уже пробовал обрабатывать WM_NCHITTEST, но єто сообщение почемуто не
приходит, когда я двигаю мышой по окну перекрывшему мое - хотя в доке сказано что
DefWindowProc должна возвращать значение HTTRANSPARENT если мыша лазит по
окну перекрывшему мое(по крайней мере я так понял...)

Помогите плиз кто-нибудь, а то уже над этой проблемой целую неделю, а то и больше,
голову ломаю
Автор: ShIvADeSt
Дата сообщения: 11.05.2004 00:13

Цитата:

Я так и сделал, да только вот в чем проблема: если мое окно перекрывается другим, то
PtInRect говорит что я попадаю в Rectangle, хотя мыша физически находится в другом
окне...

Все правильно, так как она находится в ректе нужного тебе окна. Предлагаю так, если переднее окно не твое то мышь считаем за пределами твоего окна, иначе проверяем находится ли она в ректе
Автор: vito333
Дата сообщения: 11.05.2004 02:47
ShIvADeSt
отправил почту
Автор: krisik
Дата сообщения: 11.05.2004 14:48
Подскажите, может не копироваться изображение из памяти на экран в следующем куске:


Код: hdc = BeginPaint(hWnd, &ps);
GetWindowRect(hWnd,&lp);
hdcMem=CreateCompatibleDC(hdc);

lp.bottom=lp.bottom-lp.top;
lp.top=0;
lp.right=lp.right-lp.left;
lp.left=0;

hBrush[0]=CreateSolidBrush(RGB(0,0,200));
hBrush[1]=CreateSolidBrush(RGB(255,255,255));
SelectObject(hdc,hBrush[1]);
SetMapMode(hdcMem,GetMapMode(hdc));
PatBlt(hdc,0,0,lp.right,lp.bottom,PATCOPY);
SelectObject(hdc,hBrush[0]);
PatBlt(hdcMem,0,0,lp.right,lp.bottom,PATCOPY);

BitBlt(hdc,0,0,100,100,hdcMem,0,0,SRCCOPY);

SelectObject(hdcMem,GetStockObject(BLACK_PEN));
for(i=0; i<1; i++) DeleteObject(hPen[i]);
SelectObject(hdcMem,GetStockObject(WHITE_BRUSH));
for(i=0; i<2; i++) DeleteObject(hBrush[i]);

DeleteDC(hdcMem);
EndPaint(hWnd, &ps);

Автор: ShIvADeSt
Дата сообщения: 11.05.2004 23:55

Цитата:
SelectObject(hdc,hBrush[1]);

Опасно работаешь, надо сохранять все старые хэндлы, иначе потом хлопот не оберешься, что то вроде этого
hBrushOld:=SelectObject(hdc,hBrush[1]);
Автор: react
Дата сообщения: 12.05.2004 00:23
ShIvADeSt

Цитата:
Все правильно, так как она находится в ректе нужного тебе окна. Предлагаю так, если переднее окно не твое то мышь считаем за пределами твоего окна, иначе проверяем находится ли она в ректе


Если б ты подсказал как определить, что окно не мое, я б тебе был бы очень
признателен... Но учти плиз то, что это MDI приложение, то-есть окон там и моих тоже
куча (вопрос может глупый, но я просто с данной проблемой ни разу не сталкивался,
а опыт он, как говорится, как и импотенция, приходит с возрастом )
Автор: TeXpert
Дата сообщения: 12.05.2004 00:52
react

Цитата:
...как определить, что окно не мое

Моё-не моё. Определяй через HANDLE, при создании всякого окна возвращается такое чудовище. Да и куча функции работы с ними -- глянь в MSDN (Platform SDK). А вообще, чем мучаться, проштудировал бы хорошенько книгу Рихтера (звиняй за настойчивость -- это вызвано твоими же вопросами!), там замечательно всё описано -- и мышиная возня, и про объекты ядра (а HANDLE -- описатели относятся к ним). Есть и другие способы.
Автор: react
Дата сообщения: 12.05.2004 01:00
TeXpert

Цитата:
А вообще, чем мучаться, проштудировал бы хорошенько книгу Рихтера

Какую из них ??? Если есть ссылка на книгу в электронном варианте - кинь плиз...

Заранее сенькс
Автор: TeXpert
Дата сообщения: 12.05.2004 01:09
react
У него не так уж и много книг. Можно 3-е, или 4-е издание. Глянь тут: hxxp://anatolix.naumen.ru/win32books.htm

P. S. А гуглить не пробовал?
Автор: react
Дата сообщения: 12.05.2004 01:52
TeXpert

Цитата:
У него не так уж и много книг. Можно 3-е, или 4-е издание

Ну, 4-е издание я читал, и мышинной возни там в упор не видел !!! Если она у кого и
описана, так у Петзольда... до там я не нашел решения своей проблемы...

А каким образом определить HANDLE окна в котором находится мыша ??? Есть может
какая функция ???
Автор: ShIvADeSt
Дата сообщения: 12.05.2004 02:26

Цитата:
А каким образом определить HANDLE окна в котором находится мыша ??? Есть может
какая функция ???

Как понять,окно в котором находится мыша, если окно под мышью, то тебе надо WindowFromPoint(TPoint), иначе используй GetForeGroundWindow так как она вернет верхнее активное окно котору и будет принадлежать мышь.
Автор: Tartrout
Дата сообщения: 12.05.2004 18:57
А как повеситься на мышиное событие чтобы обработчик срабатывал при движении мыши вне окна моей программы?
Автор: ShIvADeSt
Дата сообщения: 12.05.2004 23:53

Цитата:
А как повеситься на мышиное событие чтобы обработчик срабатывал при движении мыши вне окна моей программы?

Чиатй выше это как раз и обсуждается с react
Автор: vito333
Дата сообщения: 13.05.2004 03:13
react
кстати, я недавно нарыл где-то Рихтера не 4-е издание,как везде, а еще какой-то первый вариант, точно не смотрел, но по-моему, еще все примеры и описание на С.
Могу намылить, если интересно (или выложить) ...
Хотя у него и в 4-м все понятно, на С++ ...

Страницы: 12345678910111213141516171819202122232425262728293031323334353637

Предыдущая тема: посоветуйте книги по SQL


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.