15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


NO ToolTips when MFC app in _AFXDLL, _USRDLL DLL

Dicky Singh -- Dicky@landmark.com
Thursday, April 11, 1996

ENV: Using 95+patch, VC++ 4.1

Here is a more easy to read and complete version of a question I asked a 
while back.  I also wrote an application that shows what I am talking 
about.   You can download Problem.zip from ftp://advn.com/pub/mfc (Thanks, 
Dave.)

Instructions for extracting:
With Winzip, select all files, click on extract, make sure "Use Directory 
Names" is checked.
OR
Copy to empty directory and Use command: Pkunzip -d Problem.zip)

Question:-------------------------------------
I recently moved a portion of a MFC application Shell.EXE to 
RunningReport.DLL.  RunningReport has a CWinApp Object  and is of the type 
"Regular DLL using Shared MFC DLL" and defines the following preprocessor 
definitions:
_MBCS, WIN32, _DEBUG, _WINDOWS, _WINDLL, _AFXDLL, _USRDLL

The Shell's main window and the RunningReport's main Window follow an 
interface similar to the MS Exchange, i.e. multiple SDI windows.

Both Shell.EXE and RunningReport.DLL have their own resources (toolbars 
dialogs etc.).  To access the correct resources I use 
AFX_MANAGE_STATE(AfxGetStaticModuleState( )); before each function in the 
DLL.

Both Shell and Running Report have CFrameWnd derived windows with CToolbar 
derived toolbars.

******
  The Tool tips on the Toolbars in RunningReport.DLL
  DO NOT show up.   The ToolTips in Shell Toolbars DO show up.
*******

Is there a way of doing what I am trying here?  Or a better way to handle 
Toolbar ToolTips in a DLL?
Appreciate any suggestions.

-Dicky
// Dicky@Landmark.COM



I am also attaching my previous message, it includes what I have tried.
-------------------------------------------
95+patch, VC++ 4.1

I recently moved an application which compiled as an EXE to a DLL (regular
DLL using a shared version of MFC DLL:  i.e. The DLL has a CWinApp and uses 
the shared version of MFC DLL)

This DLL (RunningReport.DLL) is called from an MFC EXE app (Shell.EXE).
 The Shell's main window and the RunningReport's main Window follow the
multiple template interface.

RunningReport.DLL has its own resources (toolbars dialogs etc.).  The Main
window in the RunningReport.DLL is a CFrameWnd derived frame, has CToolbar
and CStatusbar derived toolbars and statusbar respectively.   I correctly
push the module state on every DLL function entry and Pop it on DLL
function exit, because the Toolbars, Dialogs, etc.  come up correctly.

I further handle the Toolbar button states (depressed or not, enabled /
disabled ) by borrowing some processing time from Shell's CWinApp::OnIdle(
) and calling CWinApp::OnIdle in the RunningReport.DLL (again setting the
correct module state at entry and resetting at exit)

The Tool tips on the Toolbars in RunningReport.DLL  DO NOT show up.   The
ToolTips in Shell Toolbars DO show up.

(Yes, they have what I think is required for ToolTips to show.  The
ToolTips worked when RunningReport was a part of Shell.EXE).

This is what I tried:  In the Shell's PreTranslate Method I added a method
to call a function in RunningReport, which in turn calls the following
method on RunningReport's CFrame (CFrameWnd derived):  [pushed Module
state, before calling this etc.]

void CFrame::LetRunningReportHandleTheseToo(LPMSG pMsg)
{
        /*TRACE("H:%d M:%d W:%d X:%d Y:%d\n", pMsg->hwnd,
        pMsg->message-WM_MOUSEFIRST, pMsg->wParam,
        LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)); */
    try {
        if (pMsg->hwnd == m_wndToolBar.m_hWnd) {
            if (pMsg->hwnd) {
                CToolTipCtrl* p =
m_wndToolBar.GetToolBarCtrl().GetToolTips();
                if (p)
                    p->RelayEvent(pMsg);
                else TRACE(".");
            }
        }
    } catch (...) {	TRACE("#");       }
}


BUT p is always NULL    :-(

Is there a way of doing what I am trying here?  Or a better way to handle
Toolbar ToolTips in a DLL?
All suggestions welcome.


-Dicky
// Dicky@Landmark.COM
// Dragon Team




John W. Podlogar Jr. -- podlogar@telerama.lm.com
Monday, April 15, 1996


This is probably related to the fact that PreTranslateMessage
doesn't get called when your CWinApp in in a DLL. The way I 
get around this is to install a hook function. See the KB
article titled "Using a Tooltip Control with a Dialog Box"
for more info...

John W. Podlogar Jr.    The wise man doesn't pose the right answers, 
podlogar@lm.com                         he asks the right questions. 
http://www.lm.com/~podlogar

On Thu, 11 Apr 1996, Dicky Singh wrote:

> ENV: Using 95+patch, VC++ 4.1
> 
> Here is a more easy to read and complete version of a question I asked a 
> while back.  I also wrote an application that shows what I am talking 
> about.   You can download Problem.zip from ftp://advn.com/pub/mfc (Thanks, 
> Dave.)
> 
> Instructions for extracting:
> With Winzip, select all files, click on extract, make sure "Use Directory 
> Names" is checked.
> OR
> Copy to empty directory and Use command: Pkunzip -d Problem.zip)
> 
> Question:-------------------------------------
> I recently moved a portion of a MFC application Shell.EXE to 
> RunningReport.DLL.  RunningReport has a CWinApp Object  and is of the type 
> "Regular DLL using Shared MFC DLL" and defines the following preprocessor 
> definitions:
> _MBCS, WIN32, _DEBUG, _WINDOWS, _WINDLL, _AFXDLL, _USRDLL
> 
> The Shell's main window and the RunningReport's main Window follow an 
> interface similar to the MS Exchange, i.e. multiple SDI windows.
> 
> Both Shell.EXE and RunningReport.DLL have their own resources (toolbars 
> dialogs etc.).  To access the correct resources I use 
> AFX_MANAGE_STATE(AfxGetStaticModuleState( )); before each function in the 
> DLL.
> 
> Both Shell and Running Report have CFrameWnd derived windows with CToolbar 
> derived toolbars.
> 
> ******
>   The Tool tips on the Toolbars in RunningReport.DLL
>   DO NOT show up.   The ToolTips in Shell Toolbars DO show up.
> *******
> 
> Is there a way of doing what I am trying here?  Or a better way to handle 
> Toolbar ToolTips in a DLL?
> Appreciate any suggestions.
> 
> -Dicky
> // Dicky@Landmark.COM
> 
> 
> 
> I am also attaching my previous message, it includes what I have tried.
> -------------------------------------------
> 95+patch, VC++ 4.1
> 
> I recently moved an application which compiled as an EXE to a DLL (regular
> DLL using a shared version of MFC DLL:  i.e. The DLL has a CWinApp and uses 
> the shared version of MFC DLL)
> 
> This DLL (RunningReport.DLL) is called from an MFC EXE app (Shell.EXE).
>  The Shell's main window and the RunningReport's main Window follow the
> multiple template interface.
> 
> RunningReport.DLL has its own resources (toolbars dialogs etc.).  The Main
> window in the RunningReport.DLL is a CFrameWnd derived frame, has CToolbar
> and CStatusbar derived toolbars and statusbar respectively.   I correctly
> push the module state on every DLL function entry and Pop it on DLL
> function exit, because the Toolbars, Dialogs, etc.  come up correctly.
> 
> I further handle the Toolbar button states (depressed or not, enabled /
> disabled ) by borrowing some processing time from Shell's CWinApp::OnIdle(
> ) and calling CWinApp::OnIdle in the RunningReport.DLL (again setting the
> correct module state at entry and resetting at exit)
> 
> The Tool tips on the Toolbars in RunningReport.DLL  DO NOT show up.   The
> ToolTips in Shell Toolbars DO show up.
> 
> (Yes, they have what I think is required for ToolTips to show.  The
> ToolTips worked when RunningReport was a part of Shell.EXE).
> 
> This is what I tried:  In the Shell's PreTranslate Method I added a method
> to call a function in RunningReport, which in turn calls the following
> method on RunningReport's CFrame (CFrameWnd derived):  [pushed Module
> state, before calling this etc.]
> 
> void CFrame::LetRunningReportHandleTheseToo(LPMSG pMsg)
> {
>         /*TRACE("H:%d M:%d W:%d X:%d Y:%d\n", pMsg->hwnd,
>         pMsg->message-WM_MOUSEFIRST, pMsg->wParam,
>         LOWORD(pMsg->lParam), HIWORD(pMsg->lParam)); */
>     try {
>         if (pMsg->hwnd == m_wndToolBar.m_hWnd) {
>             if (pMsg->hwnd) {
>                 CToolTipCtrl* p =
> m_wndToolBar.GetToolBarCtrl().GetToolTips();
>                 if (p)
>                     p->RelayEvent(pMsg);
>                 else TRACE(".");
>             }
>         }
>     } catch (...) {	TRACE("#");       }
> }
> 
> 
> BUT p is always NULL    :-(
> 
> Is there a way of doing what I am trying here?  Or a better way to handle
> Toolbar ToolTips in a DLL?
> All suggestions welcome.
> 
> 
> -Dicky
> // Dicky@Landmark.COM
> // Dragon Team
> 
> 




| Вернуться в корень Архива |