2011-12-14 4 views
2

WM_NOTIFY 메시지는 내부 "도구 설명"(메시지 풍선) 및 기타 제어 알림에 자주 사용되지만, TFrame에 컨트롤을 배치하면 해당 컨트롤에 대해 WM_NOTIFY 메시지가 발생하지 않습니다. 왜 그 메시지가 내 양식으로 보내지지 않고 그걸 어떻게 할 수 있습니까?양식이 TFrame의 하위 항목에 대해 WM_NOTIFY 메시지를받지 않는 이유는 무엇입니까?

+0

문제점을 복제 할 수 없습니다. 도구 설명 창 스타일 = 0, TToolInfo.uFlags : = TTF_IDISHWND 또는 TTF_SUBCLASS, Info.hwnd : = Form.Handle, Info.uId : = Control.Handle 및 프레임 자체가 아닌 TTN_SHOW 및 TTN_POP에 대한 WM_NOTIFY를받습니다. 다른 것 (물론 창 컨트롤을위한). 나는 툴팁 자체를 잘못 설정했다고 생각한다. –

답변

7

WM_NOTIFY은 컨트롤의 부모 창으로 전송됩니다. 즉, 자신의 부모 인 TForm (또는 다른 부모)이 아닌 TFrame이 직접적인 자식 컨트롤에 대한 메시지를 수신하게됩니다.

WM_NOTIFY을 직접 처리하면 안됩니다. 새 WindowProc 처리기를 할당하는 등 자식 컨트롤 자체를 서브 클래 싱 한 다음 CN_NOTIFY 메시지를 대신 처리하십시오. VCL은 원래 WM_NOTIFY 메시지를 수신하고 CN_NOTIFY 메시지가 속하는 특정 컨트롤에 자동으로 전달합니다.

동일한 내용이 WM_COMMAND (CN_COMMAND으로 전달됨) 및 많은 다른 전달 시스템 메시지에도 적용됩니다. Controls.pas 장치는 전달 된 시스템 메시지에 대해 정의 된 사용 가능한 모든 CN_... 메시지를 정의합니다.

+0

이것은이 특정 질문에 적용되지 않는 일반화 된 대답입니다. 도구 설명 컨트롤이 올바르게 설정된 경우 해당 * 소유자 * 창과 상호 작용합니다. 이는 개별 자식 컨트롤이 아니라 알림을 보내는 도구 설명 컨트롤이므로 의미가 있습니다. –

+0

이것은 일반적인 대답 일 수 있지만 Alfa000은 일반적인 질문을했습니다. 도구 설명을 실제로 만들고 표시하는 방법에 대한 구체적인 내용을 알지 못하면 'TForm'이 툴팁의 소유 윈도우가 아니므로 'TForm'이 WM_NOTIFY를받지 못하는 이유를 설명 할 수 있습니다. 'TFrame'에 배치 된 컨트롤에 대한 메시지입니다. 내 생각 엔 실제로'Control.Handle' 또는'Control.Parent.Handle'을 대신 사용하고 있습니다 (후자는'WM_NOTIFY'가'TForm' 윈도우에 보내지는 것을 허용 할 것입니다.). –

+0

귀하의 의견에 이의가 없지만 답변은 여전히 ​​적용되지 않습니다. 그것은 말합니다 * "WM_NOTIFY는 컨트롤의 부모 윈도우로 전송됩니다"*, 툴팁 컨트롤의 윈도우에는 부모가 없으며, 이는 팝업 윈도우입니다. –