モーダルウィンドウというのは勝手につけた名前ですが、モーダルダイアログ同様に他のウィンドウへの入力を一切受け付けなくするウィンドウのことです。
通常この手のウィンドウはDoModalを利用してリソースIDを指定して生成すると思うのですが、今回はリソースIDを使わずに白紙のモーダルウィンドウを生成したいのです。
リソースを使いたくない理由としては、ボタンも配置してない白紙のウィンドウを作るのにいちいちリソースを用意したくないということもありますが、ライブラリ内部で呼び出し生成したいというのが一番の理由です。
このライブラリは多種のプロジェクトから参照される自分用のライブラリで、DLLやLIBを使用しない、ソースファイルのみ(*.h,*.cpp)で構成されています。
もちろんソースファイルのみの構成なのでリソースファイルは含められません。
まあ、理由はどうでもいいですね^^;
よろしくおねがいします。
MFC の CDialog::DoModal() が、まさに
モードレスなウィンドウをプログラムでモーダルに見せる
具体例となっています。このソースが参考になるでしょう。
大体の構成は、
親.EnableWindow(FALSE);
自分を表示;
メッセージループ;
親.EnableWindow(TRUE);
となっています。
ダイアログテンプレートをメモリ上に作成して
InitModalIndirect→DoModal
でもいけそうです。
dairygoodsさん
subaruさん
ご回答ありがとうございます。
そしてすいませんorz
質問でDoModalって書いたために、MFCと察してもらえたようですが、実はプラットフォームSDKの環境なのでDialogBoxの方でした。
MFCもたまに使うので間違えてました。
で、subaruさんのInitModelIndirectという見慣れない関数を元にいろいろ調べたところ、
http://jet.breeze.jp/program/tips/dlgmem.htm
にたどり着きました。
今日は諸事情により(眠い)これが必要としていた情報か確かめられませんが、明日がんばって解決の報告ができたらと思います。
いろいろありがとうございました。
出来ました。
ちょっと不具合がありますが一応以下のような感じでできました。(なんかウィンドウサイズがおかすぃ)
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;
}
忘れてた^^;
以下の定義も必要
//! アラインサイズマクロ
#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;
ツイート | ![]() |