Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2017, 12:21   #1
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию Перекрытие дочерних окон

Приветствую! Создал "пародию" на Tab Control. Все вроде работает, но если поверх моего Tab Control расположить кнопку имеющую того же родителя что и мой Tab Control, то кнопка рисуется, но не реагирует на мышь. Если кнопке назначить родителем мой Tab то кнопка работает. При создании моего Tab control использую стиль WS_VISIBLE + WS_CHILD. Собственно вопрос- Почему кнопка не работает?

Код:
.wmpaint:       INVOKE  GetWindowLong,      ebx, [hwnd], 0                                          ;{
                cmp     [ebx + MyTAB.nItemActive], 0
                jz      .defwndproc
 
; 1 ЭТАП Подготовка контекста {
                
                lea     edi, [stPS]
                invoke  BeginPaint,             [hwnd], edi 
                INVOKE  CreateCompatibleDC,     [hNewHDC], [edi + PAINTSTRUCT.hdc]
 
                lea     esi, [stRC]
                invoke  GetClientRect,          [hwnd], esi
                invoke  CreateCompatibleBitmap, [edi + PAINTSTRUCT.hdc], [esi + RECT.right],  \
                                                [esi + RECT.bottom]
                                                
                ; Сохраняем настройки контекста 
                INVOKE  SelectObject,           [hOldBitmap], [hNewHDC], eax    
                INVOKE  SelectObject,           [hOldFont],   [hNewHDC], [ebx + MyTAB.hFont]
                INVOKE  SetTextColor,           [hOldColor],  [hNewHDC], [ebx + MyTAB.nTextColor]
                INVOKE  SelectObject,           [hOldBrush],  [hNewHDC], [ebx + MyTAB.hBrushTab]
                INVOKE  SelectObject,           [hOldPen],    [hNewHDC], 0
                invoke  SetBkMode,              [hNewHDC], TRANSPARENT
                                
;}      
 
; 2 ЭТАП Вычесляем необходимые переменные { 
    
                mov     eax, [ebx + MyTAB.ind]                                                      ; Кол-во вкладок
                inc     eax
                shr     eax, 1
                mov     [cCountTabs], eax
                
;}
 
; 3 ЭТАП Рисуем фон {
                invoke  FillRect,               [hNewHDC], esi, [ebx + MyTAB.hBrushFon]
;}
                
; 4 ЭТАП Рисуем все вкладки НЕВЫДЕЛЕННЫМИ {
@@:             mov     eax, [cCount]                                                               ; Получаем индекс по номеру вкладки
                dec     eax
                shl     eax, 1
                
                lea     edx, [eax + 1]
                M_LinkS eax 
                mov     [pStr], eax                                                                 ; Адрес строки
                                                                                                                
                M_LinkS edx 
                mov     edx, dword[eax]
                mov     ecx, dword[eax + 4]
                add     [nW], edx                                                                   ;  ширина   
                mov     [nH], ecx                                                                   ;  высота
                                                                            
                push    [nX] [nY] [nW] [nH]                                                         ; Сохраняем размеры в описании вкладки
                pop     dword[eax + MyTABItem.nYEnd] dword[eax + MyTABItem.nXEnd] \
                        dword[eax + MyTABItem.nY] dword[eax + MyTABItem.nX]
                
                invoke  Rectangle,      [hNewHDC], [nX], [nY], [nW], [nH]
                lea     eax, [nX]
                invoke  DrawText,       [hNewHDC], [pStr], -1, eax,\
                                        DT_CENTER + DT_SINGLELINE + DT_VCENTER
                push    [nW]                                                                        ; обеспечиваем координатами следующую кладку + смещение
                pop     [nX]
                dec     [nX]
                dec     [nW]
 
                inc     [cCount]
                dec     [cCountTabs]
                cmp     [cCountTabs], 0
                jnz     @b
;}              
                
; 5 ЭТАП Дорисовываем линию вкладок вправо {                
                
                lea     eax, [stPT]
                dec     [nH]
                invoke  MoveToEx,       [hNewHDC], 0, [nH], eax
                invoke  LineTo,         [hNewHDC], [esi + RECT.right], [nH]
;}              
 
; 6 ЭТАП Рисуем активную вкладку    {               
                invoke  SetTextColor,   [hNewHDC], [ebx + MyTAB.nTextColorSel]                      ; Настраиваем контекст
                invoke  SelectObject,   [hNewHDC], [ebx + MyTAB.hBrushTabSel]
                mov     eax, [ebx + MyTAB.nItemActive]                                              ; Получаем индекс по номеру вкладки
                dec     eax
                shl     eax, 1
                
                mov     edx, eax
                M_LinkS eax
                mov     [pStr], eax
                
                inc     edx
                M_LinkS edx
                mov     [cCount], eax
                mov     [eax + MyTABItem.nY], 0
                add     [eax + MyTABItem.nXEnd], 3
                invoke  Rectangle,      [hNewHDC], [eax + MyTABItem.nX], [eax + MyTABItem.nY], \
                                        [eax + MyTABItem.nXEnd], [eax + MyTABItem.nYEnd]
                
                mov     eax, [cCount]
                inc     [eax + MyTABItem.nX] 
                inc     [eax + MyTABItem.nY] 
                dec     [eax + MyTABItem.nXEnd]
                add     eax, 8
                mov     [cCount], eax
                invoke  FillRect,       [hNewHDC], [cCount], [ebx + MyTAB.hBrushFon]
                                    
                invoke  DrawText,       [hNewHDC], [pStr], -1, [cCount],\
                                        DT_CENTER + DT_SINGLELINE + DT_VCENTER  
 
;}                                      
 
; 7 ЭТАП Копируем на  оригинальный контекст {               
                invoke  BitBlt,         [edi + PAINTSTRUCT.hdc], 0, 0, [esi + RECT.right],\
                                        [esi + RECT.bottom], [hNewHDC], 0, 0, SRCCOPY 
;}
 
; 8 ЭТАП Возвращаем  контекст по умолчанию  {                                       
                                        
                invoke  SelectObject,   [hNewHDC], [hOldBrush]                                              
                invoke  SetTextColor,   [hNewHDC], [hOldColor]
                invoke  SetTextColor,   [hNewHDC], [hOldFont]
                invoke  SetTextColor,   [hNewHDC], [hOldPen]
                invoke  SetBkMode,      [hNewHDC], OPAQUE   
                invoke  SelectObject,   [hNewHDC], [hOldBitmap]
                        DelObject       eax
                invoke  DeleteDC,       [hNewHDC]
                cmp     eax, 0
                jz      .ErrDelMass
                invoke  EndPaint,       [hwnd], edi
;}
                
                jmp     .finish
mikado3333 вне форума Ответить с цитированием
Старый 22.05.2017, 13:05   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от mikado3333 Посмотреть сообщение
если поверх моего Tab Control расположить кнопку имеющую того же родителя что и мой Tab Control, то кнопка рисуется, но не реагирует на мышь
В каком порядке и с какими флагами создаются контролы?
Скорее всего у вас кнопка находится *под* таб контролом.
waleri на форуме Ответить с цитированием
Старый 22.05.2017, 13:46   #3
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Сперва создается Родительское окно, затем мой TAB(WS_VISIBLE + WS_CHILD,), полсе кнопка с флагами WS_VISIBLE+WS_CHILD + BS_PUSHBUTTON

Функция создающая мою пародию на таб и вторая - процедура
Код:
proc	CreateMyTab		hParen, nX, nY, nWidth, nHeight, nId

; Описание																						   {

; ***ПАРАМЕТРЫ***
; hParen 	- Дескриптор родителя
; nX	 	- Х координата
; nY	 	- Y координата	
; nWidth 	- Ширина
; nHeight	- Высота
; nId		- Идентификатор окна

;}

; Макросы																						   {													

;}

; Константы																						   {

WChCursor		equ edi + WNDCLASS.hCursor
WChFon			equ edi + WNDCLASS.hbrBackground
WChIcon			equ edi + WNDCLASS.hIcon
WChInstance		equ edi + WNDCLASS.hInstance
WCszClass		equ edi + WNDCLASS.lpszClassName

																								  ;}


locals

hwnd		dd ?
stWC 		WNDCLASS 0,MyTABProc,0,4,0,0,0,COLOR_HIGHLIGHT,0,0
szClass		db "MyTAB", 0

endl

				push 	ebx esi edi
				
				lea		esi, [szClass]
				invoke	FindWindow,			esi, 0													; Определяем нужно ли регистрировать класс окна
				cmp		eax, 0
				jnz		@f
				
				lea		edi, [stWC]
				mov		[WCszClass], esi
				INVOKE	GetStockObject,		[WChFon], WHITE_BRUSH
				INVOKE	GetModuleHandle,	[WChInstance], 0
				INVOKE  LoadIcon,			[WChIcon], 0, IDI_APPLICATION
				INVOKE  LoadCursor,			[WChCursor], 0, IDC_ARROW
				invoke  RegisterClass,		edi
				cmp 	eax, 0
				jz 		.ErrRegClass

@@:				
				invoke	GetModuleHandle,	0
				INVOKE 	CreateWindowEx,		[hwnd], 0, esi, 0, WS_VISIBLE + WS_CHILD, [nX], [nY],\
											[nWidth], [nHeight], [hParen], [nId], eax, 0
				cmp		eax, 0
				jz		.ErrCreatWin		
		
				jmp		.Finish
								
				
.ErrRegClass:	invoke	GetLastError
				mov		edx, -1
				stc
				jmp		.Exit
				
.ErrCreatWin:	invoke	GetLastError
				mov		edx, -2
				stc
				jmp		.Exit
				
.Finish:		mov		eax, [hwnd] 
				clc
.Exit:			pop 	edi esi ebx
ret
endp
mikado3333 вне форума Ответить с цитированием
Старый 22.05.2017, 13:51   #4
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Код:
proc	MyTABProc	    hwnd, wmsg, wparam, lparam

; Описание																						   {

; ***ПАРАМЕТРЫ***

;}

; Макросы																						   {													

macro CreatBrush	nColor, pOutSave																; Создание кисти
{
	invoke	CreateSolidBrush,	nColor
	cmp		eax, 0
	jz		.ErrCreatMass
	mov		pOutSave, eax
}			

macro DelObject		hwnd
{
				invoke  DeleteObject, 	hwnd
				cmp		eax, 0
				jz		.ErrDelMass

}

;}

; Константы																						   {

MyTAB_ADDTAB		equ WM_USER + 10000
MyTAB_CLIENTRECT	equ WM_USER + 10001
MyTAB_CHANGE		equ WM_USER + 10002
																								  ;}


locals
cCount		dd 1
cCountTabs	dd ?
hNewHDC		dd ?
hOldBitmap	dd ?
hOldBrush	dd ?
hOldColor	dd ?
hOldFont	dd ?
hOldPen		dd ?
nX			dd 5
nY			dd 5
nW			dd 0
nH			dd 0
pStr		dd ?
stPS 		PAINTSTRUCT 
stPT 		POINT 
stRC		RECT 0,0,0,0
stRC2		RECT 0,0,0,0
stTM		TEXTMETRIC 
szFontName	db "Courier New",0

endl

				push	ebx edi esi
						cmp		[wmsg], WM_DESTROY
						je  	.wmdestroy
								cmp 	[wmsg],WM_ERASEBKGND
								je 		.wmerasebkgnd	
										cmp		[wmsg], WM_LBUTTONUP
										je  	.wmlbuttonup
												cmp		[wmsg], WM_PAINT
												je  	.wmpaint

		
.defwndproc:	invoke 	DefWindowProc,		[hwnd], [wmsg], [wparam], [lparam]
				jmp 	.exit
			
.wmdestroy:		INVOKE 	GetWindowLong,		ebx, [hwnd], 0								  			;{

				DelObject [ebx + MyTAB.hBrushString]
				DelObject [ebx + MyTAB.hBrushTab]
				DelObject [ebx + MyTAB.hBrushTabSel]
				DelObject [ebx + MyTAB.hBrushFon]
				DelObject [ebx + MyTAB.hPen]
				
				stdcall	MassDelWhenHeapProcess
				jc		.ErrDelMass
		
	;			invoke 	DestroyWindow,		[hwnd]
				jmp		.defwndproc																  ;}				
								
.wmerasebkgnd:	mov		eax, 0																		;{
				jmp		.exit																		;}
				
.wmlbuttonup:	INVOKE 	GetWindowLong,		ebx, [hwnd], 0											;{
				cmp		[ebx + MyTAB.ind], -1
				jz		.finish
				
; 1 ЭТАП Создаем RECT нажатия мыши {

				lea		esi, [stRC]
				mov		eax, [lparam]
				shld	[esi + RECT.top], eax, 16
				shld	[esi + RECT.bottom], eax, 16
				inc		[esi + RECT.bottom]
				and		eax, $0000FFFF
				mov		[esi + RECT.left], eax
				inc		eax
				mov		[esi + RECT.right], eax			
;}
	
; 2 ЭТАП Определяем какую вкладку активировать {			
	
				mov		edi, 1
@@:				cmp		edi, [ebx + MyTAB.ind]
				ja		.finish
				M_LinkS	edi
				lea		edx, [eax + 8]
				lea 	eax, [stRC2]
				add		edi, 2
				inc		[cCount]

				invoke	IntersectRect,	eax, esi, edx
				cmp		eax, 0
				jz		@b
				
				mov		eax,  [cCount]
				dec		eax
				mov		[ebx + MyTAB.nItemActive], eax
;}

; 3 ЭТАП Посылаем уведомление в родительскую процедуру	{

				invoke	GetParent,		[hwnd]
				invoke	SendMessage, 	eax, MyTAB_CHANGE, [hwnd], [ebx + MyTAB.nItemActive]

;}
				invoke	InvalidateRect, [hwnd], 0, 1
				jmp		.finish
																									;}
				
.wmpaint:		INVOKE 	GetWindowLong,		ebx, [hwnd], 0											;{
				cmp		[ebx + MyTAB.nItemActive], 0
				jz		.defwndproc

; 1 ЭТАП Подготовка контекста {
				
				lea		edi, [stPS]
				invoke 	BeginPaint,				[hwnd], edi 
				INVOKE  CreateCompatibleDC, 	[hNewHDC], [edi + PAINTSTRUCT.hdc]

				lea		esi, [stRC]
				invoke	GetClientRect,			[hwnd], esi
				invoke  CreateCompatibleBitmap,	[edi + PAINTSTRUCT.hdc], [esi + RECT.right],  \
												[esi + RECT.bottom]
												
				; Сохраняем настройки контекста 
				INVOKE	SelectObject,			[hOldBitmap], [hNewHDC], eax	
				INVOKE	SelectObject,			[hOldFont],	  [hNewHDC], [ebx + MyTAB.hFont]
				INVOKE	SetTextColor, 			[hOldColor],  [hNewHDC], [ebx + MyTAB.nTextColor]
				INVOKE	SelectObject,			[hOldBrush],  [hNewHDC], [ebx + MyTAB.hBrushTab]
				INVOKE	SelectObject,			[hOldPen],    [hNewHDC], 0
				invoke	SetBkMode, 				[hNewHDC], TRANSPARENT
								
;}		

; 2 ЭТАП Вычесляем необходимые переменные {	
	
				mov		eax, [ebx + MyTAB.ind]														; Кол-во вкладок
				inc		eax
				shr		eax, 1
				mov		[cCountTabs], eax
				
;}

; 3 ЭТАП Рисуем фон	{
				invoke	FillRect,				[hNewHDC], esi, [ebx + MyTAB.hBrushFon]
;}
				
; 4 ЭТАП Рисуем все вкладки НЕВЫДЕЛЕННЫМИ {
@@:				mov		eax, [cCount]																; Получаем индекс по номеру вкладки
				dec		eax
				shl		eax, 1
				
				lea		edx, [eax + 1]
				M_LinkS	eax	
				mov		[pStr], eax																	; Адрес строки
																												
				M_LinkS	edx	
				mov		edx, dword[eax]
				mov		ecx, dword[eax + 4]
				add		[nW], edx																	;  ширина	
				mov	   	[nH], ecx 																	;  высота
																			
				push	[nX] [nY] [nW] [nH]															; Сохраняем размеры в описании вкладки
				pop		dword[eax + MyTABItem.nYEnd] dword[eax + MyTABItem.nXEnd] \
						dword[eax + MyTABItem.nY] dword[eax + MyTABItem.nX]
				
				invoke	Rectangle,		[hNewHDC], [nX], [nY], [nW], [nH]
				lea		eax, [nX]
				invoke	DrawText,		[hNewHDC], [pStr], -1, eax,\
										DT_CENTER + DT_SINGLELINE + DT_VCENTER
				push	[nW]																		; обеспечиваем координатами следующую кладку + смещение
				pop		[nX]
				dec		[nX]
				dec		[nW]

				inc		[cCount]
				dec		[cCountTabs]
				cmp		[cCountTabs], 0
				jnz		@b
;}				
				
; 5 ЭТАП Дорисовываем линию вкладок вправо {				
				
				lea		eax, [stPT]
				dec		[nH]
				invoke	MoveToEx, 		[hNewHDC], 0, [nH], eax
				invoke	LineTo,			[hNewHDC], [esi + RECT.right], [nH]
;}				

; 6 ЭТАП Рисуем активную вкладку	{				
				invoke	SetTextColor, 	[hNewHDC], [ebx + MyTAB.nTextColorSel]						; Настраиваем контекст
				invoke	SelectObject,	[hNewHDC], [ebx + MyTAB.hBrushTabSel]
				mov		eax, [ebx + MyTAB.nItemActive]												; Получаем индекс по номеру вкладки
				dec		eax
				shl		eax, 1
				
				mov		edx, eax
				M_LinkS	eax
				mov		[pStr], eax
				
				inc		edx
				M_LinkS	edx
				mov		[cCount], eax
				mov		[eax + MyTABItem.nY], 0
				add		[eax + MyTABItem.nXEnd], 3
				invoke	Rectangle,		[hNewHDC], [eax + MyTABItem.nX], [eax + MyTABItem.nY], \
										[eax + MyTABItem.nXEnd], [eax + MyTABItem.nYEnd]
				
				mov		eax, [cCount]
				inc 	[eax + MyTABItem.nX] 
				inc		[eax + MyTABItem.nY] 
				dec		[eax + MyTABItem.nXEnd]
				add		eax, 8
				mov		[cCount], eax
				invoke	FillRect,		[hNewHDC], [cCount], [ebx + MyTAB.hBrushFon]
									
				invoke	DrawText,		[hNewHDC], [pStr], -1, [cCount],\
										DT_CENTER + DT_SINGLELINE + DT_VCENTER	

;}										

; 7 ЭТАП Копируем на  оригинальный контекст {				
				invoke	BitBlt,			[edi + PAINTSTRUCT.hdc], 0, 0, [esi + RECT.right],\
										[esi + RECT.bottom], [hNewHDC], 0, 0, SRCCOPY 
;}

; 8 ЭТАП Возвращаем  контекст по умолчанию	{										
										
				invoke	SelectObject,  	[hNewHDC], [hOldBrush]												
				invoke	SetTextColor, 	[hNewHDC], [hOldColor]
				invoke	SetTextColor, 	[hNewHDC], [hOldFont]
				invoke	SetTextColor, 	[hNewHDC], [hOldPen]
				invoke	SetBkMode, 		[hNewHDC], OPAQUE	
				invoke	SelectObject,	[hNewHDC], [hOldBitmap]
						DelObject		eax
				invoke	DeleteDC,		[hNewHDC]
				cmp		eax, 0
				jz		.ErrDelMass
				invoke 	EndPaint,		[hwnd], edi
;}
				
				jmp 	.finish
																									;}
				
					
				
.ErrDelMass:	invoke 	DestroyWindow,		[hwnd]	
				X_PARAM 1, 999
				stc
				jmp		.finish
				
.ErrCreatMass:	mov		eax, -1
				stc
				jmp		.exit
	
.finish:		xor		eax, eax		
.exit:			pop		esi edi ebx

ret

endp
mikado3333 вне форума Ответить с цитированием
Старый 23.05.2017, 15:53   #5
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Вот попробовал создать простое окно №1 (WS_VISIBLE+WS_DLGFRAME) на нем дочернее окно №2 и кнопка №3. Родитель у №2, №3 является №1. Кнопка №3 пересекает дочернее окно №2. Кнопка не работает! Почему?

Код:
format PE GUI 4.0
entry start

include 'win32a.inc'

section '.data' data readable writeable
_class 		db 'FASMWIN32',0
_class2 	db 'FASMWIN32Child',0
_szClassb 	db  'BUTTON',0
_title 		db 'Пустое Окно',0
_error 		db 'Ошибка',0
_text		db "close",0

wc 			WNDCLASS 0,WindowProc,0,0,0,0,0,COLOR_BTNFACE+1,0,_class
wc2 		WNDCLASS 0,ChildProc,0,0,0,0,0,COLOR_BTNFACE+1,0,_class2
msg 		MSG

section '.code' code readable executable
start:
		invoke 	GetModuleHandle, 0
		mov 	[wc.hInstance], eax
		invoke 	LoadIcon, 0, IDI_APPLICATION
		mov 	[wc.hIcon], eax
		invoke 	LoadCursor, 0, IDC_ARROW
		mov 	[wc.hCursor], eax
		invoke 	RegisterClass, wc
		cmp 	eax, 0
		je 		error

		invoke 	CreateWindowEx,	0,_class,_title,WS_VISIBLE+WS_DLGFRAME+\
						WS_SYSMENU,128,128,256,192,0,0,[wc.hInstance],0
		cmp 	eax, 0
		je 		error
		mov		edi, eax
		
		
		invoke 	CreateWindowEx,	0,_class,_title,WS_VISIBLE+WS_CHILD + WS_BORDER,10,10,200,150,edi,0,[wc.hInstance],0
		cmp eax, 0
		je 	error
		
		invoke 	CreateWindowEx,		 0, _szClassb, _szClassb, WS_VISIBLE+WS_CHILD+\
											BS_PUSHBUTTON, 10, 50, 100, 50, \
											edi, 0,[wc.hInstance], 0
		
msg_loop:
		invoke GetMessage, msg, 0, 0, 0
		cmp    eax, 0
		je 	   end_loop
		invoke TranslateMessage, msg
		invoke DispatchMessage, msg
		jmp    msg_loop

error:	
		invoke MessageBox,0,_error,0,MB_ICONERROR+MB_OK
end_loop:
		invoke ExitProcess,[msg.wParam]

proc 	WindowProc hwnd,wmsg,wparam,lparam
		push 	ebx esi edi
		cmp 	[wmsg], WM_DESTROY
		je 		.wmdestroy
		
.defwndproc:
		invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
		jmp 	.finish
.wmdestroy:
		invoke PostQuitMessage,0
		mov    eax, 0
.finish:
		pop edi esi ebx
ret
endp

proc 	ChildProc hwnd,wmsg,wparam,lparam
		push 	ebx esi edi
		cmp 	[wmsg], WM_DESTROY
		je 		.wmdestroy
		
.defwndproc:
		invoke DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
		jmp 	.finish
.wmdestroy:
		invoke MessageBox, 0, _text, 0,0
		jmp	   .defwndproc
.finish:
		pop edi esi ebx
ret
endp


section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'api\kernel32.inc'
include 'api\user32.inc'
mikado3333 вне форума Ответить с цитированием
Старый 23.05.2017, 16:47   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Воспользуйтесь WS_CLIPCHILDREN/WS_CLIPSIBLINGS и посмотрите, что будет на экране. Если кнопка НЕ видна, значит она перекрыта.

Либо просто поменяйте местами порядок создания окон 2 и 3 дабы поменять их Z-order.
waleri на форуме Ответить с цитированием
Старый 25.05.2017, 13:07   #7
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Попробовал махнуть местами - сначала кнопка потом дочернее окно со стилем WS_CLIPSIBLINGS и работает. Но это понятно WS_CLIPSIBLINGS обеспечивает "ДЫРУ" под кнопку. Так же заметил что если не менять порядок (сначала окно потом кнопка) то нажимая по кнопке (которая отрисовывается но нет анимации при нажатии) то сообщения от ЛКМ получает родительское окно. Логика в голове рухнула. Я считал что если окна имеют одного родителя и в случаи перекрытия между собой поверх остается окно которой создалось последним и соответственно занимает верхнее положение в оси Z. Вроде все так и прорисовывается, но вот реакция на мышь происходит как будто родительское окно всех перекрыло. Чем это объяснить?
mikado3333 вне форума Ответить с цитированием
Старый 25.05.2017, 13:33   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от mikado3333 Посмотреть сообщение
Чем это объяснить?
Судя по всему, поиск окна по координатам мыши идет от первого наследника к последнему. Поскольку два окна перекрываются, то найденное окно (первое) лежит ниже по Z оси.

Лично никогда с этим не сталкивался ибо всегда скрывал ненужные окна, а когда делал свой таб переключатель родителем выступал само таб окно и никаких проблем не было.
waleri на форуме Ответить с цитированием
Старый 25.05.2017, 19:36   #9
mikado3333
Пользователь
 
Регистрация: 25.09.2013
Сообщений: 58
По умолчанию

Спасибо за разъяснения, но вот все же интересно за счёт чего window tab control ведёт себя подругому?
mikado3333 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск дочерних окон shanluu C# (си шарп) 1 22.01.2014 22:04
Затирание дочерних окон winapi x_Alex_x Помощь студентам 12 14.01.2013 21:12
Затиание дочерних окон x_Alex_x Помощь студентам 0 13.01.2013 12:56
Поведение дочерних окон maryan.vetrov C# (си шарп) 9 27.02.2011 18:09
SetWindowPos для дочерних окон и битмапов. Alex Cones Общие вопросы Delphi 4 02.02.2011 13:49