WM_CHAR na całe okno, z kontrolkami bez hooka

0

Hi,
Jesli mam zdarzenie WM_CHAR (badz KEYUP, KEYDOWN) to ono dziala tylko dla okna glownego, ale nie dziala mi na kontrolki w oknie, ktore sa aktywne. Jak rozszerzyc to zdarzenie okna głównego o kontrolki mu podległe?

przegladalem faq i forum w poszukiwaniu tego, ale wszedzie w odpowiedzi jest --- poczytaj o hookach ;/. Mysle ze da sie to zrobic bez hookow.

Mam pomysl na to aby kazda kontrolke dziedziczyc z CDialog, i do jej zmiennej kontrolnej juz nowej (dziedziczonej z CDialog) dawac obsluge WM_CHAr, ale za duzo mam kontrolek zeby sie tak bawic, no i wiem ze jest inne rozwiazanie.

]Dzieki nara

0

mam rozwiązanie, ale w ibpro - subclassing. Robisz sobie tylko jedną funkcję dla WM_CHAR i WM_KEYDOWN

zamiast

return klawisz(hwnd, wParam) 

zrób po swojemu bo to blokuje wpisywanie klawiszy np. do edita

$include "windows.inc"

dialog d1
CREATEDIALOG d1,0,0,295,199,0x80C80080,0,"Caption",&mainwindow
CONTROL d1,@BUTTON,"Button1",12,8,70,20,0x50000000,1
CONTROL d1,@CHECKBOX,"Check1",23,147,70,20,0x50000003,4
CONTROL d1,@COMBOBOX,"ComboBox1",222,0,70,50,0x50800603,5
CONTROL d1,@RICHEDIT,"",219,135,70,60,0x50800004,6
CONTROL d1,@SCROLLBAR,"",201,48,70,20,0x50000000,7
CONTROL d1,@LISTBOX,"ListBox1",137,135,70,60,0x50800140,8
CONTROL d1,@RADIOBUTTON,"Radio1",24,130,70,20,0x50000009,9
CONTROL d1,@SCROLLBAR,"",169,48,20,70,0x50000001,10
CONTROL d1,@GROUPBOX,"Group",9,52,70,60,0x50000007,11
CONTROL d1,@EDIT,"Edit1",220,26,70,20,0x50800000,12
controlex d1, "systabcontrol32","",20, 10, 514,303,_
		TCS_FLATBUTTONS|WS_CLIPSIBLINGS|WS_TABSTOP,0,2
showdialog d1

'12 - ilość kontrolek + główne okno
UINT array[12,2], i
array[0, 0] = d1.hwnd
array[0, 1] = SetWindowLong(d1.hwnd, GWL_WNDPROC, &Subclass)
i = 1
EnumChildWindows(d1.hwnd, &enum, 0)

waituntil d1.hwnd = 0

'-------------

sub enum(hwnd:uint, lparam:uint),int
	array[i, 0] = hwnd
	array[i, 1] = SetWindowLong(hwnd, GWL_WNDPROC, &Subclass)
	i++
	return (i<12)
endsub

'-------------

sub Subclass(hwnd:uint, uMsg:uint, wParam:uint, lParam:uint),uint

	if uMsg = WM_CHAR then return klawisz(hwnd, wParam)
	if uMsg = WM_KEYDOWN then return klawisz(hwnd, 0)

	return CallWindowProc(GetProcByHwnd(hwnd),_
			hwnd, uMsg, wParam, lParam)
endsub

'-------------

sub GetProcByHwnd(hwnd:uint),uint
	INT i
	for i = 0 to 11
		if array[i, 0] = hwnd then return array[i, 1]
	next i
	return 0
endsub

'-------------

sub klawisz(hwnd:uint, kod:int),int
	setcaption d1, using("hwnd:#  kod:#", hwnd, kod)
	MessageBeep(MB_ICONHAND)
	return 0
endsub

'-------------

sub unsubclass(),int
	INT i
	for i = 0 to 11
		SetWindowLong(array[i, 0], GWL_WNDPROC, array[i, 1])
	next i
	return 1
endsub

'-------------

sub mainwindow
	select @message
		case @idinitdialog
			centerwindow d1
		case @idclosewindow
			unsubclass()
			closedialog d1
	endselect
	return
endsub

ponoć Capture też przekierowuje WM_CHAR do jednego okna, ale nie widzi mi się to, bo SetCapture() z leksza blokuje okno :-/ no i tylko jedno okno może mieć capture

1 użytkowników online, w tym zalogowanych: 0, gości: 1