Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 12.04.2011, 17:38   #1
Gillian Foster
 
Аватар для Gillian Foster
 
Регистрация: 12.04.2011
Адрес: Ukraine
Сообщений: 7
Репутация: 10
Печаль Как отловить сообщения с EditBox в диалоговом окне WinApi

Всем доброе время суток.
Помогите,пожалуйста!
Столкнулась с такой проблемой:
У меня есть диалоговое окно, в нем Edit мне нужно отловить сообщение WM_KEYDOWN (нажатие клавиши).
Как это можно делать?
Вычитала на другом форуме что " класс стандартного Edit регистрирует система. Соответственно, когда вы создаете окно с классом "Edit" ( CreateWindow ) будет использован системный класс и оконная процедура ( системная ) прописанная в этом классе. Она и реализует стандартные действия контрола, т.е. ввод с клавиатуры, отображение символов и т.д. Если Вам надо поменять стандартное поведение контрола вы можете подменить оконную функцию, реализовать в подмененой нужные Вам моменты, и вызвать системную оконную процедуру, чтобы не реализовывать ввод с клавиатуры, отображение символов и т.д."
но не могу понять как это "подменить"!
да, и может есть другой какой-то способ?
Gillian Foster вне форума   Ответить с цитированием
Старый 12.04.2011, 18:34   #2
counter
Профессионал
 
Регистрация: 18.10.2008
Сообщений: 1,409
Репутация: 431
По умолчанию

используйте GetWindowLong/SetWindowLong
counter вне форума   Ответить с цитированием
Старый 12.04.2011, 20:07   #3
Gillian Foster
 
Аватар для Gillian Foster
 
Регистрация: 12.04.2011
Адрес: Ukraine
Сообщений: 7
Репутация: 10
По умолчанию

Что-то не пойму как, с помощью GetWindowLong или SetWindowLong, можно словить сообщение WM_KEYDOWN на едите. Можно,пожалуйста, поподробней.
Gillian Foster вне форума   Ответить с цитированием
Старый 12.04.2011, 22:06   #4
counter
Профессионал
 
Регистрация: 18.10.2008
Сообщений: 1,409
Репутация: 431
По умолчанию

Вы что нибудь читали про эти функции? Наверное нет... С помощью SetWindowLong с флагом GWL_WNDPROC для окна можно переназначить оконную функцию и в ней уже творить все, что вам надо.

http://msdn.microsoft.com/en-us/libr...91(VS.85).aspx
http://vsokovikov.narod.ru/New_MSDN_...windowlong.htm
counter вне форума   Ответить с цитированием
Старый 12.04.2011, 22:15   #5
Gillian Foster
 
Аватар для Gillian Foster
 
Регистрация: 12.04.2011
Адрес: Ukraine
Сообщений: 7
Репутация: 10
По умолчанию

counter, да читала, только ниче не поняла, теперь что-то дошло, спасибо будем думать дальше
Gillian Foster вне форума   Ответить с цитированием
Старый 19.04.2011, 20:52   #6
alexsin
Новичок
 
Регистрация: 19.04.2011
Сообщений: 1
Репутация: 10
По умолчанию

Вот такая проблема: пытаюсь вынести создание контролов в отдельный класс
все получилось, но обработчик сообщений остается все равно в основном файле.
то есть перенаправляю обратно в метод класса, но как видите Это не есть правильный путь
Код:

//Main.cpp

Button bt1;	//создаю экземпляр класса Button
....
// в основной оконной процедуре при обработке  WM_CREATE создаю кнопку:
bt1.Create(280,2,70,23,3,hWnd,(HMENU)ID_BUTTON1,hAPP,clDefBGColor,(char*)"Вызов");
//вот так подменяю оконную функцию контрола
butt1WinProc = (WNDPROC)SetWindowLong(bt1.GetHWND(),GWL_WNDPROC,(long)Butt1CallBack);
.....................
//а вот она сама

LRESULT CALLBACK Butt1CallBack(HWND hwnd,UINT mess,WPARAM wParam,LPARAM lParam){
	if (mess == WM_LBUTTONDBLCLK ) mess = WM_LBUTTONDOWN;
	bt1.WorkMessages(hWnd,mess,wParam,lParam);
	return CallWindowProc(butt1WinProc,hwnd,mess,wParam,lParam);	// вернем ненужные сообщения обратно
}
.....................

//==================================================================== 

//Button.cpp
#include <windows.h>
#include <string.h>

class Button
{
    private:
		HMENU hID;
		HWND hwnd;
		WNDPROC bWinProc;
		LRESULT CALLBACK bCallBack(HWND,UINT,WPARAM,LPARAM);//вот эту заготовку неполучается подключить
		RECT rCapture;
		COLORREF clDefBGColor;
		char cCaption[100];
......
    public:
        Button();
        virtual ~Button();

		void Create(int,int,int,int,int,HWND,HMENU,HINSTANCE,COLORREF,char*);
		void WorkMessages(HWND,UINT,WPARAM,LPARAM);
......
};

........
void Button::Create(int l,int t,int w,int h,int rs,HWND hw,HMENU hm,HINSTANCE hinst,COLORREF cBGColor,char* ch){
	strcpy(cCaption,ch);
	clDefBGColor = cBGColor;
	hID = hm;
	SetRect(&rRW,l,t,l+w,t+h);	//280,2,350,25
	iW = w;
	iH = h;
	iRS = rs;
	hwnd = CreateWindow("button",NULL,WS_VISIBLE|WS_CHILD|BS_OWNERDRAW,l,t,w,h,hw,hm,hinst,NULL);
	
	//bWinProc = (WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(long)bCallBack); эта строка выдает ошибку компилятора

	DrawBitMaps();
}

LRESULT CALLBACK Button::bCallBack(HWND hw,UINT ms,WPARAM wP,LPARAM lP){
// вот  здесь хотел бы обрабатывать сообщения контрола
	return CallWindowProc(bWinProc,hw,ms,wP,lP);	// вернем ненужные сообщения обратно
}

void Button::WorkMessages(HWND hWND,UINT ms,WPARAM wP,LPARAM lP){
......
// пока обрабатываю сообщения здесь: и кнопку рисую и когда надо в основное окно сообщения пересылаю
.......
}

HWND Button::GetHWND(){
    return hwnd;
}

void Button::SetCaption(char* ch){
	strcpy(cCaption,ch);
	DrawBitMaps();
	InvalidateRect(hwnd,NULL,false);
}

char* Button::GetCaption(){
	return cCaption;
}
............

Подскажите, как сделать подключение напрямую? Просто нехочется засорять основной код, контролов предстоит создать много.

Последний раз редактировалось alexsin; 19.04.2011 в 21:07.
alexsin вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отловить движение курсора, диалоговые сообщения. Deight Общие вопросы Delphi 15 17.11.2008 12:28
Рисунок на диалоговом окне!! HunterMan Win Api 4 10.06.2008 12:25
Рисование в диалоговом окне (Си++) molo4nik Помощь студентам 1 06.05.2008 18:27
изменить цвет в диалоговом окне MessageDlg Михаил Юрьевич Общие вопросы Delphi 8 27.04.2008 18:20
Как при скрытом чужом окне сделать его дочерние окна(сообщения) видимыми ? Starwarrior Win Api 1 20.03.2007 10:51


09:52.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru