2008-12-12 4 views
1

모든 종류의 컨트롤을 넣을 수있는 사용자 정의 툴팁을 만들고 싶습니다. CDialog에서 파생되었고 WS_POPUP | WS_BORDER 스타일을 사용했습니다. 또한 도구 설명 그림자를 얻으려면 OnInitDialog에 CS_DROPSHADOW 스타일을 추가하십시오.WS_POPUP 대화 상자가있는 사용자 정의 툴팁

그 다음 툴팁을 표시하거나 숨기려면 WM_MOUSEHOVERWM_MOUSELEAVE 이벤트를 관리합니다.

SetWindowPosSWP_NOACTIVATE을 사용하여 상위 항목이 비활성 상태가되고 새 대화 상자가 활성화되지 않도록 도구 설명을 표시합니다. 하지만 어쨌든, CDialog::Create 메서드를 사용하여 대화 상자를 만들면 기본 창이 비활성 상태가되어 매우 나쁜 영향을줍니다.

그래서 내 커스텀은 메인 윈도우 (또는 대화 상자의 부모 창)없이 WS_POPUP 스타일로 CDialog를 만들 수 있습니다. 새 대화 상자가 나타나면 비활성화됩니다. ???

도와 주셔서 감사합니다.

편집 :

if(!pTooltipDlg) 
{ 
    pTooltipDlg = new MyCustomTooltipDlg(); 
    pTooltipDlg->Create(MyCustomTooltipDlg::IDD, this); 
} 
pTooltipDlg->ShowWindow(SW_SHOWNOACTIVATE); 

:

IDD_LABEL_TOOLTIP_DLG DIALOGEX 0, 0, 100, 9 
    STYLE DS_SETFONT | WS_POPUP | WS_BORDER 
    FONT 8, "Tahoma", 0, 0, 0x0 
    BEGIN 
     LTEXT   "##################",IDC_TOOLTIP_LBL_TEXT,0,0,99,9 
    END 

툴팁을 표시하는 코드가 같은 것입니다 : 나는 ... 대화 상자를 만들려면이이 자원을 WS_VISIBLE 스타일을 사용하지 않는 처음에는 (즉, 생성이 호출 될 때) 메인 윈도우가 포커스를 잃습니다 ... 나머지는이 추악한 효과가 일어나지 않습니다 ... 그래서 나는 Create 때문입니다.

답변

0

확인. 나는 그것을 마침내 얻었다! 대화 상자가 활성화되지 않도록하려면 OnInitDialog 메서드에서 FALSE를 반환했습니다.

여러분 모두에게 감사드립니다.

3

창을 만들 때 WS_VISIBLE 플래그를 설정하지 마십시오. 그런 다음 ShowWindow를 SW_SHOWNA 또는 SW_SHOWNOACTIVATE와 함께 사용하여 대화 상자를 표시 할 수 있습니다.

+0

도움 주셔서 감사합니다. 지금 SetWindowPos 및 SWP_NOACTIVATE 대신 ShowWindow (SW_SHOWNOACTIVATE) 사용하고 있습니다. 나는이 선택을 깨닫지 못했고 훨씬 더 영리합니다. 여전히 작동하지 않습니다 ... 몇 가지 의견으로 질문을 편집했습니다. –

1

CDialog::Create()WS_VISIBLE으로 설정 하시겠습니까? Create()을 호출하는 것만으로도 부모로부터 포커스를받을 수 있습니다. 또한 툴팁 클래스에서 WM_SETFOCUS을 무시하고 이 아닌이 기본 클래스를 호출하면 포커스 변경 창이 불가능해질 수 있습니다.

+0

고마워요! 나는 또한 그것을 시도했다.내지도 팁 대화 상자에이 맵 항목 ON_WM_SETFOCUS()를 추가했지만 OnSetFocus 메소드가 호출되지 않았습니다. –

1

먼저 CDialog 대신 CWnd를 사용하는 것이 좋습니다. 이렇게하면 훨씬 더 세밀하게 제어 할 수 있습니다. 대화 상자 템플릿이 아닌 CDialog의 기능을 실제로 사용하지는 않습니다. 동적으로 컨트롤을 만드는 것이 그리 어렵지 않습니다.

또한 메시지 처리기에서 OnShowWindow를 처리하고 Mark Ransom의 주석과 같이 show 명령이 SW_SHOWNA로 변경되도록 할 수 있습니다.

또한 툴팁으로 NULL 상위 창이 있어야합니다.

+0

모든 종류의 컨트롤을 사용할 수 있기를 원하기 때문에 CWnd에 대한 CDialog를 변경하지 않는 것이 좋습니다. 예제에서 방금 Label을 사용했지만 ActiveX 등으로 훨씬 더 복잡한 대화 상자를 만들고 싶습니다. 다른 두 가지 제안 사항에 감사하지만 문제는 해결되지 않습니다. 감사합니다. –

관련 문제