Duilib フォームの ShowWindow() 関数と ShowModal() 関数、および duilib コントロールのいくつかのプロパティの分析

関数説明の序文を作成する

HWND CWindowWnd::Create(HWND hwndParent, LPCTSTR pstrName, DWORD dwStyle, DWORD dwExStyle, int x, int y, int cx, int cy, HMENU hMenu)
{
    
    
    if( GetSuperClassName() != NULL && !RegisterSuperclass() ) return NULL;
    if( GetSuperClassName() == NULL && !RegisterWindowClass() ) return NULL;
    m_hWnd = ::CreateWindowEx(dwExStyle, GetWindowClassName(), pstrName, dwStyle, x, y, cx, cy, hwndParent, hMenu, CPaintManagerUI::GetInstance(), this);
    ASSERT(m_hWnd!=NULL);
    return m_hWnd;
}

1. フォーム作成の流れ

「Windows メッセージ メカニズムの逆分析」では、Windows メッセージ メカニズムとフォームの作成プロセスが詳細に分析されており、Windows フォームの作成は、WNDCLASS インスタンスの宣言、フォームの登録、フォームの作成の 3 つのステップに分かれていると記載されていますさらに細分化すると、WNDCLASSインスタンスの宣言、フォームの登録、フォームの作成、フォームの表示の 4 つのステップに分けることができます。

ウィンドウの登録関数はRegisterClass()またはRegisterClassEx() 関数、ウィンドウの作成関数はCreateWindow()関数またはCreatewindowEx()関数、ウィンドウの表示関数はShowWindow()関数です。

この記事では、ShowWindow()関数に焦点を当てます。

2. ShowWindow関数

CreateWindowExでウィンドウを作成した後、この時点ではウィンドウは作成されていますが、まだ画面には表示されていません。

3. ShowWindow関数

関数 function: この関数は、指定されたウィンドウの表示状態を設定します。

関数プロトタイプ: BOOL ShowWindow (HWND hWnd、int nCmdShow)

hWndウィンドウ ハンドルを指し、nCmdShow はウィンドウの表示方法を指定します。アプリケーションを送信するプログラムがSTARTUPINFO構造体を提供する場合、アプリケーションが最初にShowWindowを呼び出すとき、このパラメータは無視されます。それ以外の場合、 ShowWindow関数が初めて呼び出されるとき、値は関数WinMainのnCmdShowパラメーターである必要があります後続の呼び出しでは、このパラメータは次のいずれかの値になります。

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPTSTR    lpCmdLine,
	_In_ int       nCmdShow)

ここに画像の説明を挿入

void ShowWindow(bool bShow = true, bool bTakeFocus = true);
void CWindowWnd::ShowWindow(bool bShow /*= true*/, bool bTakeFocus /*= false*/)
{
    
    
    ASSERT(::IsWindow(m_hWnd));
    if( !::IsWindow(m_hWnd) ) return;
    ::ShowWindow(m_hWnd, bShow ? (bTakeFocus ? SW_SHOWNORMAL : SW_SHOWNOACTIVATE) : SW_HIDE);
}

4. ShowModal() 関数

void ShowModal(HWND hWndParent = ::GetActiveWindow())

機能: ウィンドウをモーダルに表示します。つまり、ユーザーはウィンドウが閉じるまで他のウィンドウと対話できません。

パラメータ:

  • hWndParent:オプションのパラメータ。親ウィンドウのハンドルを指定します。デフォルトは、現在アクティブなウィンドウのハンドルです。親ウィンドウ ハンドルが指定されている場合、このウィンドウはモーダル ダイアログの親ウィンドウになります。

5. duilib コントロールのいくつかのプロパティ

5.1. Windows コントロール

Create	创建窗口
Close	关闭窗口
ShowWindow	显示或隐藏窗口
ShowModalFake	显示模态对话框(推荐)
CenterWindow	居中窗口,支持扩展屏幕
Init	窗口接收到 WM_CREATE 消息时会被调用,一般用于初始化
AttachDialog	绑定窗口的顶层容器
InitControls	初始化控件,在容器中添加控件时会被调用(用于对控件名称做缓存)
ReapObjects	回收控件
GetWindowResourcePath	获取窗口资源路径
SetWindowResourcePath	设置窗口资源路径
GetDefaultFontInfo	获取默认字体信息

5.2、制御制御

接口名称	用途
GetParent	获取父容器指针
GetAncestor	根据名称获取祖先容器指针
GetName	获取控件名称,对应 xml 中 name 属性
GetUTF8Name	获取控件名称,对应 xml 中 name 属性
SetName	设置控件名称,内存中设置不会写入 xml 中
SetUTF8Name	设置控件名称,内存中设置不会写入 xml 中(UTF8 编码)
GetWindow	获取关联的窗口指针
SetWindow	设置容器所属窗口
Init	初始化函数
DoInit	由 Init 调用,功能与 Init 相同
IsVisible	判断是否可见
IsInternVisible	待补充
IsFloat	判断控件是否浮动,对应 xml 中 float 属性
SetFloat	设置控件是否浮动
GetFixedWidth	获取固定宽度,对应 xml 中 width 属性
SetFixedWidth	设置控件固定宽度
GetFixedHeight	获取固定高度
SetFixedHeight	设置固定高度
GetMinWidth	获取最小宽度
SetMinWidth	设置最小宽度
GetMaxWidth	获取最大宽度
SetMaxWidth	设置最大宽度
GetMinHeight	获取最小高度
SetMinHeight	设置最小高度
GetMaxHeight	获取最大高度
SetMaxHeight	设置最大高度
GetWidth	获取实际宽度
GetHeight	获取实际高度
GetHorAlignType	获取水平对齐方式
SetHorAlignType	设置水平对齐方式
GetVerAlignType	获取垂直对齐方式
SetVerAlignType	设置垂直对齐方式
IsReEstimateSize	待补充
SetReEstimateSize	待补充
EstimateSize	待补充
GetPos	获取控件位置
SetPos	设置控件位置
Arrange	进行布局
ArrangeAncestor	让父容器排列
IsArranged	判断是否已经排列过
Invalidate	重绘控件
GetPosWithScrollOffset	待补充
GetScrollOffset	待补充
ArrangeSelf	待补充
GetBkColor	获取背景颜色
SetBkColor	设置背景颜色
GetStateColor	获取某个状态下的字体颜色
SetStateColor	设置某个状态下的字体颜色
GetBkImage	获取背景图片位置
GetUTF8BkImage	获取 UTF8 格式的背景图片位置
SetBkImage	设置背景图片
SetUTF8BkImage	设置背景图片(UTF8 格式字符串)
GetStateImage	获取指定状态下的图片位置
SetStateImage	设置某个状态下的图片
GetForeStateImage	获取指定状态下的前景图片
SetForeStateImage	设置某个状态下前景图片
GetState	获取控件状态
SetState	设置控件状态
GetEstimateImage	获取控件图片指针
GetBorderSize	获取边框大小
SetBorderSize	设置边框大小
GetBorderColor	获取边框颜色
SetBorderColor	设置边框颜色
SetBorderSize	设置边框的大小
GetLeftBorderSize	获取左侧边框大小
SetLeftBorderSize	设置左侧边框大小
GetTopBorderSize	获取顶部边框大小
SetTopBorderSize	设置顶部边框大小
GetRightBorderSize	获取右侧边框大小
SetRightBorderSize	设置右侧边框大小
GetBottomBorderSize	获取下方边框大小
SetBottomBorderSize	设置下方边框大小
GetBorderRound	获取边框大小
SetBorderRound	设置边框大小
GetCursorType	获取鼠标指针类型
SetCursorType	设置当前鼠标指针类型
GetToolTipText	获取控件在鼠标悬浮状态下的提示文本
GetUTF8ToolTipText	获取控件在鼠标悬浮状态下的提示文本(UTF8 格式)
SetToolTipText	设置鼠标悬浮到控件显示的提示文本
SetUTF8ToolTipText	设置鼠标悬浮到控件显示的提示文本(UTF8 格式)
SetToolTipTextId	设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字
SetUTF8ToolTipTextId	设置鼠标悬浮到控件显示的提示文本在语言文件中对应的文字(UTF8 格式)
SetToolTipWidth	设置鼠标悬浮到控件上提示的文本单行最大宽度
GetToolTipWidth	获取鼠标悬浮到控件上提示的文本单行最大宽度
IsContextMenuUsed	控件是否响应右键菜单消息
SetContextMenuUsed	设置控件响应右键菜单消息
GetDataID	获取用户绑定到控件的数据字符串
GetUTF8DataID	获取用户绑定到控件的数据字符串(UTF8 格式)
SetDataID	绑定一个字符串数据到控件
SetUTF8DataID	绑定一个字符串数据到控件(UTF8 格式)
GetUserDataBase	获取用户绑定的自定义数据结构
SetUserDataBase	绑定自定义数据到控件,用户可继承 UserDataBase 来补充需要绑定的数据
SetVisible	设置控件是否可见
SetInternVisible	待补充
SetVisible_	待补充
IsEnabled	检查控件是否可用
SetEnabled	设置控件可用状态
IsMouseEnabled	检查控件是否响应鼠标事件
SetMouseEnabled	设置控件是否响应鼠标事件
IsKeyboardEnabled	检查控件是否响应键盘事件
SetKeyboardEnabled	设置控件是否响应键盘事件
IsFocused	检查控件是否具有焦点
SetFocus	让控件获取焦点
SetNoFocus	让控件设置永远获取不到焦点
GetControlFlags	返回控件的标识,用于判断是否可以响应 TAB 切换事件
IsMouseFocused	判断当前鼠标焦点是否在控件上
SetMouseFocused	设置是否将鼠标焦点到控件上
IsActivatable	判断控件当前是否是激活状态
Activate	待补充
FindControl	根据坐标查找指定控件
GetPos	获取控件位置
SetPos	设置控件位置
GetMargin	获取控件的外边距
SetMargin	设置控件的外边距
EstimateSize	计算控件大小
EstimateText	待补充
IsPointInWithScrollOffset	检查指定坐标是否在滚动条当前滚动位置的范围内
HasHotState	判断控件是否处于 HOT 状态
SetReceivePointerMsg	设置控件是否响应触控消息
IsReceivePointerMsg	判断控件是否响应触控消息
SetNeedButtonUpWhenKillFocus	设置控件失去焦点时是否发送鼠标弹起消息
IsNeedButtonUpWhenKillFocus	判断控件失去焦点时是否发送鼠标弹起消息
SetAttribute	设置控件指定属性
SetClass	设置控件的 class 全局属性
ApplyAttributeList	应用一套属性列表
OnApplyAttributeList	待补充
HandleMessageTemplate	控件统一的消息处理入口,将传统 Windows 消息转换为自定义格式的消息
HandleMessageTemplate	将转换后的消息派发到消息处理函数
GetImage	根据图片路径缓存图片信息
DrawImage	绘制图片
GetRenderContext	获取绘制上下文对象
ClearRenderContext	清理绘制上下文对象
AlphaPaint	待补充
Paint	绘制控件的入口函数
PaintChild	绘制控件子项入口函数
SetClip	设置是否对绘制范围做剪裁限制
IsClip	判断是否对绘制范围做剪裁限制
SetAlpha	设置控件透明度
GetAlpha	获取控件透明度
IsAlpha	检查控件是否有透明属性
SetHotAlpha	设置焦点状态透明度
GetHotAlpha	获取焦点状态透明度
GetRenderOffset	获取控件绘制偏移量
SetRenderOffset	设置控件绘制偏移量
SetRenderOffsetX	设置控件偏移的 X 坐标
SetRenderOffsetY	设置控件偏移的 Y 坐标
StartGifPlayForUI	播放 GIF
StopGifPlayForUI	停止播放 GIF
AttachGifPlayStop	监听 GIF 播放完成通知

6. ShowWindow() と ShowModal() の違い

  • ShowWindow()は、非モーダルな方法でウィンドウを表示するために使用されます。ウィンドウは画面上に表示され、ユーザーは他のウィンドウと対話できます。つまり、複数のウィンドウを同時に操作できます。
  • ShowModal()はウィンドウをモーダルに表示するために使用され、ウィンドウは画面上に表示されますが、ユーザーがウィンドウを操作するときは、モーダル ウィンドウが閉じるまで他のウィンドウを同時に操作することはできません。

使用時には、特定のニーズと対話方法に応じて、適切な機能を選択してウィンドウを表示し、目的のユーザー エクスペリエンスを実現します。ウィンドウを非モーダルに表示してユーザーが他のウィンドウと対話できるようにする場合は、ShowWindow()を使用できます。ウィンドウをモーダルに表示して、モーダル ウィンドウが閉じるまでユーザーが他のウィンドウと対話できないようにする場合は、ShowModal()を使用できます。

6.1、DuiLibにおけるノンモードモードとモードモードの違い

  • 表示方法
    • 非モーダル モード: ウィンドウは、ユーザーが他のウィンドウと対話するのをブロックすることなく、非モーダル モードで表示されます。ユーザーは複数のウィンドウを同時に操作でき、自由にウィンドウを切り替えることができます。
    • モーダル モード: ウィンドウがモーダルに表示され、ユーザーによる他のウィンドウとの対話がブロックされます。モーダル ウィンドウが開いている間、ユーザーはウィンドウを操作することしかできず、モーダル ウィンドウが閉じるまで他のウィンドウを操作することはできません。
  • ユーザーインタラクション:
    • 非モーダル モード: ユーザーは、ウィンドウが表示されている間、他のウィンドウと対話できます。たとえば、編集ウィンドウでテキスト コンテンツを編集しているときでも、他のウィンドウをクリックしたり、他の操作を実行したりできます。
    • モーダル モード: ユーザーはモーダル ウィンドウのみを操作でき、モーダル ウィンドウが開いている間は他のウィンドウに切り替えることはできません。これにより、対応するアクションが完了するまで、ユーザーはモーダル ウィンドウとの対話に集中することができます。
  • ウィンドウ間の関係:
    • 非モーダル モード: ウィンドウ間には直接の親子関係はなく、画面上に同時に存在できる独立したトップレベル ウィンドウです。
    • モーダル方法: モーダル ウィンドウには親ウィンドウ (通常はそれを開いたウィンドウ) があります。モーダルウィンドウを開くと親ウィンドウは操作不能な状態となり、モーダルウィンドウを閉じた後にのみ親ウィンドウは操作可能な状態に戻ります。
  • 開閉方法
    • ノンモーダル モード: ノンモーダル ウィンドウは、閉じるボタンまたはその他の操作によって閉じることができます。
    • モーダル アプローチ: モーダル ウィンドウには通常、[OK] ボタンまたは [キャンセル] ボタンがあり、ユーザーはこれらのボタンを使用してモーダル ウィンドウを閉じる必要があります。
      要約:

ノンモーダル モードは、ユーザーが他のウィンドウとの対話を妨げることなく、複数のウィンドウを同時に操作できる状況に適しています。
モーダル方式は、ユーザーが特定のタスクまたは操作に集中する必要がある状況に適しており、モーダル ウィンドウがタスクを完了するか閉じるまで、ユーザーによる他のウィンドウとの対話をブロックします。

モードレス モード (非モーダル ダイアログ ボックス) とモーダル モード (モーダル ダイアログ ボックス) はウィンドウを表示する 2 つの異なる方法であり、ユーザー操作とアプリケーションの動作の点でいくつかの違いがあります。

  • 非モーダル モード (非モーダル ダイアログ ボックス) :

    • 特徴: モードレスな方法で表示されるウィンドウは、ユーザーが他のウィンドウと対話することを妨げません。
    • ユーザー操作: ユーザーは、ウィンドウが閉じるのを待たずに、他のアプリケーション ウィンドウとの操作を含め、複数のウィンドウを同時に操作できます。
    • アプリケーションの動作: 非モーダル ダイアログ ボックスは通常、一時的な情報、オプション、または機能を表示するために使用され、ユーザーは異なるウィンドウ間を自由に切り替えて操作できます。
  • モーダルな方法 (モーダル ダイアログ) :

    • 特徴: モーダルに表示されたウィンドウは、ユーザーが他のウィンドウと対話することをブロックします。
    • ユーザー操作: ユーザーはモーダル ダイアログ ボックスのみを操作でき、モーダル ダイアログ ボックスが閉じるまで他のウィンドウと操作できません。
    • アプリケーションの動作: モーダル ダイアログ ボックスは通常、重要な情報を表示するために使用され、ユーザーによる確認が必要であるか、必須項目を提供するため、ダイアログ ボックスが閉じるまでユーザーがダイアログ ボックスのコンテンツの処理中に他のウィンドウに切り替えることができないようにします。

概要:
非モーダル ダイアログ ボックスは、ユーザーが複数のウィンドウを同時に操作できるシナリオに適しており、一般的な情報の表示や一時的な機能に適しています。
モーダル ダイアログ ボックスは、ユーザーが処理に集中する必要がある状況に適しており、ユーザーが他のウィンドウに切り替えることができないため、重要な情報が無視されたり見落とされたりすることがなくなります。

6.2. MessageLoop() を使用せずに ShowWindow() モードで MessageLoop() と ShowModal() を使用する

  • ShowWindow()
    • ShowWindow() は、非モーダルな方法でウィンドウを表示します。つまり、ウィンドウが表示されている間、ユーザーは他のウィンドウと対話できます。
    • 一般に、ShowWindow() を使用する場合は、メイン メッセージ ループにメッセージ処理関数を追加して、ウィンドウ メッセージに応答し、ウィンドウの対話とイベントを処理する必要があります。
    • メインのメッセージ ループは通常、プログラムが終了するまでメッセージを受信して​​送信する無限ループです。
  • ShowModal()
    • ShowModal() はウィンドウをモーダルに表示します。つまり、ユーザーはウィンドウが閉じるまで他のウィンドウと対話できません。
    • ShowModal() を使用する場合、メッセージ ループを別途作成する必要はありません。DuiLib の ShowModal() メソッドは内部でモーダル メッセージ ループを開始し、モーダル ダイアログ ボックスが閉じるまで ShowModal() が呼び出された場所には戻りません。
    • ShowModal() を呼び出すと、モーダル ダイアログ ボックスが閉じられるまでプログラムの実行がブロックされ、その後、後続のコードの実行が続行されます。

例:

// 使用 ShowWindow()
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetCurrentPath(CPaintManagerUI::GetInstancePath());

CMainDlg *pFrame = new CMainDlg;
pFrame->Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
pFrame->ShowWindow();
CPaintManagerUI::MessageLoop();

// 使用 ShowModal()
CMainDlg *pFrame = new CMainDlg;
pFrame->Create(NULL, _T("DUIWnd"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
pFrame->ShowModal();

要約:

  • ShowWindow() は、それ自体でメイン メッセージ ループを作成し、その中でウィンドウ メッセージとイベントを処理する必要があります。
  • ShowModal()は内部でモーダル メッセージ ループを開始するため、モーダル ダイアログ ボックスが閉じるまでプログラムの実行をブロックする別のメッセージ ループを作成する必要はありません。

おすすめ

転載: blog.csdn.net/qq_44918090/article/details/131781747