您的位置:首页 > 其它

Windows mobile应用程序自适应屏幕大小

2009-04-08 17:10 295 查看
Windows mobile平台下的应用程序经常要考虑到屏幕的大小。最常见的做法就是给不同屏幕大小定制不同的UI布局。但是这样的坏处也是显而易见。
另一个办法就是让程序根据屏幕的大小的变化来调整布局。这些代码是我从网上找到的,然后再做一些修改。先说头文件:
//CtrlAdapt.h
typedef struct{
int iId;      // 控件ID
int iFlag;    // 标志,表示怎样改变控件的位置或者大小
int iPercent; // 改变值占对话框改变值的百分比
RECT pos;
} CtrlInfo;

enum
{
MOVE_X = 0, // 控件在X方向(左右)移动
MOVE_Y,     // 控件在Y方向(上下)移动
MOVE_X_Y,   // 控件在X方向和Y方向同时移动
ELASTIC_X,  // 控件在X方向(宽度)改变大小
ELASTIC_Y,  // 控件在Y方向改(高度)改变大小
ELASTIC_X_Y, // 控件在X方向和Y方向同时改变大小
VECTOR_X, // 控件在X方向和Y方向同时改变大小
VECTOR_Y, // 控件在X方向和Y方向同时改变大小
VECTOR_X_Y // 控件在X方向和Y方向同时改变大小
};

void CtrlPosInit(HWND HMainWnd, RECT *rect, DlgCtrlInfo *pCtrlArray);
void CtrlAdapt( HWND HMainWnd, int iOriginWidth, int iOrignHeight, DlgCtrlInfo *pCtrlArray );


实现文件如下:
//CtrlAdapt.cpp
void CtrlPosInit (HWND HMainWnd, RECT *rect, DlgCtrlInfo *pCtrlArray)
{
GetWindowRect( HMainWnd, rect );

for ( ; pCtrlArray->iId; pCtrlArray++ )
{
HWND hWndCtrl = GetDlgItem( HMainWnd, pCtrlArray->iId );
GetWindowRect( hWndCtrl, &pCtrlArray->pos );
pCtrlArray->pos.left -= rect->left;
pCtrlArray->pos.right -= rect->left;
pCtrlArray->pos.top -= rect->top;
pCtrlArray->pos.bottom -= rect->top;
}
}

void CtrlAdapt( HWND HMainWnd, int iOriginWidth, int iOriginHeight, DlgCtrlInfo *pCtrlArray )
{
RECT rect;
GetWindowRect( HMainWnd, &rect );
int iNewWidth = rect.right - rect.left;
int iNewHeight = rect.bottom - rect.top;
int iIncrementX, iIncrementY;

iIncrementX = iNewWidth - iOriginWidth;
iIncrementY = iNewHeight - iOriginHeight;
for ( ; pCtrlArray->iId; pCtrlArray++ )
{
HWND hWndCtrl = GetDlgItem( HMainWnd, pCtrlArray->iId );
RECT CtrlRect;
GetWindowRect( hWndCtrl, &CtrlRect );
int iLeft = pCtrlArray->pos.left;
int iTop = pCtrlArray->pos.top;
int iRight = pCtrlArray->pos.right;
int iBottom = pCtrlArray->pos.bottom;
int iWidth = pCtrlArray->pos.right - pCtrlArray->pos.left;
int iHeight = pCtrlArray->pos.bottom - pCtrlArray->pos.top;

switch( pCtrlArray->iFlag )
{
case MOVE_X:
{
if ( iIncrementX > 0 )
iLeft += (iIncrementX * pCtrlArray->iPercent / 100);
break;
}
case MOVE_Y:
{
if ( iIncrementY > 0 )
iTop += (iIncrementY * pCtrlArray->iPercent / 100);
break;
}
case MOVE_X_Y:
{
if ( iIncrementX > 0 )
iLeft += (iIncrementX * pCtrlArray->iPercent / 100);
if ( iIncrementY > 0 )
iTop += (iIncrementY * pCtrlArray->iPercent / 100);
break;
}
case ELASTIC_X:
{
if ( iIncrementX > 0 )
iWidth += (iIncrementX * pCtrlArray->iPercent / 100);
break;
}
case ELASTIC_Y:
{
if ( iIncrementY > 0 )
iHeight += (iIncrementY * pCtrlArray->iPercent / 100);
break;
}
case ELASTIC_X_Y:
{
if ( iIncrementX > 0 )
iWidth += (iIncrementX * pCtrlArray->iPercent / 100);
if ( iIncrementY > 0 )
iHeight += (iIncrementY * pCtrlArray->iPercent / 100);
break;
}
case VECTOR_X:
{
iLeft = iNewWidth * iLeft / iOriginWidth * pCtrlArray->iPercent / 100;
iRight = iNewWidth * iRight / iOriginWidth * pCtrlArray->iPercent / 100;
iWidth = iRight - iLeft;
break;
}
case VECTOR_Y:
{
iTop = iNewHeight * iTop / iOriginHeight * pCtrlArray->iPercent / 100;
iBottom = iNewHeight * iBottom / iOriginHeight * pCtrlArray->iPercent / 100;
iHeight = iBottom - iTop;
break;
}
case VECTOR_X_Y:
{
iLeft = iNewWidth * iLeft / iOriginWidth * pCtrlArray->iPercent / 100;
iRight = iNewWidth * iRight / iOriginWidth * pCtrlArray->iPercent / 100;
iWidth = iRight - iLeft;

iTop = iNewHeight * iTop / iOriginHeight * pCtrlArray->iPercent / 100;
iBottom = iNewHeight * iBottom / iOriginHeight * pCtrlArray->iPercent / 100;
iHeight = iBottom - iTop;
break;
}
}
MoveWindow( hWndCtrl, iLeft, iTop, iWidth, iHeight, FALSE );
}
UpdateWindow( HMainWnd );
}


在应用程序里做如下处理:
static DlgCtrlInfo sSettingCtrlArray[] =
{

{ IDC_STATIC_DEFAULT_INPUT, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_STATIC_FONT_SIZE, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_STATIC_IMAGE, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_STATIC_BOX, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_STATIC_CHARSET, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_COMBO_DEFAULT_INPUT, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_COMBO_FONT_SIZE, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_COMBO_PICTURE, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_COMBO_CHARSET, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_CHECK_FUZZY_K_G, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_CHECK_FUZZY_F_H, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_CHECK_FUZZY_L_N, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_CHECK_FUZZY_Z_ZH, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ IDC_CHECK_FUZZY_EN_ENG, VECTOR_X, 100, { 0, 0, 0, 0 } },
{ 0, 0, 0, { 0, 0, 0, 0 } }
};

RECT s_SettingDlgOriginRect;

WindowNCtrlPosInit(hWnd, &s_SettingDlgOriginRect, sSettingCtrlArray);
ReMoveWindowNCtrl( hWnd, s_SettingDlgOriginRect.right-s_SettingDlgOriginRect.left, s_SettingDlgOriginRect.bottom-s_SettingDlgOriginRect.top, sSettingCtrlArray);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: