Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Tab

Здравствуйте, comp.

Помогите нарисовать на закладке. Если есть рабочий пример, буду
признателен.

Ответить   Виктор Sat, 10 Sep 2005 20:06:38 +0400 (#434649)

 

Ответы:

Здравствуйте !

Также как и на любом другом окне.
Получить контекст устройства и что то нарисовать.
C++, MFC:

CClientDC dc(&m_wndTab);

dc.MoveTo(0, 0);
dc.LineTo(100, 100);

Ответить   Mon, 12 Sep 2005 04:21:44 +0400 (#435454)

 

Здравствуйте, Victor.

Этот кусок кода, будет работать если его поместить в OnInitDialog()?

Ответить   Виктор Mon, 12 Sep 2005 21:31:39 +0400 (#436040)

 

Здравствуйте !

Будет, но результата не увидите, т.к. 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.

Все заработает.

Ответить   Tue, 13 Sep 2005 20:57:19 +0400 (#436682)

 

Здравствуйте, Victor.

Спасибо всем. Рисую...

Ответить   Виктор Tue, 13 Sep 2005 21:33:46 +0400 (#436695)

 

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.
Люди, поделитесь своими соображениями.

Ответить   Thu, 15 Sep 2005 22:46:00 +0400 (#438139)

 

Здравствуйте !

А окно это твоего процесса, или чужого ?
Можно попробовать получить состояние клавишь через GetKeyboardState,
сохранить его, установить новое состояние (SetKeyboardState), но
уже с "нажатой" Ctrl, вызвать твой код (только везде вместо
PostMessage использовать SendMessage), потом снова вернуть прежнее
состояние через SetKeyboardState.

Ответить   Sat, 17 Sep 2005 23:01:32 +0400 (#439127)

 

Здравствуйте, 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. Извиняюсь за долгое молчание. Теперь никакой аппендицит не помешает
мне вовремя
отвечать. Его уже нету :)

Ответить   Sun, 25 Sep 2005 07:44:11 +0400 (#442976)

 

Хаю ду ю ду Deni_S?

Смотрю и вижу, как ты печатаешь умные вещи и дай-ка, думаю,
тоже что-нибудь напечатаю:

SetKeyboardState работает в win9x, в winnt надо юзать keybd_event.

Ответить   Sun, 25 Sep 2005 23:23:32 +0500 (#443379)

 

Здравствуйте, Александр.

Sunday, September 25, 2005, 10:23:32 PM, Вы писали:

Понятно

Ответить   Mon, 26 Sep 2005 07:37:28 +0400 (#443866)

 

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");

Ответить   Tue, 11 Oct 2005 22:51:38 +0400 (#453485)

 

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

Ответить   Шматко А.А. Wed, 12 Oct 2005 13:38:09 +0400 (#453791)

 

Hello Шматко,

Wednesday, October 12, 2005, 1:38:09 PM, you wrote:

Помогло. Спасибо. Только вот еще попутный вопрос: можно ли с помощью SetWindowsHookEx()
различить какие сообщения приходят через PostMessage, а какие через SendMessage.
Spy++ это
каким-то образом различает.

Ответить   Wed, 19 Oct 2005 01:26:20 +0400 (#458910)

 

Ну-у... есть 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

Ответить   Шматко А.А. Wed, 19 Oct 2005 09:14:04 +0400 (#459012)

 

Здравствуйте, Шматко.

Monday, December 12, 2005, 2:08:17 PM, Вы писали:

Согласен, если иметь дело с умными людьми, как в случае с форумом. Если я
самостоятельно
начну решать проблему, то просто утопаю с ушами в мсдн и кпд такой работы
близко к нулю.
Собственно функция возвращает CString и я пытался сделать временную
переменную char
[1024],и возвращать ее, чтобы избежать заморочек с ReleaseBuffer но это не
помогало - все
как раньше :(

the

of

on

и

Ответить   Tue, 13 Dec 2005 20:23:54 +0300 (#489326)

 

Hello Форум,

Сделал в библиотеке структуру с разными переменными и посылаю через WM_COPYDATA
указатель
на эту структуру. В окне-клиенте вроде все принимается кроме стринговых переменных,
вместо
которых полная ерунда. Посоветуйте, что делать? Может, есть какая другая перспектива
для
передачи данных (что-то вроде унифицированной передачи данных UDT)?

Ответить   Tue, 18 Oct 2005 01:15:58 +0400 (#458106)

 

Здравствуйте !

Ну да. Посылается _структура_ в которой, судя по всему, есть
_указатели_ на блоки памяти со строковыми данными. То есть если
послать через 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...

Ответить   Tue, 18 Oct 2005 02:03:18 +0400 (#458117)

 

Hello Victor,

Tuesday, October 18, 2005, 2:03:18 AM, you wrote:

Все пересылается прекрасно, пока не снимается ловушка, которая сидела в той
самой длл,
которая пересылала указатели на структуру. При этом происходит что-то крайне
интересное:
вышибаются все программы в том числе выполняемая, которая принимает сообщения,
среда
программирования, антивир. Касперского и пр. Один Тотал Коммандер остается в
живых , но и
он время от времени не выдерживает. Запускаю все программы обратно и продолжаю
нормально
работать, пока снова не дойду до строки UnhookWindowsHookEx(hhkKbdHook); А ведь
такого не
было до использования указателей структур, был только указатель на строку char
buf[1024].
Он и передавался. Поможет ли какой-нить добрый человек докопаться до правды.

Можно ссылочку на ресурс, где это поподробнее описывается.

Ответить   Tue, 18 Oct 2005 09:28:05 +0400 (#458286)

 

Hello Deni_S,

Tuesday, October 18, 2005, 9:28:05 AM, you wrote:

самой длл,

крайне

принимает

Коммандер

все программы

до строки

указателей

Поможет ли

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

Ответить   Tue, 18 Oct 2005 19:08:52 +0400 (#458666)

 

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

не будут. Откуда 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

Ответить   Шматко А.А. Tue, 18 Oct 2005 08:38:44 +0400 (#458274)