📄 dialog.c
字号:
// 带参数创建并初始化对话框窗口,并进入模式处理过程
// 引用:
// 系统API
// ************************************************
int WINAPI Dlg_BoxIndirectParam( HANDLE hInst, LPDLG_TEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit )
{
return DoBoxIndirectParam( hInst, lpTemplate, hWndParent, lpDialogFunc, lParamInit, GetCallerProcess() );
}
// **************************************************
// 声明:int WINAPI Dlg_BoxIndirect(
// HANDLE hInst,
// LPDLG_TEMPLATE lpTemplate,
// HWND hWndParent,
// DLGPROC lpDialogFunc )
// 参数:
// IN hInst - 实例句柄
// IN lpTemplate - 对话框模板结构
// IN hWndParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// 返回值:
// 假入成功,返回处理结果;否则,返回 -1
// 功能描述:
// 不带参数创建并初始化对话框窗口,并进入模式处理过程
// 引用:
// 系统API
// ************************************************
int WINAPI Dlg_BoxIndirect( HANDLE hInst, LPDLG_TEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc )
{
return DoBoxIndirectParam( hInst, lpTemplate, hWndParent, lpDialogFunc, 0, GetCallerProcess() );
}
//ex-begin
// **************************************************
// 声明:static HWND DoCreateDialogEx( HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpcdt,
// HWND hParent,
// DLGPROC lpDialogFunc,
// LPARAM lParamInit,
// BOOL *lpbVisible,
// HANDLE hCallerProcess )
// 参数:
// IN hInst - 实例句柄
// IN lpcdt - 对话框模板结构(DLG_TEMPLATE_EX结构指针)
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// IN lParamInit - 传递给 WM_INITDIALOG 消息的LPARAM参数
// OUT lpbVisible - 用于接受是否可视
// IN hCallerProcess - 呼叫该功能的进程
// 返回值:
// 假入成功,返回创建的窗口句柄;否则,返回 NULL
// 功能描述:
// 创建并初始化对话框窗口,与DoCreateDialog不同,包含扩展风格。
// 引用:
//
// ************************************************
#define DEBUG_DO_CREATE_DIALOG_EX 0
static HWND DoCreateDialogEx( HINSTANCE hInst,
LPCDLG_TEMPLATE_EX lpcdt,
HWND hParent,
DLGPROC lpDialogFunc,
LPARAM lParamInit,
BOOL *lpbVisible,
HANDLE hCallerProcess )
{
HWND hWnd, hChild;
LPCDLG_ITEMTEMPLATE_EX lpcdi = (LPCDLG_ITEMTEMPLATE_EX)(lpcdt + 1);
int i, x, y;
BOOL bVisible;
const char * lpClassName;
*lpbVisible = FALSE;
//映射指针到调用者进程
if( lpcdt->lpcClassName )
{
#ifdef _MAPPOINTER
lpClassName = (const char *)MapPtrToProcess( (LPVOID)lpcdt->lpcClassName, hCallerProcess );
#else
lpClassName = lpcdt->lpcClassName;
#endif
}
else
lpClassName = classDIALOG;
bVisible = (lpcdt->dwStyle & WS_VISIBLE) ? 1 : 0;
x = lpcdt->x; y = lpcdt->y;
if( lpcdt->dwStyle & DS_CENTER )
{
RECT rect;
//计算显示矩形和位置
if( hParent && (lpcdt->dwStyle & WS_CHILD) )
{
GetClientRect( hParent, &rect );
}
else
{
//rect.left = AP_XSTART;
//rect.top = AP_YSTART;
//rect.right = rect.left + AP_WIDTH;
//rect.bottom = rect.top + AP_HEIGHT;
rect.left = GetSystemMetrics( SM_XCENTER );//AP_XSTART;
rect.top = GetSystemMetrics( SM_YCENTER );//AP_YSTART;
rect.right = rect.left + GetSystemMetrics( SM_CXCENTER );//AP_WIDTH;
rect.bottom = rect.top + GetSystemMetrics( SM_CYCENTER );//AP_HEIGHT;
}
x = ( (rect.right-rect.left) - lpcdt->cx ) / 2 + rect.left;
y = ( (rect.bottom-rect.top) - lpcdt->cy ) / 2 + rect.top;
}
DEBUGMSG( DEBUG_DO_CREATE_DIALOG_EX, ( "DoCreateDialogEx: Create Main Window.\r\n" ) );
//创建主窗口
hWnd = CreateWindowEx( lpcdt->dwExStyle,
(LPCBYTE)lpClassName,
#ifdef _MAPPOINTER
MapPtrToProcess( (LPVOID)lpcdt->lpcWindowName, hCallerProcess ),
#else
lpcdt->lpcWindowName,
#endif
lpcdt->dwStyle & (~WS_VISIBLE),
x,
y,
lpcdt->cx,
lpcdt->cy,
hParent,
(HMENU)lpcdt->id,//hMenu,
hInst,
(LPVOID)lpDialogFunc );
if( hWnd )
{
//创建子窗口
i = lpcdt->cdit;
DEBUGMSG( DEBUG_DO_CREATE_DIALOG_EX, ( "DoCreateDialogEx: Create Sub Window( cdit=%d ).\r\n", i ) );
while( i )
{
hChild = CreateWindowEx(
lpcdi->dwExStyle,
#ifdef _MAPPOINTER
MapPtrToProcess( (LPVOID)lpcdi->lpcClassName, hCallerProcess ),
MapPtrToProcess( (LPVOID)lpcdi->lpcWindowName, hCallerProcess ),
#else
lpcdi->lpcClassName,
lpcdi->lpcWindowName,
#endif
lpcdi->dwStyle|WS_CHILD,
lpcdi->x,
lpcdi->y,
lpcdi->cx,
lpcdi->cy,
hWnd,
(HMENU)lpcdi->id,
hInst,
lpcdi->lpParam );
if( hChild == NULL )
{ //其中一个子窗口失败
DestroyWindow( hWnd );
hWnd = NULL;
DEBUGMSG( DEBUG_DO_CREATE_DIALOG_EX, ( "DoCreateDialogEx: Create Sub Window(class=%s,title=%s) Failure( cdit=%d ).\r\n", lpcdi->lpcClassName ? lpcdi->lpcClassName : "", lpcdi->lpcWindowName ? lpcdi->lpcWindowName : "" ) );
break;
}
i--;
lpcdi++;
}
*lpbVisible = bVisible;
}
return hWnd;
}
// **************************************************
// 声明:static HWND DoCreateIndirectParamEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpcdt,
// HWND hParent,
// DLGPROC lpDialogFunc,
// LPARAM lParamInit,
// HANDLE hCallerProcess )
// 参数:
// IN hInst - 实例句柄
// IN lpcdt - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// IN lParamInit - 传递给 WM_INITDIALOG 消息的LPARAM参数
// IN hCallerProcess - 呼叫该功能的进程
// 返回值:
// 假入成功,返回创建的窗口句柄;否则,返回 NULL
// 功能描述:
// 带参数创建并初始化对话框窗口(包含窗口的扩展分格)
// 引用:
//
// ************************************************
static HWND DoCreateIndirectParamEx( HINSTANCE hInst,
LPCDLG_TEMPLATE_EX lpcdt,
HWND hParent,
DLGPROC lpDialogFunc,
LPARAM lParamInit,
HANDLE hCallerProcess )
{
BOOL bVisible;
HWND hWnd = DoCreateDialogEx( hInst, lpcdt, hParent, lpDialogFunc, lParamInit, &bVisible, hCallerProcess );
if( hWnd )
{
SendMessage( hWnd, WM_INITDIALOG, 0, lParamInit );
if( bVisible )
{ //显示窗口
ShowWindow( hWnd, SW_SHOWNORMAL );
}
}
return hWnd;
}
// **************************************************
// 声明:HWND WINAPI Dlg_CreateIndirectParamEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpcdt,
// HWND hParent,
// DLGPROC lpDialogFunc,
// LPARAM lParamInit
// )
// 参数:
// IN hInst - 实例句柄
// IN lpcdt - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// IN lParamInit - 传递给 WM_INITDIALOG 消息的LPARAM参数
// 返回值:
// 假入成功,返回创建的窗口句柄;否则,返回 NULL
// 功能描述:
// 带参数创建并初始化对话框窗口(包含窗口的扩展分格)
// 引用:
// 系统API
// ************************************************
HWND WINAPI Dlg_CreateIndirectParamEx( HINSTANCE hInst,
LPCDLG_TEMPLATE_EX lpcdt,
HWND hParent,
DLGPROC lpDialogFunc,
LPARAM lParamInit )
{
return DoCreateIndirectParamEx( hInst, lpcdt, hParent, lpDialogFunc, lParamInit, GetCallerProcess() );
}
// **************************************************
// 声明:HWND WINAPI Dlg_CreateIndirectParamEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpcdt,
// HWND hParent,
// DLGPROC lpDialogFunc
// )
// 参数:
// IN hInst - 实例句柄
// IN lpcdt - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// 返回值:
// 假入成功,返回创建的窗口句柄;否则,返回 NULL
// 功能描述:
// 创建并初始化对话框窗口(包含窗口的扩展分格)
// 引用:
// 系统API
// ************************************************
HWND WINAPI Dlg_CreateIndirectEx( HINSTANCE hInst, LPCDLG_TEMPLATE_EX lpTemplate, HWND hParent, DLGPROC lpDialogFunc )
{
return DoCreateIndirectParamEx( hInst, lpTemplate, hParent, lpDialogFunc, 0, GetCallerProcess() );
}
// **************************************************
// 声明:int DoBoxIndirectParamEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpTemplate,
// HWND hWndParent,
// DLGPROC lpDialogFunc,
// LPARAM lParamInit,
// HANDLE hCallerProcess
// )
// 参数:
// IN hInst - 实例句柄
// IN lpTemplate - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// IN lParamInit - 传递给 WM_INITDIALOG 消息的LPARAM参数
// IN hCallerProcess - 呼叫者进程
// 返回值:
// 假入成功,返回对话框返回的值;否则,返回 -1
// 功能描述:
// 1).带参数创建并初始化对话框窗口(包含窗口的扩展分格)
// 2).进入模式处理
// 引用:
//
// ************************************************
static int DoBoxIndirectParamEx( HANDLE hInst,
LPDLG_TEMPLATE_EX lpTemplate,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM lParamInit,
HANDLE hCallerProcess )
{
HWND hWnd;
BOOL bEnable = FALSE;
int result = -1;
BOOL bVisible;
MSG msg;
//先清除在线程队列中的鼠标消息和键盘消息
//清除所有的鼠标消息
//ClearThreadQueue( 0, NULL, WM_MOUSEFIRST,WM_MOUSELAST );
while( PeekMessage( &msg, NULL, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE ) )
;
//清除所有的键盘消息
//ClearThreadQueue( 0, NULL, WM_KEYFIRST,WM_KEYLAST );
while( PeekMessage( &msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ) )
;
//创建并初始化窗口
hWnd = DoCreateDialogEx( hInst, lpTemplate, hWndParent, lpDialogFunc, lParamInit, &bVisible, hCallerProcess );
if( hWnd )
{ //处理模式
result = DoDialogModal( hWnd, hWndParent, lParamInit, bVisible );
DestroyWindow( hWnd );
}
return result;
}
// **************************************************
// 声明:int WINAPI Dlg_BoxIndirectParamEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpTemplate,
// HWND hWndParent,
// DLGPROC lpDialogFunc,
// LPARAM lParamInit
// )
// 参数:
// IN hInst - 实例句柄
// IN lpTemplate - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// IN lParamInit - 传递给 WM_INITDIALOG 消息的LPARAM参数
// 返回值:
// 假入成功,返回对话框返回的值;否则,返回 -1
// 功能描述:
// 1).带参数创建并初始化对话框窗口(包含窗口的扩展分格)
// 2).进入模式处理
// 引用:
// 系统API
// ************************************************
int WINAPI Dlg_BoxIndirectParamEx( HANDLE hInst, LPDLG_TEMPLATE_EX lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit )
{
return DoBoxIndirectParamEx( hInst, lpTemplate, hWndParent, lpDialogFunc, lParamInit, GetCallerProcess() );
}
// **************************************************
// 声明:int WINAPI Dlg_BoxIndirectEx(
// HINSTANCE hInst,
// LPCDLG_TEMPLATE_EX lpTemplate,
// HWND hWndParent,
// DLGPROC lpDialogFunc,
// )
// 参数:
// IN hInst - 实例句柄
// IN lpTemplate - 对话框模板扩展结构
// IN hParent - 对话框的父窗口
// IN lpDialogFunc - 对话框回调函数
// 返回值:
// 假入成功,返回对话框返回的值;否则,返回 -1
// 功能描述:
// 1).创建并初始化对话框窗口(包含窗口的扩展分格)
// 2).进入模式处理
// 引用:
// 系统API
// ************************************************
int WINAPI Dlg_BoxIndirectEx( HANDLE hInst, LPDLG_TEMPLATE_EX lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc )
{
return DoBoxIndirectParamEx( hInst, lpTemplate, hWndParent, lpDialogFunc, 0, GetCallerProcess() );
}
//ex-end
// **************************************************
// 声明:BOOL WINAPI Dlg_End( HWND hDlg, int nResult )
// 参数:
// IN hDlg - 对话框窗口句柄
// IN nResult - 传递给对话框的返回代码
// 返回值:
// 假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
// 结束对话框模式处理并设置对话框返回代码
// 引用:
// 系统API
// ************************************************
BOOL WINAPI Dlg_End( HWND hDlg, int nResult )
{
//设置返回代码
SetWindowLong( hDlg, DWL_MSGRESULT, nResult );
//设置返回标志
SetWindowLong( hDlg, DWL_STATE, 1 ); // set end flag
//这里,有可能对话框在 GetMessage 里等待而没有出来,
//给对话框发该消息,目的是让其从GetMessage 里出来处理退出过程
// get a no oprate message to notify dlg message loop to exit;
PostMessage( hDlg, WM_NULL, 0, 0 );
return TRUE;
}
// **************************************************
// 声明:int WINAPI Dlg_GetCtrlID( HWND hwndCtl )
// 参数:
// IN hwndCtl - 控件窗口句柄
// 返回值:
// 假入成功,返回控件ID;否则,返回0
// 功能描述:
// 得到控件/窗口ID
// 引用:
// 系统API
// ************************************************
int WINAPI Dlg_GetCtrlID( HWND hwndCtl )
{
return (int)GetWindowLong( hwndCtl, GWL_ID );
}
// **************************************************
// 声明:HWND WINAPI Dlg_GetItem( HWND hDlg, int nID )
// 参数:
// IN hDlg - 对话框窗口句柄
// IN nID - 子窗口ID
// 返回值:
// 假入成功,返回子窗口窗口句柄;否则,返回NULL
// 功能描述:
// 由控件ID得到对话框子窗口窗口句柄
// 引用:
// 系统API
// ************************************************
HWND WINAPI Dlg_GetItem( HWND hDlg, int nID )
{
HWND hWnd = GetWindow( hDlg, GW_CHILD ); //得到第一个子窗口
while( hWnd )
{
if( GetWindowLong( hWnd, GWL_ID ) == nID )
return hWnd;
//得到下一个子窗口
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -