2008-09-09 29 views
4

MFC/non。netアプリケーションのモーダルダイアログボックスでLightboxスタイルの背景の調光を実装した人は誰もいません。
私は手順のようなものでなければならないであろうと思う:親ウィンドウのRECTを取得してオーバーレイを描くMFCアプリケーションのライトボックススタイルのダイアログ

  1. ダイアログ親HWNDまたはCWndのを取得します*

  2. 手順

  3. がそれを行うためのダイアログがモーダル描画ルーチン、例えばにDoModal(だ許可し、そのウィンドウの上に半透明)

これを行うための既存のライブラリ/フレームワークはありますか、またはMFCに半透明オーバーレイをドロップする最適な方法はありますか?ライトボックス]ダイアログボックス
alt text
alt text


編集は、ここで私はあなたが「ライトボックススタイルが」
一部のAppを何を意味するのかわからない場合は達成しようとしているもののモックアップです

答えて

4

は、私はプロパティを持つダイアログリソース作成ブライアンのリンク
まず*に基づいてやったことだ:

  • 国境FALSE
  • 3DをFALSE
  • FALSEクライアントエッジを見ます
  • ポップアップスタイル
  • 静的エッジ
  • FALSE透明TRUE
  • タイトルバーFALSE

、あなたは枠なしか何か、ちょうど灰色のボックスとのダイアログウィンドウで終わる必要があります。このように見えるように作成関数をオーバーライド :

BOOL LightBoxDlg::Create(UINT nIDTemplate, CWnd* pParentWnd) 
{ 

    if(!CDialog::Create(nIDTemplate, pParentWnd)) 
     return false; 
    RECT rect; 
    RECT size; 

    GetParent()->GetWindowRect(&rect); 
    size.top = 0; 
    size.left = 0; 
    size.right = rect.right - rect.left; 
    size.bottom = rect.bottom - rect.top; 
    SetWindowPos(m_pParentWnd,rect.left,rect.top,size.right,size.bottom,NULL); 

    HWND hWnd=m_hWnd; 
    SetWindowLong (hWnd , GWL_EXSTYLE ,GetWindowLong (hWnd , GWL_EXSTYLE) | WS_EX_LAYERED) ; 
    typedef DWORD (WINAPI *PSLWA)(HWND, DWORD, BYTE, DWORD); 
    PSLWA pSetLayeredWindowAttributes; 
    HMODULE hDLL = LoadLibrary (_T("user32")); 
    pSetLayeredWindowAttributes = 
     (PSLWA) GetProcAddress(hDLL,"SetLayeredWindowAttributes"); 
    if (pSetLayeredWindowAttributes != NULL) 
    { 
     /* 
     * Second parameter RGB(255,255,255) sets the colorkey 
     * to white LWA_COLORKEY flag indicates that color key 
     * is valid LWA_ALPHA indicates that ALphablend parameter 
     * is valid - here 100 is used 
     */ 
     pSetLayeredWindowAttributes (hWnd, 
      RGB(255,255,255), 100, LWA_COLORKEY|LWA_ALPHA); 
    } 


    return true; 
} 

その後、画像エディタ(48×48例えば)に小さな黒いビットマップを作成し、(この例ではIDB_BITMAP1)ビットマップリソースとしてインポートすることはWM_ERASEBKGNDメッセージをオーバーライドし

BOOL LightBoxDlg::OnEraseBkgnd(CDC* pDC) 
{ 

    BOOL bRet = CDialog::OnEraseBkgnd(pDC); 

    RECT rect; 
    RECT size; 
    m_pParentWnd->GetWindowRect(&rect); 
    size.top = 0; 
    size.left = 0; 
    size.right = rect.right - rect.left; 
    size.bottom = rect.bottom - rect.top; 

    CBitmap cbmp; 
    cbmp.LoadBitmapW(IDB_BITMAP1); 
    BITMAP bmp; 
    cbmp.GetBitmap(&bmp); 
    CDC memDc; 
    memDc.CreateCompatibleDC(pDC); 
    memDc.SelectObject(&cbmp); 
    pDC->StretchBlt(0,0,size.right,size.bottom,&memDc,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY); 

    return bRet; 
} 

希望するダイアログのDoModalでインスタンス化します。これはモーダルダイアログのように作成します。(必要に応じて、またはヒープ)スタック上に、それは手動で作成して、それはそれの上にあなたの実際のモーダルダイアログを作成して表示しています呼び出し:

INT_PTR CAboutDlg::DoModal() 
{ 
    LightBoxDlg Dlg(m_pParentWnd);//make sure to pass in the parent of the new dialog 
    Dlg.Create(LightBoxDlg::IDD); 
    Dlg.ShowWindow(SW_SHOW); 

    BOOL ret = CDialog::DoModal(); 

    Dlg.ShowWindow(SW_HIDE); 
    return ret; 
} 

を、これは正確に

上記アップ私のモックのようなもの になり

*まだダイアログボックスを作成せずにやっているような、やり直しの場所やその他の一般的な機能があります。

2

私はあなたがウィンドウを作成し、透過性を設定する必要があると思います。お手伝いをされるMFC CGlassDialog sample on CodeProjectがあります。また、Win32 APIでこれを行う方法については、articleもあります。ここで

+0

これは私が探しているもののようです。私はそれを試してみると、戻って報告する:) – geocoin

関連する問題