天天看點

深入淺出CChart 每日一課——快樂高四第四十二課 步步為營,SoUI探險第二關之普通子視窗

上節課說的是在SoUI裡使用彈出視窗繪圖,說實話這個方法太簡單,而且其實和SoUI也沒有什麼關系,哪裡都可以這樣用。

本節課呢,就講一下在SoUI的視窗裡面建一個子視窗來繪圖。

閑話少說,直接開始。

第一步到第三步,和上一課完全一樣,建立一個名為LessonA42的Soui工程。

第四步,打開MainDlg.cpp檔案。

在OnInitDialog函數裡,添加如下代碼。

CRect rect;
	rect = GetClientRect();
	m_hWndChart = CreateSubChartWnd(m_hWnd, kTypeXY, L"CChart", rect.left+10, rect.top+40, rect.right-rect.left-20, rect.bottom-rect.top-50);

	int len=10;
	for(int i=0; i<len; i++)
	{
		GetChart(m_hWndChart)->AddPoint2D(i, i*i/(double)len/len);
	}
	GetChart(m_hWndChart)->SetTitle(L"測試子視窗");
           

這裡和上一課不同,采用CreateSubChartWnd建立了一個m_hWnd的子視窗。實際上,這個視窗的視窗類名也是”ChartCtrl”。

在OnClose函數裡,添加和上一課完全一樣的代碼。

::DestroyWindow(m_hWndChart);
           

現在可以編譯了!編譯完成後,把Chartu.dll檔案拷貝到外層的Debug檔案夾裡,就可以運作了。

深入淺出CChart 每日一課——快樂高四第四十二課 步步為營,SoUI探險第二關之普通子視窗

咦!怎麼啥也沒有哇?

不要着急,下面是關鍵的一步。

第五步,打開dlg_main.xml檔案。

找到translucent="1" 這一行,修改為:

translucent="0"
           

這是為啥呢?黃大師告訴我說是使用了GDI函數,就會破壞Soui的alpha通道,這樣就必須把translucent設定為0。嗯嗯,CChart的繪圖操作全部是GDI,那莫法啰!

再運作試試,如圖。

深入淺出CChart 每日一課——快樂高四第四十二課 步步為營,SoUI探險第二關之普通子視窗

移動滑鼠,試試消息響應,一切正常。歐耶!

不過呢,謙虛是一個人的美德。不要高興得過早。拖拉視窗的邊框試試,發現CChart的圖像不動,不會跟着變。

對于熟悉VC的人來說,處理這個問題手到擒來。

第六步,打開MainDlg.cpp檔案,在OnSize函數的最後,添加如下語句。

CRect rect;
	rect = GetClientRect();
	::MoveWindow(m_hWndChart, rect.left+10, rect.top+40, rect.right-rect.left-20, rect.bottom-rect.top-50, TRUE);
           

再打開程式試試,這下一切正常了。

這樣是不是就很完美了?

No,No,No!

實際上,我們到現在為止,還沒有用到SoUI的布局功能,而SoUI最強大、最友善的功能恰恰就是控件的自動布局功能。

看看我們上面的代碼,rect.left+10,rect.top+40,這些都是寫死,要是界面的布局一變,就可能出問題。比如,如果标題欄的高度增加,那我們的圖像會覆寫一部分标題欄,這樣的話,這個視窗也太難看了吧!另外我們還得手動處理OnSize消息。嗯嗯,這不是我們想要的!

是以呢,我們現在還在SoUI的門外打探,根本還沒有跨進SoUI的大門。

從下一課開始,我們将進入到SoUI的核心。

繼續閱讀