Tab
Здравствуйте, comp.
Помогите нарисовать на закладке. Если есть рабочий пример, буду
признателен.
← Сентябрь 2005 → | ||||||
2
|
||||||
5
|
6
|
7
|
11
|
|||
14
|
||||||
24
|
||||||
28
|
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
Здравствуйте, comp.
Помогите нарисовать на закладке. Если есть рабочий пример, буду
признателен.
Здравствуйте, Victor.
Этот кусок кода, будет работать если его поместить в OnInitDialog()?
Здравствуйте !
Будет, но результата не увидите, т.к. WM_INITDIALOG приходит _перед_
тем, как диалог будет виден. И отработает этот код только 1 раз.
Для того, чтобы "картинка" была постоянной, необходимо обрабатывать
сообщение WM_PAINT (визард MFC создает обработчик OnPaint) и в этом
обработчике производить отрисовку. Т.к. Вм надо рисовать на дочернем
окне диалога - на Tab-е, то код, приведенный выше надо поместить в
обработчик WM_PAINT этой табы. В терминах MFC это обычно означает:
1. Создать свой класс, понаследованный от CTabCtrl.
2. Создать в этом классе обработчик - OnPaint (2 раза кликнуть
в визарде).
3. В OnPaint реализовать код для рисования (тот же кусок что и выше,
например).
4. Осуществить сабклассинг окна своего Tab. Самый простой способ
для диалога - просто заменить класс объекта с CTab на свой.
То есть на пальцах:
1. В редкторе ресурсов кидаем на диалог контрол Tab.
2. Делаем свой класс, Tab-а (например, CMyTabCtrl), реализуем OnPaint
(см. выше).
2. В классе диалога жмем Ctrl+W, добавляем объект для контрола,
но класс объекта выбираем CMyTabCtrl.
Все заработает.
Здравствуйте, Victor.
Спасибо всем. Рисую...
Hello All,
Почему с помощью SendMessage, либо PostMessage не удается воспроизвести копирование.
С
помощью Spy++ смотрю что надо послать для этого. Затем тому же окну посылаю:
Sleep(3000); //чтобы успеть вывести в фокус нужное окно
::PostMessage((HWND)0x20672, WM_KEYDOWN, (int)0x11, (LPARAM)0x1D0001);
Sleep(1);
::PostMessage((HWND)0x20672, WM_KEYDOWN, (int)0x43, (LPARAM)0x2E0001);
Sleep(1);
::SendMessage((HWND)0x3088C, WM_DRAWCLIPBOARD, (int)0x408D2, (LPARAM)0);
Sleep(1);
::PostMessage((HWND)0x20672, WM_KEYUP, (int)0x43, (LPARAM)0xC02E0001);
Sleep(1);
::PostMessage((HWND)0x20672, WM_KEYUP, (int)0x11, (LPARAM)0xC01D0001);
Sleep(1);
Затем в том же Spy++ сравниваю естественное нажатие и программное:
идентичность
абсолютная, только в окне, в котором производилось копирование ничего не копируется.
При
этом туда вставляется "с" как буд-то Ctrl не нажимался. Проблему можно решить
с помощью
keybd_event((BYTE)0x11, 0, 0, 0); вместо нажатия Ctrl, но мне хотелось бы
все решть с
пом. PostMessage и SendMessage.
Люди, поделитесь своими соображениями.
Здравствуйте !
А окно это твоего процесса, или чужого ?
Можно попробовать получить состояние клавишь через GetKeyboardState,
сохранить его, установить новое состояние (SetKeyboardState), но
уже с "нажатой" Ctrl, вызвать твой код (только везде вместо
PostMessage использовать SendMessage), потом снова вернуть прежнее
состояние через SetKeyboardState.
Здравствуйте, Victor.
Saturday, September 17, 2005, 11:01:32 PM, Вы писали:
Почему - то не могу переключить не одной клавиши на клавиатуре следующим образом:
BYTE aKBState[256];
GetKeyboardState(aKBState);
aKBState[VK_SCROLL]=!(BOOL)::GetKeyState(VK_SCROLL);
SetKeyboardState(aKBState);
Лампочка отвечающая за скрол не мигает :(.
P.S. Извиняюсь за долгое молчание. Теперь никакой аппендицит не помешает
мне вовремя
отвечать. Его уже нету :)
Хаю ду ю ду Deni_S?
Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:
SetKeyboardState работает в win9x, в winnt надо юзать keybd_event.
Здравствуйте, Александр.
Sunday, September 25, 2005, 10:23:32 PM, Вы писали:
Понятно
Hello форум,
как узнать, что очередь сообщений для чужого окна на ввод с клавиатуры
пуста.
::GetQueueStatus(QS_KEY) работает только для данного потока. Подключение
с помощью
AttachThreadInput не помогает похоже. Пытаюсь с пом. PeekMessage - та же история.
EstPause=2;
if (!AttachThreadInput(::GetWindowThreadProcessId(par, 0),
::AfxGetThread( )->m_nThreadID, TRUE)){
AfxMessageBox("Не удается подключиться к потоку");
}
int coun=0, res=0;//
MSG msg;
/*while (::GetQueueStatus(QS_KEY)/*::GetInputState()){
coun++;//
Sleep(EstPause);
}*/
//WaitMessage();
res=::PeekMessage(&msg, par, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);
while (res>0){
coun++;//
Sleep(EstPause);
res=::PeekMessage(&msg, par, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);
}
if (res==-1) AfxMessageBox("PeekMessage не работает");
res=::PeekMessage(&msg, chil, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);
while (res>0){
coun++;//
Sleep(EstPause);
res=::PeekMessage(&msg, chil, WM_KEYFIRST, WM_KEYLAST, PM_NOREMOVE);
}
if (res==-1) AfxMessageBox("PeekMessage2 не работает");
if (coun>1) AfxMessageBox("coun>1");
SetWindowsHookEx() болжно помочь. Есть ли способы проще, не знаю. Но
ИМХО, вряд ли.
--
С уважением, boroda
Номер выпуска : 4977
Возраст листа : 752 (дней)
Количество подписчиков : 530
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/453791
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Hello Шматко,
Wednesday, October 12, 2005, 1:38:09 PM, you wrote:
Помогло. Спасибо. Только вот еще попутный вопрос: можно ли с помощью SetWindowsHookEx()
различить какие сообщения приходят через PostMessage, а какие через SendMessage.
Spy++ это
каким-то образом различает.
Ну-у... есть InSendMessageEx(), но по описанию не понятно, как она
относится к вызовам из хуков и надёжно ли она работает. Ведь кроме
SendMessage() и PostMessage() есть ещё SendMessageCallback() с
SendAsyncProc(), SendMessageTimeOut(), SendNotifyMessage(),
PostThreadMessage() и ещё такие фичи, как ReplyMessage() и
BroadcastSystemMessageEx()... Так что нужно пробовать
--
С уважением, boroda
Номер выпуска : 5016
Возраст листа : 759 (дней)
Количество подписчиков : 533
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/459012
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте, Шматко.
Monday, December 12, 2005, 2:08:17 PM, Вы писали:
Согласен, если иметь дело с умными людьми, как в случае с форумом. Если я
самостоятельно
начну решать проблему, то просто утопаю с ушами в мсдн и кпд такой работы
близко к нулю.
Собственно функция возвращает CString и я пытался сделать временную
переменную char
[1024],и возвращать ее, чтобы избежать заморочек с ReleaseBuffer но это не
помогало - все
как раньше :(
the
of
on
и
Hello Форум,
Сделал в библиотеке структуру с разными переменными и посылаю через WM_COPYDATA
указатель
на эту структуру. В окне-клиенте вроде все принимается кроме стринговых переменных,
вместо
которых полная ерунда. Посоветуйте, что делать? Может, есть какая другая перспектива
для
передачи данных (что-то вроде унифицированной передачи данных UDT)?
Здравствуйте !
Ну да. Посылается _структура_ в которой, судя по всему, есть
_указатели_ на блоки памяти со строковыми данными. То есть если
послать через WM_COPYDATA структуру так:
struct _ANY_TYPE
{
char *pchPointer;
long nOtherValue;
};
_ANY_TYPE sData =
{
"Text text text",
10
};
// отсылка через WM_COPYDATA ...
то, скорее всего в адресном пространстве принимающего процесса
указатель pchPointer не будет указывать на валидный блок памяти.
Тем более строка волшебным образом не скопируется.
Если сделать структуру типа:
struct _ANY_TYPE
{
char[16] chBuffer;
long nOtherValue;
};
то все перешлется, естесственно.
Механизмов много.
WM_COPYDATA - один из простейших в реализации.
Если надо передавать данные переменной длины, то просто клади их
последовательно в блок памяти и пересылай этот буфер.
Можно объявить структуру типа:
struct _DATA_HEADER
{
DWORD dwType;
DWORD dwLen;
};
и набор структур для каждого произвольного типа данных:
struct _SOME_TYPE
{
_DATA_HEADER hdr;
// далее некоторые данные
};
потом все данные, которые надо переслать последовательно упаковываешь
в соответствующие структуры и укладываешь в буфер, пересылаешь в другое
приложение, а там просто проходишь по буферу и смотришь тип каждого
блока, размер данных. Ну и делаешь с ними что нибудь.
А насчет механизмов...
навскидку:
clipboard
MMF
RPC (COM)
DDE
Pipes
Mail Slots
Sockets
etc...
Hello Victor,
Tuesday, October 18, 2005, 2:03:18 AM, you wrote:
Все пересылается прекрасно, пока не снимается ловушка, которая сидела в той
самой длл,
которая пересылала указатели на структуру. При этом происходит что-то крайне
интересное:
вышибаются все программы в том числе выполняемая, которая принимает сообщения,
среда
программирования, антивир. Касперского и пр. Один Тотал Коммандер остается в
живых , но и
он время от времени не выдерживает. Запускаю все программы обратно и продолжаю
нормально
работать, пока снова не дойду до строки UnhookWindowsHookEx(hhkKbdHook); А ведь
такого не
было до использования указателей структур, был только указатель на строку char
buf[1024].
Он и передавался. Поможет ли какой-нить добрый человек докопаться до правды.
Можно ссылочку на ресурс, где это поподробнее описывается.
Hello Deni_S,
Tuesday, October 18, 2005, 9:28:05 AM, you wrote:
самой длл,
крайне
принимает
Коммандер
все программы
до строки
указателей
Поможет ли
Проблема решилась: похоже нельзя удалять в деструктуре класса библиотеки
глобальный
указатель на эту самую биб-ку, иначе получаем супер-вирус, действие которого
описано выше
:)
Ну это и понятно. Адресные пространства у процессов разные, поэтому и
придумали такое сообщение, как простейший способ передачи информации между
ними. Оно выполняет копирование данных из одного адресного пространства в
другое. Впрочем, не исключено, что и более хитро дейструет, но не в этом
соль. Если в копируемых данных будут указатели, то данные по ним скопированы
не будут. Откуда wind-е знать, где у тебя в структурах указатели, а где
float-ы? Для WM_COPYDATA это просто BYTE[count], где count указано в самом
сообщении.
Присоединюсь к Victor V. Vakchturov. У каждого из них есть свои
недостатки и достоинства. Нужно смотреть по контексту, что выгоднее в
конкретном случае.
--
С уважением, boroda
Номер выпуска : 5011
Возраст листа : 758 (дней)
Количество подписчиков : 532
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/458274
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru
Здравствуйте !
Также как и на любом другом окне.
Получить контекст устройства и что то нарисовать.
C++, MFC:
CClientDC dc(&m_wndTab);
dc.MoveTo(0, 0);
dc.LineTo(100, 100);