Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Открыть новую тему     Написать ответ в эту тему

V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Похоже, но измерения показали что ChannelRect выдает значения немного больше реального хода ползунка.
Как узнать или посчитать точную длину хода ползунка?

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 06:56 09-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
ChannelRect выдает значения немного больше реального хода ползунка

Случаем, не на ширину ползунка больше?

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 08:55 09-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Похоже на то
спасибо.

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 17:30 09-02-2011 | Исправлено: V0lt, 17:32 09-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, как узнать положение и размер прямоугольника обычного текста (CTEXT)?

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 23:28 10-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Имеется в виду элемент диалога? Тогда можно через GetWindowRect(GetDlgItem()).

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 23:38 10-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да обычный текст.
 
Задача в следующем. На диалоге есть текст
CTEXT  "Balance",IDC_STATIC_BALANCE,180,19,75,8
Надо обработать двойной клик по этому тесту.
Сейчас есть такой обрабочик:

Код:
void CPPagePlayback::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    if (???)
        m_balancectrl.SetPos(0);
}

Я хочу получить координаты IDC_STATIC_BALANCE проверять попадает ли в них point. Пока не понял как правильно это делать. Хотя может быть есть другой способ.

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 07:10 11-02-2011 | Исправлено: V0lt, 17:10 11-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Ну, как-нибудь так:

Код:
CWnd *h=ChildWindowFromPoint(point);
if(h!=NULL && h->GetDlgCtrlID() == IDC_STATIC_BALANCE)
 
 
PS. Если точка в экранных координатах, надо будет сначала преобразовать её в оконные через ScreenToClient().

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 09:19 11-02-2011 | Исправлено: Abs62, 09:24 11-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
В последнем примере условие не срабатывает. У меня сомнения, что в h передается ID нужной строки теста.
 

Цитата:
Тогда можно через GetWindowRect(GetDlgItem())

А можно чуток подробнее.

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 20:41 11-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
У меня сомнения, что в h передается ID нужной строки теста.

Здесь несколько по-другому делается. Ищется окно, которому принадлежит заданная точка, а потом его ID сравнивается с искомым.

Цитата:
А можно чуток подробнее.


Код:
CRect r;
CWnd *h=GetDlgItem(IDC_STATIC_BALANCE);
  if(h!=NULL) {
    h->GetWindowRect(&r);
    if(r.PtInRect(point)) ...
  }
 
 
Здесь точка толжна задаваться в экранных координатах.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 21:00 11-02-2011 | Исправлено: Abs62, 21:01 11-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Возможно я тебя немного запутал, поэтому немного пояснений.
PPagePlayback часть окна настроек. Текст IDC_STATIC_BALANCE находится на ней.

Нужно по двойному клику на "Balance" изменить положение нижележащего ползунка.
 
CPPagePlayback::OnLButtonDblClk срабатывает по двойному клику. point выдает координаты курсора внутри PPagePlayback.
 
h->GetWindowRect(&r);
В r у меня получаются координаты и размеры той части окна, в которой находится PPagePlayback. Я щелкаю по любому тексту, r естественно всегда одинаковая пока само окно не сдвинешь.
Вообщем метод с GetWindowRec тут не работает
 
С вариантом ChildWindowFromPoint аналогично. Есть ощущение, что Window в названии функций не зря указан.

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 22:20 11-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Возможно я тебя немного запутал, поэтому немного пояснений.

Да я уж догадался, о чём речь.

Цитата:
h->GetWindowRect(&r);  
В r у меня получаются координаты и размеры той части окна, в которой находится PPagePlayback.

Должны быть координаты элемента "CTEXT "Balance"...". Для того и делается CWnd *h=GetDlgItem(IDC_STATIC_BALANCE).

Цитата:
Я щелкаю по любому тексту, r естественно всегда одинаковая пока само окно не сдвинешь.  

Само собой. Элемент-то по окну не ползает, это point меняется.

Цитата:
Вообщем метод с GetWindowRec тут не работает

Не попадает в окно или всегда попадает?
Пересчитать point в экранные координаты не забыл? Она ж в оконных координатах в OnLButtonDblClk подаётся.

Код:
ClientToScreen(&point);
 
 
PS. Проверь в отладчике, что получается в r и что в point. Может, надо ещё вызвать NormalizeRect.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 23:07 11-02-2011 | Исправлено: Abs62, 23:15 11-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Метод с ChildWindowFromPoint дает такой прямоугольник
r1    {top=323 bottom=417 left=716 right=1145}
он неправильный. Если сделать ClientToScreen(&point), то вообще не работает.
 
Метод с GetDlgItem после ClientToScreen(&point) выдает такой прямоугольник
r2    {top=346 bottom=359 left=978 right=1091}
Он правильный (113x13) , тоже самое выдает плагин Task Manager в Total Commander.
 
Хотя в ресурсах указано 75x8 и откуда взялось 113x13, я чего-то не догнал
 
вот рабочий код:

Код:
void CPPagePlayback::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    ClientToScreen(&point);
    CWnd *h=GetDlgItem(IDC_STATIC_BALANCE);
    if(h!=NULL)    {
        CRect r;
        h->GetWindowRect(&r);
        if(r.PtInRect(point)) {
            m_balancectrl.SetPos(100);
            SetModified();
        }
    }
}

Спасибо за помощь!

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 09:46 13-02-2011 | Исправлено: V0lt, 10:09 13-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Хотя в ресурсах указано 75x8 и откуда взялось 113x13, я чего-то не догнал

В ресурсах размеры элементов указываются не в пикселях, а в DTU - dialog template units. При отображении диалога система пересчитывает их в пиксели с учётом заданного в шаблоне диалога шрифта. Смотри How to calculate dialog box units based on the current font in Visual C++.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 13:10 13-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Все равно не догнал откуда лишние 38(!) пикселей по ширине, ну да ладно.
 
Есть другая проблема. Есть слайдер ориентированный горизонтально. Выбираю его, делаю прокрутку мышью. Кручу верх, слайдер едет влево, вниз - вправо! Какой гад так сделал?   И даже опции не оставил, чтобы поменять такое несуразное поведение!
Есть решение?

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 20:04 14-02-2011 | Исправлено: V0lt, 20:07 14-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt

Цитата:
Какой гад так сделал?

Bill Gates.

Цитата:
Есть решение?

Задай ему стиль TBS_DOWNISLEFT.

Цитата:
TBS_DOWNISLEFT
By default, the trackbar control uses down equal to right and up equal to left. Use the TBS_DOWNISLEFT style to reverse the default, making down equal left and up equal right.


----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 20:29 14-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Задай ему стиль TBS_DOWNISLEFT.  

Спасибо. В редакторе ресурсов такого нет . Я сам только эту опцию нашел с большим трудом. Решение, как я понял, не всегда помогает, но у меня работает без проблем.
 
Еще вопрос.
Допустим на левой кнопке мыши сидит некоторая команда. Я нажимаю правую кнопку, выходит контекстное меню. Нажимаю левую в произвольном месте (чтобы не выбирать никакой пункт меню и закрыть его), меню исчезает и срабатывает команда. А мне не надо чтобы команда в этом случае срабатывала.
1. Можно ли определить, вызвано ли в текущий момент контекстное меню? Т.е. если вызвано, то команду не выполнять. (Есть конечно подозрение, что во время проверки меню уже исчезнет и толку будет ноль)
2. Можно ли сделать свой обработчик, на закрытие меню? Чтобы в этом обработчике прибить событие вызвавшее его, т.е. никуда дальше нажатие ЛКМ не отправлять. Или это нереально?

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 21:09 14-02-2011 | Исправлено: V0lt, 21:37 14-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
V0lt
Да нету такого события - "закрытие меню". Вся обработка идёт внутри API-функции TrackPopupMenu.
Разве что попробовать после возврата из неё (прямо в обработчике WM_RBUTTONDOWN) выдернуть из очереди сообщений WM_LBUTTONDOWN, если оно там есть.

Код:
MSG msg;
PeekMessage(&msg, hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE);



----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 22:09 14-02-2011 | Исправлено: Abs62, 22:13 14-02-2011
asi81



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день!
 
Казалось бы тривиальная задача. Но не могу чтото сразу найти.
 
Я в своем приложении запускаю CreateProcess --  cmd /c anyscript.bat и в создаю три пайпа для стандартных потоков вывода ввода и ошибок.  
 
STARTUPINFO start;
CreatePipe(&ReadPipe, &start.hStdOutput,&Security, 0);
CreatePipe(&start.hStdInput, &WritePipe,&Security, 0);
CreatePipe(&ErrorPipe,&start.hStdError, &Security, 0));
 
Когда скрипт выполняется я должен из него получать текстовый вывод и печатать его в своей программе. Вопрос - как мне сделать так, чтобы читать потоки hStdOutput и hStdError в правильном порядке. тоесть выводить текстовую инфу в свое окно в том порядке, в котором она появлялась в cmd.exe.  
 
Можно сделать проще, не делать отдельный пайп  для потока ошибок, а приравнять  hStdError  к hStdOutput в STARTUPINFO, но я хотел бы показывать цветом, какая информация была из обычного выходного потока, а какая из потока ошибок.
 
 

Всего записей: 86 | Зарегистр. 08-06-2009 | Отправлено: 18:01 15-02-2011
Abs62



Gold Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
asi81
Может, проверять в цикле наличие данных в том и другом пайпе через PeekNamedPipe? Где данные появились - там и читать.

----------
0 программистов ругал сердитый шеф
Потом уволил одного, и стало их FF

Всего записей: 6080 | Зарегистр. 22-10-2005 | Отправлено: 18:51 15-02-2011
V0lt



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Abs62
Поставил в функцию OnMenu сразу после вызова TrackPopupMenu, вместо hWnd написал NULL (правильно ведь?). Вроде работает. Потестю немного...
 
Если я кроме WM_LBUTTONDOWN захочу обрать другие сообщения, мне надо несколько раз запускать PeekMessage? Там есть маски, но это больше похоже на начало и конец диапазона сообщений.

Всего записей: 10506 | Зарегистр. 05-02-2003 | Отправлено: 19:30 15-02-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование с использованием WinAPI


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru