控制項布局通用解決方案

2021-06-15 01:46:05 字數 3064 閱讀 6415

你是否遇到過這樣的問題:用編譯器拖出一些控制項放到對話方塊上,並合理安排好了位置;但編譯執行,改變對話方塊的大小後,所有控制項的位置都亂了,讓人感覺非常糟糕。如果控制項不太多,你可以嘗試手寫**定位每個控制項的位置,但若是控制項數量以十或百為單位計數甚至更多,逐一為每個控制項指定位置就非常麻煩了。

本文提供乙個巨集,可以按照通常對話方塊的布局要求快速為每個控制項布局,對話方塊大小改變時,控制項的大小和位置都會隨之而改變。改變控制項位置和大小的**都在巨集內部,你只需了解巨集的作用即可達到所需布局。

注意,編寫巨集和測試環境為xp + vc++6.0sp6 + mfc,其他編譯環境可能需對巨集稍加修改,我相信你有這個實力。

// ctrlid           : 控制項id

// leftchangemode : 0:與視窗客戶區左邊的距離不變; 1:按比例變化; 2:保持控制項寬度不變;

// rightchangemode : 0:與視窗客戶區右邊的距離不變; 1:按比例變化; 2:保持控制項寬度不變;

// topchangemode : 0:與視窗客戶區上邊的距離不變; 1:按比例變化; 2:保持控制項高度不變;

// bottomchangemode : 0:與視窗客戶區下邊的距離不變; 1:按比例變化; 2:保持控制項高度不變;

#ifndef auto_set_control_pos

// leftchangemode取值巨集定義

#define left_change_mode_fixed_leftpadding 0

#define left_change_mode_ratio 1

#define left_change_mode_fixed_width 2

// rightchangemode取值巨集定義

#define right_change_mode_fixed_rightpadding 0

#define right_change_mode_ratio 1

#define right_change_mode_fixed_width 2

// topchangemode取值巨集定義

#define top_change_mode_fixed_toppadding 0

#define top_change_mode_ratio 1

#define top_change_mode_fixed_height 2

// bottomchangemode取值巨集定義

#define bottom_change_mode_fixed_lefepadding 0

#define bottom_change_mode_ratio 1

#define bottom_change_mode_fixed_height 2

#define auto_set_control_pos(ctrlid, leftchangemode, rightchangemode, topchangemode, bottomchangemode)\

\ if (nfirstctrlid == ctrlid)\

\ rectlastclientwindow.right = cx;\

rectlastclientwindow.bottom = cy;\

cwnd *pwnddlgitem = getdlgitem(ctrlid);\

if (pwnddlgitem)\

\ else if (0x0001 == nxchangemode)\

\ else if (0x0002 == nxchangemode)\

\ else if (0x0100 == nxchangemode)\

\ else if (0x0101 == nxchangemode)\

\ else if (0x0102 == nxchangemode)\

\ else if (0x0200 == nxchangemode)\

\ else if (0x0201 == nxchangemode)\

\ else if (0x0202 == nxchangemode)\

\ \

\ if (0x0000 == nychangemode)\

\ else if (0x0001 == nychangemode)\

\ else if (0x0002 == nychangemode)\

\ else if (0x0100 == nychangemode)\

\ else if (0x0101 == nychangemode)\

\ else if (0x0102 == nychangemode)\

\ else if (0x0200 == nychangemode)\

\ else if (0x0201 == nychangemode)\

\ else if (0x0202 == nychangemode)\

\ pwnddlgitem->movewindow(rectdlgitem);\

}\}#endif

使用時,只需在對話方塊的wm_size訊息處理函式中加上「auto_set_control_pos(ctrlid, leftchangemode, rightchangemode, topchangemode, bottomchangemode)」即可,各個引數含義見巨集定義的頭部注釋。對話方塊大小改變,就會自動修改指定控制項的位置和大小。

上圖是測試中mfc控制項初化的位置,下圖為修改控制項大小後的布局:

**中所作的處理如下:

每個控制項呼叫一次auto_set_control_pos,各個引數以巨集的形式提供,非常容易了解,比起手寫**非常清晰。當然,如果想重新設計各個控制項的布局,只需重新指定布局引數即可。

布局解決方案 居中布局

實現不定寬盒子的水平居中效果。解決方案 如下 注意 text align center 是對內聯元素起作用。會被子元素繼承。這個方法的優點是相容性好 雖然在ie6,ie7下面不支援display inline block這個屬性,但是可以用display inline zoom 1兩者的使用模仿di...

css布局解決方案

總結css布局 1 水平布局 1 display inline block text algin center a 原理 用法 原理 先將子框由塊級元素變為行內元素,再通過設定行內元素居中以到水平居中 用法 對子框設定display inline block,對父元素設定text algin cen...

CSS布局解決方案

使用inline block text align en parent child dome 複製 效果 3.使用absolute transform en parent child dome 複製 效果 4.使用flex margin en parent child dome 複製 效果 5.使用...