溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

wxWidgets第十一課 自定義控件渲染

發(fā)布時(shí)間:2020-06-22 19:39:26 來(lái)源:網(wǎng)絡(luò) 閱讀:661 作者:fengyuzaitu 欄目:系統(tǒng)運(yùn)維

說(shuō)明

    實(shí)現(xiàn)自定義的窗口繪制


例子


#include "wx/event.h"

#include "wx/dcclient.h"


void OnPaint(wxPaintEvent& event);


EVT_PAINT(CFlightInstrumentPanel::OnPaint)


void CFlightInstrumentPanel::OnPaint( wxPaintEvent& event )

{

    wxClientDC dc(this);

    dc.SetBackground(*wxWHITE_BRUSH);//清除背景顏色

    dc.Clear();

    wxPen pen(*wxRED,1);

    dc.SetPen(pen);

    dc.DrawRectangle(0, 0, 200, 300);

    dc.SetPen(wxNullPen);

}


EVT_NC_PAINT說(shuō)明

    NC就是non client意思,非客戶區(qū)主要包括標(biāo)題欄,狀態(tài)欄,工具欄和邊框等區(qū)域,目前wxwidgets只是提供了EVT_NC_PAINT 唯一的一個(gè)非客戶區(qū)的事件,在MFC中,還有提供WM_NCLBUTTONDOWN WM_NCLBUTTONUP WM_NCMOUSEMOVE等事件操作,如果需要關(guān)聯(lián)這些事件,就必須要過(guò)濾該事件,或者在源碼中實(shí)現(xiàn)該類事件,目前可以通過(guò)覆蓋父類的MSWWindowProc函數(shù)實(shí)現(xiàn)。

    目前需要拖動(dòng)邊框的時(shí)候,客戶區(qū)域不變,只是邊框變大,等到邊框拖動(dòng)到合適的地方,鼠標(biāo)彈起,客戶區(qū)域重繪,這個(gè)時(shí)候在WM_NCLBUTTONUP消息中重繪界面是否會(huì)避免閃爍??!


注意1:對(duì)于無(wú)法精確渲染圖形,使用圖像代替

說(shuō)明

    例如渲染文本(翻轉(zhuǎn)。),實(shí)際上最后的符號(hào)應(yīng)該置頂,而不是最下面,但是制表符并沒(méi)有位于頂端的圓點(diǎn),這才是關(guān)鍵的問(wèn)題。使用DrawLabel或者DrawText都很難解決該問(wèn)題,如果引入圖片的話,就可以輕松的解決,該方法尤其是應(yīng)用在不規(guī)則的圖形渲染,減輕了不少的工作量


注意2:控件靠近窗口邊框閃爍問(wèn)題

當(dāng)控件放置在窗口邊框的附近,拖動(dòng)窗口的邊框進(jìn)行拉伸,非常明顯的看到控件的上半部接近邊框的地方,會(huì)發(fā)生閃爍,并且會(huì)看到圖像的錯(cuò)位,偶爾還會(huì)出現(xiàn)不和諧的色塊,這些現(xiàn)象僅僅出現(xiàn)在控件靠近邊框的位置上。當(dāng)邊框拉伸的時(shí)候,會(huì)重繪邊框,然后重新渲染控件,邊框是有一個(gè)寬度范圍,而不是一直線,因此靠近邊框的控件部分會(huì)首先被遮擋,重繪,然后控件重新刷新一遍,就看到閃爍的問(wèn)題。解決的方法就是講控件的位置稍微偏離邊框


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI