⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialog.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
//	带参数创建并初始化对话框窗口,并进入模式处理过程
// 引用: 
//	系统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 + -