Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: (faq)???±???°?±???‚???° ???????±?‰?µ?????? ?????‡?µ?????µ???? ???????°  (Прочитано 47574 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 21-10-2005 10:03 » 

Тут еще 2 идеи возникли.
1) В стандартный класс EDIT'a с помощью функции SetWindowLong занести указатель на мою CALLBACK функцию. Тоьлько я не знаю моджно-ли так и много я выйграю от этого. По сути что свой контрол создавать, что писать функция обратного вызова для едита, один фиг придется прописывать печать символа, сдвиг каретки, если я не ошибаюсь конечно.
2) Эта мало чем отличается от первой, только плюс к тому, не до конца сформулированная. Создавать свой класс окна но только на основе класса ЕДИТА. Не совсем пока точно представляю можно ли так сделать и как.
Увы сейчас пока это проверить не могу. Хотелось бы пока услышать комментарии, по поводу можно ли так делать или нельзя и как лучше.
зы:
Цитата
Вдруг человек забыл одну буковку в пароле и полез за своей шпаргалкой.. Весь его почерк весело полетел.
Ничего страшного, пусть заново пароль набьет. Он сам по себе метод такой, что человек должен приблизительно одинаково печатать этот пароль.
« Последнее редактирование: 20-12-2007 17:57 от Алексей1153++ » Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #31 : 21-10-2005 12:47 » 

nikedeforest Я не музыкант, поэтому пароль в ритме легкого вальса я не набираю. Ритм мой будет меняться от набора до набора. И получится как в анекдоте, Милиард китайцев уговорили сервер Пентагона, что пароль "Мао Цзе Дун".

Насчет твоей идеи насчет подмены WndProc функции Edit. Она хорошая идея, так это делают. Но она не прокатит. Так как эта компонента не создана в  твоем процессе. И Винда не даст подменить. Подмену можно сделать только для компонент созданных в данном процессе.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #32 : 21-10-2005 13:12 » 

А сейчас буду наверное прописные истины спрашивать.
Цитата
Так как эта компонента не создана в  твоем процессе. И Винда не даст подменить. Подмену можно сделать только для компонент созданных в данном процессе.
А что проблемно ее создать в моем процессе или это невозможно?
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #33 : 21-10-2005 13:16 » 

Ты вызываеш для компоненты RegisterClass или RegisterClassEx? Если да. Тогда я не понимаю, в чем проблема. Почему ты не можеш сразу вписать в код все свои пожелания.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 21-10-2005 13:25 » 

Так я только сегодня до RegisterClass допер. Я всегда едит использовал без всяких прибамбасов. Я думал, что если я буду писать RegisterCLass (или ReGisterCLassEx) то создается контрол программиста, а не предопределенный(или как они там называются все эти EDIT BUTTON и т.п.) контрол.
И я сейчас не совсем дома, чтобы попробовать, компилятора под рукой пока нет, поэтому я мыслями делюсь в надежде попасть в яблочко.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #35 : 24-10-2005 13:02 » 

Чуть подробнее. Не вызывается функция обратного вызова. Ставил на нее breakpoint и ни разу туда не попал. Неужто неправильно определил. Вроде все ворованное да и по смыслу нормально.
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #36 : 24-10-2005 13:35 » 

Первая ошибка
 
Код:
void CreateControl(HINSTANCE hInst, HWND hw_parent)
{
 

MyRegisterClassEx (hInst);
SetWindowLong(hwnd, GWL_USERDATA, (LONG) this);
  hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_BORDER|WS_VISIBLE,66,10,100,20,hw_parent,NULL,hInst,0);
  ShowWindow(hwnd,SW_SHOW);
};
Ты прописываеш такую функцию SetWindowLong(hwnd, GWL_USERDATA, (LONG) this); до того, как у тебя будет определено hwnd. т.е идет запись в никуда. Если посмотриш мой код, я чуть схетрил в данном случае. Но думаю все таки надо сделать через CreateStructure.
Вторая ошибка:
Код:
 ~edit()
{
DestroyWindow(hwnd);
CloseHandle(hwnd);

};
Ты посылаеш окну собшение, чтобы оно разрушилось. Потом закрываеш хэндл. Т.е. делаеш дважды одно и тоже. Винда никак не укажет на данную ошибку. Ибо для нее уже хэндла твоего не сушествует. Второй раз ты просто закрываеш пустой хэндл.
Третья ошибка: Слово EDIT зарезервировано виндой под класс поставленный по умолчанию в винде. Скорее всего у тебя атом возратится или нуль или атом класса EDIT. При этом все твои настройки игнорируются.
« Последнее редактирование: 24-10-2005 13:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #37 : 24-10-2005 13:43 » 

Цитата
Но думаю все таки надо сделать через CreateStructure.
А что это за CreateStructure такая?
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #38 : 24-10-2005 13:46 » 

Последний параметр CreateWindowEx  и есть
Цитата
lpParam

Points to a value passed to the window through the CREATESTRUCT structure referenced by the lParam parameter of the WM_CREATE message. If an application calls CreateWindow to create a multiple document interface client window, lpParam must point to a CLIENTCREATESTRUCT structure.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #39 : 24-10-2005 14:01 » 

nikedeforest, Я не думал, что ты вкладываешь буквальный смысл в фразу "там  ничего еще нет"  - твой файл в мыле lab2ver1.zip почему-то 0 байт. Жаль Проверь пожалуйста ещё раз.

Как с MFC проектом? Разобрался?

Ответы:
Finch, Я так понял, что это у nikedeforest это лабы, в которых не важно количество, а качество.
Поэтому, я и "угрязнил" эксперимент Улыбаюсь Если честно, я тоже не вижу как практически, а самое главное грамотно,  можно применить полученные данные (даже "чистые")? Но я так думаю мы уже выяснили, что главное не в этом.

nikedeforest, По сути тебе нужен класс-обёртка для стандартного EDIT - ведь ты не хочешь заботится об отрисовке шрифтов, курсора, выделения и тд и тп в случае если сам захочешь делать свой контрол. Всё что тебе надо - обработать WM_KEYDOWN и WM_KEYUP. В момент WM_KEYUP ты уже знаешь время затраченное пользователем на Вниз/Вверх - тебе просто надо передать это значение родителю - для этого можно использовать PostMessage например.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 24-10-2005 14:02 » 

Finch,  а когда мы с тобой говорили о компонентах, ты не эту проблему имел ввиду?
Есть такие замечательные фукнции (чуть не написал пределы Улыбаюсь ) как SetWindowLongPtr и SetClassLongPtr но у меня почему-то на них компилятор ругается.
А то у меня идея появилась сделать что-то типа этого
Код:
hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_BORDER|WS_VISIBLE,66,10,100,20,hw_parent,NULL,hInst,0);

  ShowWindow(hwnd,SW_SHOW);
  SetWindowLong(hwnd, GWL_USERDATA, (LONG) this);
  SetWindowLongPtr(hwnd,GWLP_WNDPROC,(LONG)&WndProc);
При этом не пришлось бы регестрировать свой класс. только я не знаю будет ли так работать и не знаю почему компилятор ругается на функции SetWindowLongPtr и SetClassLongPtr
Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #41 : 24-10-2005 14:22 » 

nikedeforest Вот функции которые есть у меня в хелпе
Цитата
The following functions are used with window classes.

GetClassInfoEx
GetClassLong
GetClassName
GetClassWord
GetWindowLong
GetWindowWord
RegisterClassEx
SetClassLong
SetClassWord
SetWindowLong
SetWindowWord
UnregisterClass
Те функции, которые ты назвал, у меня отсутствуют.
Переопределяют WndProc обычно так 
OldWndProc=SetClassLong(hwnd, GCL_WNDPROC, (LONG) MyWndProc);

И вот что говорит Хэлп на данную тему
Цитата
If you use the SetClassLong function and the GCL_WNDPROC index to replace the window procedure, the window procedure must conform to the guidelines specified in the description of the WindowProc callback function.
Calling SetClassLong with the GCL_WNDPROC index creates a subclass of the window class that affects all windows subsequently created with the class. An application should not subclass a window created by another process.

Т.е. в принципе можно субкласировать не свой класс. Это надо эксперементировать. WndProc будет выглядеть, как обычная только заместо DefWindowProc Нужно вызывать родную процедуру обратного вызова класса.
« Последнее редактирование: 24-10-2005 14:27 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 24-10-2005 14:54 » 

Джон, согласен с тобой на 100 процентов. Когда отправлял свое сообщение не видел твоего. И с оберткой ты прав на все 100. Я об этом и писал, что не охота изобретать, охота просто получить возможность добавить свое.
Finch, сейчас попробую подставить WndProc твоим способом. У меня вообще-то сейчас именно с этим заминка.
В CreateStruct я подходящего поля для того, чтобы записать this не нашел, сейчас еще посмотрю.
« Последнее редактирование: 24-10-2005 15:02 от nikedeforest » Записан

ещё один вопрос ...
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #43 : 24-10-2005 18:08 » 

Вот примерная схема Субкласинга EDIT. Я не делал ввиде класса. Просто пример.
EditWrap.h
Код:
#ifndef EDITWRAP_H
#define EDITWRAP_H
#include <windows.h>

HWND CreateEdit(HWND Parent, HINSTANCE hIns);
void KillWndProc(HWND hwnd);

#endif //EDITWRAP_H

EditWrap.cpp
Код:
#include "EditWrap.h"

WNDPROC OldWndProc=NULL;
int count=0;

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
  if (Message == WM_KEYDOWN)
  count++;
  return CallWindowProc(OldWndProc,hwnd, Message, wParam, lParam);
}

HWND CreateEdit(HWND Parent, HINSTANCE hIns)
{
HWND res=CreateWindow("EDIT", "", WS_CHILD | WS_VISIBLE ,
                 10, 10, 100, 26, Parent, NULL,hIns, NULL);
OldWndProc= (WNDPROC) SetWindowLong(res, GWL_WNDPROC, (LONG) WndProc);
return res;
}

void KillWndProc(HWND hwnd)
{
SetWindowLong(hwnd, GWL_WNDPROC, (LONG) OldWndProc);
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 24-10-2005 19:56 » 

Спасибо Finch'у. Благодаря его стараниям и терпеливому разъяснению лед тронулся. Можно смело обрабатывать сообщения. Вот код
Код:
 
class edit
{
private:
HWND hwnd;
 static WNDPROC OldWndProc;
public:

edit(HINSTANCE hInst,HWND hw_parent)
{
CreateControl(hInst, hw_parent);
};
edit(){};
~edit()
{
DestroyWindow(hwnd);

};
 //----------------   
HWND get_hwnd()
{
   return hwnd;
};

   //----------------
    ATOM MyRegisterClassEx(HINSTANCE hInst)
{
   WNDCLASSEX wc;
   wc.cbSize=sizeof(WNDCLASSEX);
   wc.hIconSm=NULL;
   wc.cbWndExtra=sizeof(edit *);
   wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
   wc.hCursor=LoadCursor(hInst,IDC_ARROW);
   wc.hIcon=NULL;
   wc.hInstance=hInst;
   wc.lpfnWndProc=(WNDPROC)MyWndProc;
   wc.lpszClassName="EDIT1";
   wc.style=CS_HREDRAW|CS_VREDRAW;

return RegisterClassEx(&wc);
};
 //----------------
void CreateControl(HINSTANCE hInst, HWND hw_parent)
{
 

                                     // MyRegisterClassEx (hInst);
  hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT","",WS_CHILD|WS_BORDER|WS_VISIBLE,66,10,100,20,hw_parent,NULL,hInst,0);
 
  ShowWindow(hwnd,SW_SHOW);
 OldWndProc=(WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG) MyWndProc);

};
 //----------------
 static LRESULT  CALLBACK  MyWndProc(HWND hwnd, UINT Message,WPARAM wParam, LPARAM lParam)
 {
//if(wParam==WM_CREATE || wParam==WM_LBUTTONDOWN)
//MessageBox(0,"message","message",MB_OK);
switch(Message){
case WM_CREATE:
MessageBox(0,"create","create",MB_OK);
break;

case WM_LBUTTONDOWN:
         MessageBox(0,"message-lbuttondown-myedit","message",MB_OK);
    SetFocus(hwnd);
break;
case WM_RBUTTONDOWN:
SetFocus(hwnd);
break;
case WM_COMMAND:
    MessageBox(0,"myedit_wmcommand","",MB_OK);
DefWindowProc(hwnd,Message,wParam,lParam);
break;
case WM_KEYDOWN:
MessageBox(hwnd,"keydown-myedit","keydown",MB_OK);
DefWindowProc(hwnd,Message,wParam,lParam);
break;

//default: return DefWindowProc(hwnd,Message,wParam,lParam);
}

 return CallWindowProc(OldWndProc,hwnd, Message, wParam, lParam);
 };
///////////////////////////////////////
 
WNDPROC edit::OldWndProc;
« Последнее редактирование: 20-12-2007 17:59 от Алексей1153++ » Записан

ещё один вопрос ...
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines