Directorio de artículos
Crear prefacio de descripción de función
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. Proceso de creación de formularios
En el artículo "Análisis inverso del mecanismo de mensajes de Windows", se analiza en detalle el mecanismo de mensajes de Windows y el proceso de creación del formulario. El artículo establece que la creación del formulario de Windows se divide en tres pasos: declarar la instancia de WNDCLASS, registrar el formulario y crear el formulario . Si continúa subdividiendo, se puede dividir en cuatro pasos: declarar la instancia de WNDCLASS , registrar el formulario, crear el formulario y mostrar el formulario.
La función de registro de la ventana es RegisterClass() o RegisterClassEx() , la creación de la ventana es la función CreateWindow() o CreatewindowEx() y la visualización de la ventana es la función ShowWindow() .
Este artículo se centra en la función ShowWindow() .
2. función Mostrar ventana
Después de que CreateWindowEx crea una ventana, en este momento, aunque la ventana se haya creado, aún no se ha mostrado en la pantalla.
3. función Mostrar ventana
Función función: Esta función establece el estado de visualización de la ventana especificada.
Prototipo de función: BOOL ShowWindow (HWND hWnd, int nCmdShow)
Donde hWnd se refiere al identificador de la ventana; nCmdShow especifica cómo se muestra la ventana. Si el programa que envía la aplicación proporciona una estructura STARTUPINFO , este parámetro se ignora la primera vez que la aplicación llama a ShowWindow . De lo contrario, cuando se llama a la función ShowWindow por primera vez , el valor debe ser el parámetro nCmdShow en la función WinMain . En llamadas posteriores, este parámetro puede tener uno de los siguientes valores:
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. Función MostrarModal()
void ShowModal(HWND hWndParent = ::GetActiveWindow())
Función: Mostrar la ventana de forma modal, es decir, el usuario no puede interactuar con otras ventanas hasta que se cierre la ventana.
parámetro:
- hWndParent: parámetro opcional, especifica el identificador de la ventana principal, el predeterminado es el identificador de la ventana activa actual. Si se especifica un identificador de ventana principal, esta ventana será la ventana principal del cuadro de diálogo modal.
5. Algunas propiedades del control duilib
5.1 Controles de Windows
Create 创建窗口
Close 关闭窗口
ShowWindow 显示或隐藏窗口
ShowModalFake 显示模态对话框(推荐)
CenterWindow 居中窗口,支持扩展屏幕
Init 窗口接收到 WM_CREATE 消息时会被调用,一般用于初始化
AttachDialog 绑定窗口的顶层容器
InitControls 初始化控件,在容器中添加控件时会被调用(用于对控件名称做缓存)
ReapObjects 回收控件
GetWindowResourcePath 获取窗口资源路径
SetWindowResourcePath 设置窗口资源路径
GetDefaultFontInfo 获取默认字体信息
5.2, Mando mando
接口名称 用途
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. La diferencia entre ShowWindow() y ShowModal()
- ShowWindow() se usa para mostrar la ventana de una manera no modal, la ventana se mostrará en la pantalla y el usuario puede interactuar con otras ventanas, es decir, se pueden operar varias ventanas al mismo tiempo.
- ShowModal() se usa para mostrar una ventana de manera modal, y la ventana se mostrará en la pantalla, pero cuando el usuario interactúa con la ventana, no puede operar otras ventanas al mismo tiempo hasta que se cierre la ventana modal.
Cuando esté en uso, de acuerdo con las necesidades específicas y los métodos de interacción, seleccione la función apropiada para mostrar la ventana para lograr la experiencia de usuario deseada. Si desea que la ventana se muestre de forma no modal y permita que el usuario interactúe con otras ventanas, puede usar ShowWindow() ; si desea que la ventana se muestre de manera modal, impidiendo que el usuario interactúe con otras ventanas hasta que se cierre la ventana modal, puede usar ShowModal() .
6.1, la diferencia entre el modo sin modo y el modo de modo en DuiLib
- Método de visualización :
- Modo no modal: la ventana se muestra en un modo no modal sin impedir que el usuario interactúe con otras ventanas. Los usuarios pueden operar múltiples ventanas al mismo tiempo y pueden cambiar entre ventanas libremente.
- Modo modal: la ventana se muestra de forma modal, bloqueando la interacción del usuario con otras ventanas. Mientras la ventana modal está abierta, el usuario solo puede interactuar con la ventana y no puede operar otras ventanas hasta que la ventana modal esté cerrada.
- Interacción del usuario :
- Modo no modal: el usuario puede interactuar con otras ventanas mientras se muestra la ventana. Por ejemplo, al editar contenido de texto en una ventana de edición, aún puede hacer clic en otras ventanas o realizar otras operaciones.
- Modo modal: el usuario solo puede interactuar con la ventana modal y no puede cambiar a otras ventanas mientras la ventana modal está abierta. Esto asegura que el usuario se concentre en interactuar con la ventana modal hasta que se complete la acción correspondiente.
- Relación entre ventanas :
- Modo no modal: no existe una relación padre-hijo directa entre las ventanas, son ventanas independientes de nivel superior que pueden existir en la pantalla al mismo tiempo.
- Forma modal: una ventana modal tiene una ventana principal, generalmente la ventana que la abrió. Cuando se abre la ventana modal, la ventana principal se establecerá en un estado inoperable, y la ventana principal se restaurará al estado operativo solo después de que se cierre la ventana modal.
- Método de cierre :
- Modo no modal: una ventana no modal se puede cerrar con el botón de cerrar u otras operaciones.
- Enfoque modal: las ventanas modales suelen tener botones Aceptar o Cancelar a través de los cuales el usuario debe cerrar la ventana modal.
Resumir:
El modo no modal es adecuado para la situación en la que el usuario puede operar varias ventanas al mismo tiempo, sin bloquear la interacción del usuario con otras ventanas.
El método modal es adecuado para situaciones que requieren que el usuario se concentre en una tarea u operación específica y bloquea la interacción del usuario con otras ventanas hasta que la ventana modal completa la tarea o se cierra.
El modo no modal (cuadro de diálogo no modal) y el modo modal (cuadro de diálogo modal) son dos formas diferentes de mostrar ventanas y tienen algunas diferencias en términos de interacción del usuario y comportamiento de la aplicación.
-
Modo no modal (cuadro de diálogo no modal) :
- Características: una ventana que se muestra de manera no modal no impide que el usuario interactúe con otras ventanas.
- Interacción del usuario: los usuarios pueden operar varias ventanas al mismo tiempo, incluida la interacción con otras ventanas de aplicaciones, sin esperar a que se cierre la ventana.
- Comportamiento de la aplicación: los cuadros de diálogo no modales generalmente se usan para mostrar información temporal, opciones o funciones, y los usuarios pueden cambiar y operar libremente entre diferentes ventanas.
-
Modo modal (diálogo modal) :
- Características: las ventanas que se muestran de forma modal impiden que el usuario interactúe con otras ventanas.
- Interacción del usuario: el usuario solo puede interactuar con el cuadro de diálogo modal y no puede interactuar con otras ventanas hasta que se cierre el cuadro de diálogo modal.
- Comportamiento de la aplicación: los cuadros de diálogo modales generalmente se usan para mostrar información importante, deben ser confirmados por el usuario o proporcionar elementos obligatorios, lo que garantiza que el usuario no pueda cambiar a otras ventanas mientras procesa el contenido del cuadro de diálogo hasta que se cierra el cuadro de diálogo.
Resumen:
los cuadros de diálogo no modales son adecuados para escenarios en los que los usuarios pueden operar varias ventanas al mismo tiempo y son adecuados para la visualización de información general y funciones temporales.
Los cuadros de diálogo modales son adecuados para situaciones que requieren que el usuario se concentre en el procesamiento, asegurando que el usuario no pueda cambiar a otras ventanas para evitar ignorar o perder información importante.
6.2 Usar MessageLoop() y ShowModal() en el modo ShowWindow() sin usar MessageLoop()
- MostrarVentana():
- ShowWindow() muestra la ventana de forma no modal, es decir, el usuario puede interactuar con otras ventanas mientras se muestra la ventana.
- Generalmente, cuando usa ShowWindow(), necesita agregar una función de procesamiento de mensajes en el bucle de mensajes principal para responder a los mensajes de la ventana y manejar las interacciones y los eventos de la ventana.
- El bucle de mensajes principal suele ser un bucle infinito que recibe y envía mensajes hasta que el programa finaliza.
- MostrarModal():
- ShowModal() muestra la ventana de forma modal, es decir, el usuario no puede interactuar con otras ventanas hasta que se cierra la ventana.
- Al usar ShowModal(), no es necesario crear un bucle de mensajes por separado. El método ShowModal() en DuiLib iniciará un bucle de mensaje modal internamente y no volverá al lugar donde se llamó a ShowModal() hasta que se cierre el cuadro de diálogo modal.
- La llamada de ShowModal() bloqueará la ejecución del programa hasta que se cierre el cuadro de diálogo modal y luego continuará ejecutando los códigos posteriores.
Ejemplo:
// 使用 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();
Resumir:
- ShowWindow() necesita crear el bucle de mensajes principal por sí mismo y procesar los mensajes y eventos de la ventana en él.
- ShowModal() inicia internamente el ciclo de mensaje modal y no necesita crear un ciclo de mensaje separado, lo que bloqueará la ejecución del programa hasta que se cierre el cuadro de diálogo modal.