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

<!--[if gte mso 10]> <mce:style><! /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} -->

<!--[endif]-->

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值