MFCアプリのライトボックススタイルダイアログ -- c++ フィールド と user-interface フィールド と mfc フィールド 関連 問題

Lightbox style dialogs in MFC App












4
vote

問題

日本語

MFC /非.NETアプリのモーダルダイアログボックスでLightboxスタイルのバックグラウンドを調整しました。
手続きは次のようなものである必要があると思います:

ステップ:

  1. ダイアログ親hwndまたはcwnd *

  2. 親ウィンドウのrectを取得し、そのウィンドウを超えた半透明でオーバーレイを描画

  3. ダイアログをモーダル描画ルーチン、e.g domodal()
  4. を実行できます。

    これを行う既存の図書館/フレームワークはありますか、またはMFCで半透明のオーバーレイを落とす最善の方法は何ですか?
    edit これは私が何を達成しようとしているもののモックアップ

    何人かのアプリ Alt Text

    ライトボックスダイアログボックス
    Alt Text

英語

Has anyone implemented Lightbox style background dimming on a modal dialog box in a MFC/non .net app.
I think the procedure would have to be something like:

steps:

  1. Get dialog parent HWND or CWnd*

  2. Get the rect of the parent window and draw an overlay with a translucency over that window

  3. allow the dialog to do it's modal draw routine, e.g DoModal()

Are there any existing libraries/frameworks to do this, or what's the best way to drop a translucent overlay in MFC?
edit Here's a mockup of what i'm trying to achieve if you don't know what 'lightbox style' means
Some App:
alt text

with a lightbox dialog box
alt text

</div
        

回答リスト

4
 
vote
vote
ベストアンサー
 

これは私がしたことです* Brianのリンクに基づいて
最初にプロパティを持つダイアログリソースを作成します。

  • 境界 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; }

イメージエディタ(48x48)に小さな黒いビットマップを作成し、それをビットマップリソースとしてインポートします(この例では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でインスタンス化し、それをモーダルダイアログのように作成し、スタック(または必要な場合はヒープ)を作成し、それを手動で呼び出して、それを表示してから、それ以前のモーダルダイアログを作成します。< / P> <事前> <コード> 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; }

とこれはの上のモックアップのように のようなものになります

*は、ダイアログボックスを開始することなく、その他の一般的なティディアップを作ることなく、改善の場所があります。

 

Here's what I did* based on Brian's links
First create a dialog resource with the properties:

  • border FALSE
  • 3D look FALSE
  • client edge FALSE
  • Popup style
  • static edge FALSE
  • Transparent TRUE
  • Title bar FALSE

and you should end up with a dialog window with no frame or anything, just a grey box. override the Create function to look like this:

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; } 

then create a small black bitmap in an image editor (say 48x48) and import it as a bitmap resource (in this example IDB_BITMAP1)
override the WM_ERASEBKGND message with:

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; } 

Instantiate it in the DoModal of the desired dialog, Create it like a Modal Dialog i.e. on the stack(or heap if desired), call it's Create manually, show it then create your actual modal dialog over the top of it:

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; } 

and this results in something exactly like my mock up above

*there are still places for improvment, like doing it without making a dialog box to begin with and some other general tidyups.

</div
 
 
2
 
vote

あなたはちょうどウィンドウを作成して透明度を設定する必要があると思います。 mfc CodeProject のcglassDialogサンプルがあなたを助けるかもしれません。 Win32 APIを行う方法については、

 

I think you just need to create a window and set the transparency. There is an MFC CGlassDialog sample on CodeProject that might help you. There is also an article on how to do this with the Win32 APIs.

</div
 
 
 
 

関連する質問

2  MS VC ++ 6クラスウィザード  ( Ms vc 6 class wizard ) 
OK、私は最後の16年間にわたり、C ++のさまざまな香りを通して、DOSのCから、C ++のさまざまなフレーバーを通して、最後の16年間で大幅な開発を行ってきたアプリケーションを開発しています。 SDK リリースビルドにはVS 2005を使用している間に...

6  Windows実行可能ファイルを削減します  ( Reduce windows executable size ) 
Windows上のC ++ / MFCアプリを持っています - 動的にリンクされていますそれは60kbの静的それの&gtです。 3MB。 それは電子メールによって顧客に配布されているので、できるだけ小さい必要があります。 MFCとMSCVRTライブラリを...

2  Win32 / MFCクライアントRectからウィンドウRectを取得します  ( Win32 mfc get window rect from client rect ) 
私はクライアントの四角を受け入れる場所がどこかにある機能があることを知っています。私はちょうど見つけることができない/それを覚えておいてください! 誰もがそれが何であるか知っていますか? それは次のようなことをするでしょう: <事前> <コード> const ...

0  CSCROLLVIEWとウィンドウサイズ  ( Cscrollview and window size ) 
(MFC質問)CSCrollViewで現在表示されているクライアント領域を決定するための最良の方法は何ですか?私は目に見える部分のサイズだけを必要とするので、getClientRect()はここでは動作しません。 ...

2  MFCで完全透過的なウィンドウを作成する方法?  ( How to create a compeletely transparent window with mfc ) 
MFCで完全に透明なウィンドウを作成したいのですが、これを行う方法がわかりません。あなたは私に道を教えてもらえますか? ありがとうございました! ...

1  ファイルからTextBox VC ++ 6.0へのUTF-8  ( Utf 8 from file to textbox vc 6 0 ) 
TextBoxまたはMessageBoxにutf8を読み、表示するための古いVC ++ 6.0 MFCプログラムを取得する方法好ましくは、現在そこに書かれているファイルの読み取りおよび表示のいずれかを破ることなく(かなり実質的な)。 CSTRING STR...

0  ActiveX ShockwaveFlashコントロールを使用したMFCアプリケーションの瞬時クローズを防ぐ方法  ( How to prevent the instant closing of mfc application with activex shockwaveflas ) 
だから私のMFCアプリケーションでShockwaveFlash ActiveX要素を使用しています。 問題は次のとおりです.SockwWavlashLash要素は、Adobe Flash Player ActiveXがシステムにインストールされている場合にのみ...

32  ユーザーがダイアログのサイズを変更しているときに、Windowsが自分のダイアログに何も再描画しないように強制するにはどうすればよいですか。  ( How do i force windows not to redraw anything in my dialog when the user is resi ) 
サイズ変更可能なウィンドウの角をつかみ、その後、Windowsは最初にウィンドウの内容を移動してから、サイズ変更されているウィンドウにWM_SIZEを発行します。 さまざまな子コントロールの動きを制御したいダイアログで、私はちらつきを排除したい、ユーザーは最初...

1  CWNDがフォーカスを受けるのを防ぐにはどうすればよいですか。  ( How can i prevent a cwnd from getting the focus ) 
MFCアプリケーションを書き、別のウィンドウから入力していないボタンを必要とします。 WS_TABSTOPスタイルの取り外しは、使用がマウスでボタンをクリックすると、残念ながらは役に立ちません。私がwm_lbuttondownをブロックするとき、私はビジュ...

0  既存のMFCアプリケーションにコンソールを追加します  ( Add console to existing mfc application ) 
クラスプロジェクトで2人の友達と仕事をして、D&AMPを作ります。Dゲーム。これまでのところキャラクターの作成のものやコマンドラインにストラットしていました。 今、私たちは一緒になっています、そして、私たちは一緒になっていて、私はコンソールにNYサイコロのロー...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有