簡體   English   中英

用於 Internet Explorer 閃爍的兒童 window

[英]Child window for Internet explorer flickering

我正在編寫一個瀏覽器助手 object 並想在 Internet Explorer window 中顯示一個孩子 window 以向用戶顯示一些消息。 我使用 DS_CONTROL 和 WS_CHILDWINDOW 並希望獲得類似於此圖像中消息的行為:在此處輸入圖像描述

我成功插入並顯示了一個子 window,但是 window 閃爍,有時它是可見的,有時網站內容在 z 坐標中高於 window。 我試圖將子 window 設置為最頂層的 window,但這並沒有改變任何東西。 如何讓子 window 在關閉之前始終可見? 這是我使用的一些源代碼:

資源.rc:

#include <windows.h>
#include <commctrl.h>
#include <richedit.h>
#include "resource.h"
//
// Dialog resources
//
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDD_NOTIFICATIONBAR DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CONTROL | DS_MODALFRAME | DS_SYSMODAL | DS_SHELLFONT | WS_VISIBLE |  WS_CHILDWINDOW
EXSTYLE WS_EX_TOPMOST
FONT 8, "Ms Shell Dlg"
{
    DEFPUSHBUTTON   "OK", IDOK, 129, 7, 50, 14
    PUSHBUTTON      "Cancel", IDCANCEL, 129, 24, 50, 14
    LTEXT           "Static", IDC_STATIC, 25, 16, 68, 21, SS_LEFT
}

對話 class:

#include "atlbase.h"
#include "atlwin.h"
#include "resources/resource.h"

class CMyDialog : public CDialogImpl<CMyDialog>
{
public:
   enum { IDD = IDD_NOTIFICATIONBAR };

   BEGIN_MSG_MAP(CMyDialog)
      MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
      COMMAND_HANDLER(IDCANCEL, BN_CLICKED, OnBnClickedCancel)
   END_MSG_MAP()

   CMyDialog() {Create(::GetActiveWindow());}

   ~CMyDialog() {DestroyWindow();}

   LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, 
      BOOL& /*bHandled*/)
   {
      // ::MessageBox(NULL,_T("OnInit"),_T("OnInit"),MB_ICONINFORMATION|MB_OK);
      // Do some initialization code
      return 1;
   }

   static CMyDialog &getInstance()
   {
       static CMyDialog dlg;
       return dlg;
   }
public:
   LRESULT OnBnClickedCancel(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
   {
       ShowWindow(SW_HIDE);
       return 0;
   }
};

稱呼:

CMyDialog &bar=CMyDialog::getInstance();
bar.ShowWindow(SW_SHOWNORMAL);

您必須調整 MSHTML window 的大小以便為您的控制騰出空間。

嘗試通過操縱為您的控制騰出空間

第二個鏈接還包含一個示例,用於獲取選項卡的 window 句柄。 但我不知道這是否也適用於 BHO 或僅在托管控件時有效。

最后我可以解決它(借助我從下面許多不同答案中獲得的信息)。

對於那些有同樣問題的人,這里的解決方案是:我必須縮小顯示 HTML 網站的 window,所以我自己的 window 不與它重疊。 為此,我得到了此處示例中的當前選項卡。 此選項卡 window 包含 html 文檔 window 和狀態欄。 所以我調用 FindWindowEx 兩次來獲取這兩個 windows 的 HWND:

FindWindowEx(tab,NULL,_T("Shell DocObject View"),_T("")) //html document window
FindWindowEx(tab,NULL,_T("msctls_statusbar32"),_T("")) //status bar

然后我調整文檔 window 的大小,以便它填充整個客戶區,除了狀態欄占據的位置和我的對話框占據的位置。 這是代碼(webbrowser.getCurrentTabHwnd() 是上面提到的示例實現。isShown 是一個變量,指示是否應該顯示我的對話框):

CWindow tab(webbrowser.getCurrentTabHwnd());
CWindow child(FindWindowEx(tab,NULL,_T("Shell DocObject View"),_T("")));
CWindow statusbar(FindWindowEx(tab,NULL,_T("msctls_statusbar32"),_T("")));

RECT statusbarrect;
statusbar.GetWindowRect(&statusbarrect);
RECT documentrect;
tab.GetClientRect(&documentrect);
documentrect.bottom-=(statusbarrect.bottom-statusbarrect.top);

if(isShown)
{
    //Request document window rect
    static const unsigned int DLGHEIGHT=50;
    RECT dialogrect=documentrect;
    documentrect.top+=DLGHEIGHT;
    dialogrect.bottom=dialogrect.top+DLGHEIGHT;
    //Shrink document window
    MoveWindow(&dialogrect);
}

child.MoveWindow(&documentrect);

現在必須在每個瀏覽器 window 調整大小和對話框顯示/隱藏上調用這段代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM