📄 dialog.c
字号:
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 + -