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的客戶區 例...