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

📄 dialog.c

📁 深圳市微逻辑电子有限公司 巨果&#8226 Kingmos&reg 系统核心
💻 C
📖 第 1 页 / 共 3 页
字号:
        hWnd = GetWindow( hWnd, GW_HWNDNEXT );
    }
    return hWnd;
}

// **************************************************
// 声明:UINT WINAPI Dlg_GetItemText( HWND hDlg, int nID, LPSTR lpstr, int nMaxCount )
// 参数:
// 	IN hDlg - 对话框窗口句柄
//	IN nID - 子窗口ID
//	IN/OUT lpstr - 用于接受文本的缓存
//	IN nMaxCount - lpstr缓存的大小
// 返回值:
//	假如成功,返回拷贝到lpstr里的字符数(不含0结束符);否则,返回0
// 功能描述:
//	得到对话框控件文本
// 引用: 
//	系统API
// ************************************************

UINT WINAPI Dlg_GetItemText( HWND hDlg, int nID, LPSTR lpstr, int nMaxCount )
{
    HWND hWnd = Dlg_GetItem( hDlg, nID );
    if( hWnd )
        return (UINT)SendMessage( hWnd, WM_GETTEXT, (WPARAM)nMaxCount, (LPARAM)lpstr );
    else
        return 0;
}

// **************************************************
// 声明:LONG WINAPI Dlg_SendItemMessage( HWND hDlg, int nID, UINT msg, WPARAM wParam, LPARAM lParam )
// 参数:
// 	IN hDlg - 对话框句柄
//	IN nID  - 子窗口ID
//	IN msg - 需要发送的消息
//	IN wParam - WPARAM 消息参数
//	IN lParam - LPARAM 消息参数
// 返回值:
//	假入成功,返回该消息对应的返回值;否则,返回0
// 功能描述:
//	向对话框控件发送消息
// 引用: 
//	系统API
// ************************************************

LONG WINAPI Dlg_SendItemMessage( HWND hDlg, int nID, UINT msg, WPARAM wParam, LPARAM lParam )
{
    HWND hWnd = Dlg_GetItem( hDlg, nID );
    _ASSERT( hWnd );
    if( hWnd )
        return SendMessage( hWnd, msg, wParam, lParam );
    else
        return 0;
}

// **************************************************
// 声明:BOOL WINAPI Dlg_SetItemText( HWND hDlg, int nID, LPCTSTR lpstr )
// 参数:
// 	IN hDlg - 对话框窗口句柄
//	IN nID - 子窗口/控件ID
//	IN lpstr - 需要设置的子窗口/控件的文本
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	设置子窗口/控件的仓库文本
// 引用: 
//	系统API
// ************************************************

BOOL WINAPI Dlg_SetItemText( HWND hDlg, int nID, LPCTSTR lpstr )
{
    HWND hWnd = Dlg_GetItem( hDlg, nID );
    if( hWnd )
        return (BOOL)SendMessage( hWnd, WM_SETTEXT, 0, (LPARAM)lpstr );
    return FALSE;
}

// **************************************************
// 声明:BOOL WINAPI Dlg_SetItemInt( HWND hDlg, int nID, UINT uValue, BOOL bSigned )
// 参数:
// 	IN hDlg - 对话框窗口句柄
//	IN nID - 子窗口/控件ID
//	IN uValue - 数字值
//	IN bSigned - 说明nValue是代符号(为TRUE)或是不带符号的(为FALSE)
// 返回值:
//	假入成功,返回TRUE;否则,返回FALSE
// 功能描述:
//	将值 uValue 转化为字符串文本
//	将字符串文本设置为子窗口/控件ID的窗口文本
// 引用: 
//	系统API
// ************************************************

BOOL WINAPI Dlg_SetItemInt( HWND hDlg, int nID, UINT uValue, BOOL bSigned )
{
	HWND	hCtl;
	TCHAR	pszTmp[20];

	hCtl = Dlg_GetItem( hDlg, nID );
	if( hCtl )
	{	//有效的 窗口
		//将值 uValue 转化为字符串文本
		if( bSigned )
			sprintf( pszTmp, TEXT("%d"), uValue );
		else
			sprintf( pszTmp, TEXT("%u"), uValue );
		//设置窗口文本
		return SetWindowText( hCtl, pszTmp );
	}
	return FALSE;
}

// **************************************************
// 声明:UINT WINAPI Dlg_GetItemInt( HWND hDlg, int nID, BOOL *lpTranslated, BOOL bSigned )
// 参数:
// 	IN hDlg - 对话框窗口句柄
//	IN nID - 子窗口/控件ID
//	OUT lpTranslated - 用于接受是否转换成功
//	IN bSigned - 说明返回值是代符号(为TRUE)或是不带符号的(为FALSE)
// 返回值:
//	假入成功,lpTranslated的值为TRUE;否则,lpTranslated的值为FALSE
// 功能描述:
//	得到子窗口/控件的窗口文本
//	将得到的窗口文本转化为数字值
// 引用: 
//	系统API
// ************************************************

UINT WINAPI Dlg_GetItemInt( HWND hDlg, int nID, BOOL *lpTranslated, BOOL bSigned )
{
	TCHAR	pszNum[20];
	HWND	hCtl;
	UINT uiRetv = 0;

	if( lpTranslated )
		*lpTranslated =FALSE;
	hCtl = Dlg_GetItem( hDlg, nID );
	//有效窗口 ?
	if( hCtl )
	{	//有效,得到其长度
		UINT len = SendMessage( hCtl, WM_GETTEXTLENGTH, 0, 0 );
		if( len <= 19 )
		{	//快速方法
			SendMessage( hCtl, WM_GETTEXT, 20, (LPARAM)pszNum );
			if( bSigned )
			    uiRetv = (UINT)atoi( pszNum );	//带符号
			else
				uiRetv = (UINT)strtoul( pszNum, NULL, 10 );	//不带符号
	        if( lpTranslated )
		       *lpTranslated = TRUE;
		}
		else
		{	//慢速方法,先分配要求大小的指针
			TCHAR * p = malloc( (len + 1)* sizeof(TCHAR) );
			if( p )
			{	//得到文本
				SendMessage( hCtl, WM_GETTEXT, (len + 1)* sizeof(TCHAR), (LPARAM)p );
				if( bSigned )
					uiRetv = (UINT)atoi( p );
				else
					uiRetv = (UINT)strtoul( p, NULL, 10 );				
				free( p );
	            if( lpTranslated )
		           *lpTranslated = TRUE;
			}
		}
	}
	return uiRetv;
}

// **************************************************
// 声明:static BOOL _EnableModal( HWND hWnd )
// 参数:
// 	IN hWnd - 窗口句柄
// 返回值:
//	假入继续模式处理,返回TRUE;否则,返回FALSE
// 功能描述:
//	判断对话快框窗口是否需要继续进行模式处理
// 引用: 
//	
// ************************************************

static BOOL _EnableModal( HWND hWnd )
{   
	return ( IsWindow( hWnd ) && !GetWindowLong( hWnd, DWL_STATE ) );
}

// **************************************************
// 声明:static int _RunModalLoop( HWND hWnd )
// 参数:
// 	IN hWnd - 窗口句柄
// 返回值:
//	假入成功,返回模式处理返回值;否则,返回0
// 功能描述:
//	处理模式对话框过程
// 引用: 
//	
// ************************************************

#define DEBUG_MODAL_LOOP 0
static int _RunModalLoop( HWND hWnd )
{
    DWORD dwStyle = GetWindowLong( hWnd, GWL_STYLE );
    BOOL bIdle = (BOOL)!(dwStyle & DS_NOIDLEMSG);
    MSG msg;
    BOOL bContinue = TRUE;
    HWND hWndParent = GetParent( hWnd );
    ULONG ulIdleCount = 0;

    DEBUGMSG( DEBUG_MODAL_LOOP, ( "_RunModalLoop: entry.\r\n" ) );
	SetCapture( NULL );
	//循环处理消息直到退出
	while( bContinue )
    {	//得到当前模式状态
        bContinue = _EnableModal( hWnd );// enable continue modal loop
		//判断是否有消息
        while( bContinue && bIdle && !PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) )
        {	//没有消息,是否需要发送 IDLE 消息 ?
            if( !(dwStyle & DS_NOIDLEMSG) && hWndParent && ulIdleCount == 0 )
            {	//是
                SendMessage( hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)hWnd );
            }
            bIdle = SendMessage( hWnd, WM_KICKIDLE, MSGF_DIALOGBOX, ulIdleCount++ );
			bContinue = _EnableModal( hWnd );
        }
		//
        while( bContinue )
        {	//判断是否有消息
            if( GetMessage( &msg, 0, 0, 0 ) )
            {	//有
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
            else
            {	//异常退出
                ASSERT( 0 );
                PostQuitMessage(0);
                return -1;
            }
			//处理完消息,检查是否有更多的消息 或是否退出模式处理
            bContinue = _EnableModal( hWnd );
			if( bContinue && PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) )
				continue;
			else
				break;
        };

        if( !(dwStyle & DS_NOIDLEMSG) )
        {
            bIdle = TRUE;
            ulIdleCount = 0;
        }
    }
	DEBUGMSG( DEBUG_MODAL_LOOP, ( "_RunModalLoop: leave.\r\n" ) );
	return (int)GetWindowLong( hWnd, DWL_MSGRESULT );
}

// **************************************************
// 声明:static HWND _PreModal( HWND hWndParent )
// 参数:
// 	IN hWndParent - 窗口句柄
// 返回值:
//	返回前一个模式窗口
// 功能描述:
//	得到前一个模式窗口
// 引用: 
//	
// ************************************************

static HWND _PreModal( HWND hWndParent )
{
    HWND hWnd = hWndParent;
    while( hWnd && ( GetWindowLong( hWnd, GWL_STYLE ) & WS_CHILD ) )
        hWnd = GetParent( hWnd );
    return hWnd;
}

// **************************************************
// 声明:static HWND FindFocusWindow( HWND hWndDialog )
// 参数:
// 	IN hWndDialog - 窗口句柄
// 返回值:
//	假入成功,返回需要设置焦点的窗口句柄;否则,返回NULL
// 功能描述:
//	发现需要设置焦点的窗口句柄
// 引用: 
//	
// ************************************************

static HWND FindFocusWindow( HWND hWndDialog )
{
	HWND hChild = GetWindow( hWndDialog, GW_CHILD );

	while( hChild )
	{
		DWORD dwStyle = GetWindowLong( hChild, GWL_STYLE );
        if( (dwStyle & WS_VISIBLE) && 
			(dwStyle & WS_DISABLED ) == 0 &&
			(dwStyle & WS_TABSTOP ) )
			break;
		hChild = GetWindow( hChild, GW_HWNDNEXT );		
	}
	return hChild;
}

// **************************************************
// 声明:static LRESULT DoActive( HWND hWnd, WPARAM wParam )
// 参数:
// 	IN hWnd - 窗口句柄
//	IN wParam - WM_ACTIVATE 消息的 WPARAM 参数
// 返回值:
//	返回0
// 功能描述:
//	处理 WM_ACTIVATE 消息
// 引用: 
//	
// ************************************************

static LRESULT DoActive( HWND hWnd, WPARAM wParam )
{
	if( LOWORD( wParam ) == WA_INACTIVE )
	{	//需要使窗口为非活动状态
		HWND hFocus = GetFocus();
		
		if( hFocus && GetParent( hFocus ) == hWnd )
			SetWindowLong( hWnd, DWL_CURCTL, (LONG)hFocus );
		else
			SetWindowLong( hWnd, DWL_CURCTL, NULL );
	}
	else if( LOWORD( wParam ) == WA_ACTIVE )
	{	//需要使窗口为活动状态
		HWND hFocus = (HWND)GetWindowLong( hWnd, DWL_CURCTL );
		
		if( hFocus == NULL )
			hFocus = FindFocusWindow( hWnd );	//预设一个

		if( hFocus )
			SetFocus( hFocus );
	}
	return 0;
}

// **************************************************
// 声明:LRESULT WINAPI DialogWndProc(
//									HWND hWnd,
//									UINT msg,
//									WPARAM wParam,
//									LPARAM lParam)
// 参数:
//  IN hWnd - 窗口句柄
//	IN msg - 消息
//	IN wParam - 第一个消息
//	IN lParam - 第二个消息
// 返回值:
//	依赖于具体的消息
// 功能描述:
//	对话框窗口处理总入口
// 引用: 
//	
// ************************************************


LRESULT CALLBACK DialogWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    LPCREATESTRUCT lpcs;
    DLGPROC lpDialogFunc=0;
    BOOL retv = TRUE;

    lpDialogFunc = (DLGPROC)GetWindowLong( hWnd, DWL_DLGPROC );
    if( lpDialogFunc )
    {	//让用户处理函数先处理
/*
		_LPWINDATA lpws = _GetHWNDPtr( hWnd );
		if( lpws )
		{
			if( lpws->hinst != hgwmeInstance )
			{	//跨进程
				CALLBACKDATA cd;
				cd.hProcess = lpws->hOwnerProcess;
				cd.lpfn = (FARPROC)lpDialogFunc;
				cd.dwArg0 = (DWORD)hWnd;
				retv = Sys_ImplementCallBack4( &cd, msg, wParam, lParam );
			}
			else
				retv = lpDialogFunc( hWnd, msg, wParam, lParam );
		}
		else
			return 0;
		*/
		retv = lpDialogFunc( hWnd, msg, wParam, lParam );
		
		if( IsWindow( hWnd ) )
		{
			if( retv && ( msg != WM_INITDIALOG ) )
			{
				return GetWindowLong( hWnd, DWL_MSGRESULT );	//用户已处理, 不需要做更多的处理
			}
		}
		else
		{	//无效的窗口
			return 0;
		}

    }
	//对话框默认处理
    switch( msg )
    {
    case WM_COMMAND:
       if( HIWORD( wParam ) == BN_CLICKED &&
           ( LOWORD( wParam ) == IDOK || LOWORD( wParam ) == IDCANCEL ) )
           Dlg_End( hWnd, LOWORD( wParam ) );
       break;
	case WM_ERASEBKGND:		//擦出背景
		{
			RECT rcClient;

			GetClientRect( hWnd, &rcClient );
			FillRect( (HDC)wParam, &rcClient, GetSysColorBrush(COLOR_3DFACE) );
			return 0;
		}
	case WM_ACTIVATE:		//窗口激活
		return DoActive( hWnd, wParam );
    case WM_CLOSE:			//窗口关闭
        Dlg_End( hWnd, 0 );
        break;
    case WM_CREATE:
        lpcs = (LPCREATESTRUCT)lParam;
        SetWindowLong( hWnd, DWL_DLGPROC, (DWORD)lpcs->lpCreateParams );
        SetWindowLong( hWnd, DWL_MSGRESULT, 0 );
		SetWindowLong( hWnd, DWL_STATE, 0 );
		SetWindowLong( hWnd, DWL_CURCTL, 0 );        
        break;
    case WM_INITDIALOG:
        if( retv == TRUE )
        {    // set focus control
            if( wParam )
                SetFocus( (HWND)wParam );			
        }
		SetWindowLong( hWnd, DWL_MSGRESULT, 0 );
        break;
    default:
        return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -