モーダルウィンドウを作るには?

解決


もふ  2006-06-08 18:29:38  No: 62093

モーダルウィンドウというのは勝手につけた名前ですが、モーダルダイアログ同様に他のウィンドウへの入力を一切受け付けなくするウィンドウのことです。

通常この手のウィンドウはDoModalを利用してリソースIDを指定して生成すると思うのですが、今回はリソースIDを使わずに白紙のモーダルウィンドウを生成したいのです。

リソースを使いたくない理由としては、ボタンも配置してない白紙のウィンドウを作るのにいちいちリソースを用意したくないということもありますが、ライブラリ内部で呼び出し生成したいというのが一番の理由です。

このライブラリは多種のプロジェクトから参照される自分用のライブラリで、DLLやLIBを使用しない、ソースファイルのみ(*.h,*.cpp)で構成されています。
もちろんソースファイルのみの構成なのでリソースファイルは含められません。

まあ、理由はどうでもいいですね^^;
よろしくおねがいします。


dairygoods  2006-06-08 22:14:44  No: 62094

MFC の CDialog::DoModal() が、まさに
モードレスなウィンドウをプログラムでモーダルに見せる
具体例となっています。このソースが参考になるでしょう。

大体の構成は、

親.EnableWindow(FALSE);
自分を表示;
メッセージループ;
親.EnableWindow(TRUE);

となっています。


subaru  2006-06-08 22:45:23  No: 62095

ダイアログテンプレートをメモリ上に作成して
InitModalIndirect→DoModal
でもいけそうです。


もふ  2006-06-09 09:07:03  No: 62096

dairygoodsさん
subaruさん
ご回答ありがとうございます。

そしてすいませんorz
質問でDoModalって書いたために、MFCと察してもらえたようですが、実はプラットフォームSDKの環境なのでDialogBoxの方でした。
MFCもたまに使うので間違えてました。

で、subaruさんのInitModelIndirectという見慣れない関数を元にいろいろ調べたところ、
http://jet.breeze.jp/program/tips/dlgmem.htm
にたどり着きました。

今日は諸事情により(眠い)これが必要としていた情報か確かめられませんが、明日がんばって解決の報告ができたらと思います。

いろいろありがとうございました。


もふ  2006-06-09 17:14:48  No: 62097

出来ました。
ちょっと不具合がありますが一応以下のような感じでできました。(なんかウィンドウサイズがおかすぃ)

u_int EsDialogBox( u_int ex_style, u_int style, int x, int y, int w, int h, HINSTANCE hInstance, HWND hWndOwner, DLGPROC DialogProc )
{
  LPDLGTEMPLATEEX pDlg;
  LPWORD lpw;
  int nChar;

  char TmpBuffer[1024] = {0};

  pDlg = (LPDLGTEMPLATEEX)TmpBuffer;
  pDlg->dlgVer    = 1;
  pDlg->signature    = 0xFFFF;
  pDlg->exStyle    = ex_style;
  if( style )
  {
    pDlg->style    = style;
  }
  else
  {
    pDlg->style = WS_POPUP | WS_BORDER | WS_SYSMENU
              | DS_MODALFRAME | WS_CAPTION;
  }
  pDlg->cDlgItems    = 0;
  pDlg->x        = x;
  pDlg->y        = y;
  pDlg->cx      = w;
  pDlg->cy      = h;

  // 次のメンバの設定に移ります。
  lpw = (LPWORD) (pDlg + 1);

  // <Menu ID>
  *lpw++ = 0;

  // <Window Class>
  *lpw++ = 0;

  // <Dialog Title>
  nChar = MultiByteToWideChar(CP_ACP, 0, "Null Name", -1, (LPWSTR)lpw, 50 );
  lpw += nChar;

  // padding
  u_int add = (u_int)lpw;
  add = ALIGN4(add);
  lpw = (LPWORD)add;

  DialogBoxIndirect( hInstance, (LPDLGTEMPLATE)TmpBuffer, hWndOwner, (DLGPROC)DialogProc );

  return true;
}


もふ  2006-06-09 17:17:26  No: 62098

忘れてた^^;
以下の定義も必要

//! アラインサイズマクロ
#define ALIGNSIZE( x, a )  ( (x + ( a - 1 )) & ~( a - 1 ) ) 
//! 4Byteアラインサイズ
#define ALIGN4(x)      ALIGNSIZE( x, 4 )

typedef unsigned int  u_int;

typedef struct
{
    WORD dlgVer;
    WORD signature;
    DWORD helpID;
    DWORD exStyle;
    DWORD style;
    WORD cDlgItems;
    short x;
    short y;
    short cx;
    short cy;

    // <Menu ID>;
    // <Window Class>;
    // <Dialog Title>;
    // WORD fontSize;
    // WORD fontWeight;
    // BYTE fontItalic;
    // BYTE fontCharset;
    // WCHAR fontName[];
    // DLGITEMTEMPLATEEX controls[cDlgItems];
} DLGTEMPLATEEX, FAR* LPDLGTEMPLATEEX;

typedef struct
{
    // BYTE padding[];
    DWORD helpID;
    DWORD exStyle;
    DWORD style;
    short x;
    short y;
    short cx;
    short cy;
    DWORD id;

    // <Window Class>;
    // <Control Text>;
    // WORD SizeOfCreationData;
    // BYTE CreationData[SizeOfCreationData];
} DLGITEMTEMPLATEEX, FAR* LPDLGITEMTEMPLATEEX;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加