C 實現窗體控制項隨窗體大小改變 包括字型大小

2021-08-28 10:57:37 字數 2404 閱讀 4108

private float x;

private float y;

private void settag(control cons)

foreach (control con in cons.controls)

}private void setcontrols(float newx, float newy, control cons)

);float a = convert.tosingle(mytag[0]) * newx;

con.width = (int)a;

a=convert.tosingle(mytag[1]) * newy;

con.height = (int)(a);

a=convert.tosingle(mytag[2]) * newx;

con.left = (int)(a);

a=convert.tosingle(mytag[3]) * newy;

con.top = (int)(a);

single currentsize = convert.tosingle (mytag[4]) * math.min(newx,newy);

con .font =new font (con.font .name ,currentsize,con.font .style ,con.font .unit );

if(con.controls .count >0)}}

void form1_resize(object sender, eventargs e)

在form_load裡面新增:

this.resize += new eventhandler(form1_resize);

//x = this.width;

//y = this.height;

settag (this);

form1_resize(new object(),new eventargs());//x,y可在例項化時賦值,最後這句是新加的,在mdi時有用​

當控制項比較多時,每次改變窗體大小都會有明顯的閃爍​

為什麼會閃爍?

因為窗體控制項狀態轉換時,windows需要負責"擦除"其背景,重新繪製,在一台效能並不優良的終端上(很大可能程度上客戶端電腦都不是那麼強勁吧) ,這個過程不是一時半會就能完成的,尤其對於很多個子控制項的情況,因此就…​

查詢一些資料提到的解決方法有:​

1.雙緩衝​

setstyle(controlstyles.doublebuffer, true); ​

效果不是很明顯​

2.由於底層重繪每次會清除畫布,然後再全部重新繪製,這才是導致閃爍最主要的原因。於是過載訊息傳送函式操作,禁掉這條訊息。**如下:

protected override void wndproc(ref message m)

但是這樣效果依然不明顯​

繼續研究,看到網上有人寫過解決類似問題方法,其原理是參考listview控制項中的兩個函式

internal void beginupdateinternal()

this.updatecount = (short) (this.updatecount + 1);

}}​​

this.sendmessage(11, 0, 0)表示它給自身send了乙個code為11的windows訊息,

在windows訊息定義中可以看到 wm_setredraw = 0x0b (0x0b也就是11),這行**的意思是告訴windows對listview控制項停止重繪介面,直到顯式要求重新繪製為止.

internal bool endupdateinternal(bool invalidate)

this.updatecount = (short) (this.updatecount - 1);

if (this.updatecount == 0)

}return true;

}

同樣有一行**: this.sendmessage(11, –1, 0); 11還是同乙個意思,此時告知windows可以重繪listview控制項了​

按照這種思路​在resize函式中增加傳送訊息​

[dllimport("user32")]

private static extern int sendmessage(intptr hwnd, int wmsg, int wparam, intptr lparam);

private const int wm_setredraw = 0xb;​

private void form2_resize(object sender, eventargs e)

問題得到解決

**:

C 實現窗體控制項隨窗體大小改變 包括字型大小

private float x private float y private void settag control cons private void setcontrols float newx,float newy,control cons float a convert.tosingle ...

窗體控制項隨窗體大小改變 包括字型大小

是一篇vb編寫的,我只是把它翻譯成c 的.其實anchor和dock屬性也可以實現,但好象只對容器效果理想,而且字型大小也沒有變化.最近論壇上有好多這樣的貼子,具體實現 如下 private void settag control cons private void setcontrols floa...

wpf 控制項大小隨窗體大小改變而改變

wpf可以直接通過設定圖形類控制項的水平和垂直alighment為stretch實現 用乙個viewbox裝上所有的window內容然後當window縮放時就可以一起放大縮小了 viewbox的顯示機制是,先在記憶體中把按照邏輯大小把子控制項顯示出來,然後等比例的縮放顯示到viewbox的客戶區 例...