(上面的紅色半透明視窗被鎖在 y=100 x=200 的位置, 不能移動)
我們可以利用這項知識, 限制使用者移動視窗的範圍, 或者是用來實做當使用者的視窗移到靠近邊緣時, 自動黏上去的功能.
怎麼做?
關鍵就是 OnWindowPosChanging
程式碼
Step 1: 當視窗要開始移動前, 先通知我們的事件接收 method
BEGIN_MESSAGE_MAP(CMoveDlg, CDialog)
ON_WM_WINDOWPOSCHANGING()
END_MESSAGE_MAP()
Step 2: 這是我們的事件接收 method
void CMoveDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos) {
// 送座標出去之前, 我們先動手腳
WINDOWPOS* pos=(WINDOWPOS*)lpwndpos;
pos->y=100;
pos->x=200;
CDialog::OnWindowPosChanging(lpwndpos);
}
Step 3: 這是我們 method 的 prototype
afx_msg void OnWindowPosChanging(WINDOWPOS* lpwndpos);
完成.
Enjoy.
by Jing.
您好:
回覆刪除你的網頁提供了許多有趣的C語言技術,對小弟有很大的助益。但不知道能否請教幾個小問題,如果能夠撥空回覆的話就太感謝了。
問題是這樣的,我的主程式是個MDI介面,用CWND產生一個跑馬燈視窗,當主程式縮到最小時跑馬燈就會出現並播送一些訊息。但是現在有個問題是,若有其它程式視窗覆蓋在跑馬燈上面,同時跑馬指OnPaint()函式呼叫pDC->DrawText重繪時,就會畫在其它視窗上面。是否不能直接使用pDC->DrawText呢?有沒有什麼其它的方法?
MDI 方面我比較少碰, 所以沒有看懂您的問題.
回覆刪除1. 主視窗縮小, 其他相關的子視窗不是也會一起縮小嗎?
2. 我還不知道如何不用 Device Context 來顯示字的方法
3. 或許你可以偵測目前所有的存在的視窗, 是否在你的跑馬燈上方, 然後在 OnPaint 時做必要的處理.
不好意思, 目前我的知識不足以解決您的問題.
您好:
回覆刪除謝謝你的答覆,可能有些描述我沒有說的很清楚。其實這個問題和MDI沒有什麼關係啦,可以想成是一個主視窗main產生另一個浮動的CWnd視窗,類似一些續傳軟體的做法,當主視窗縮最小化時會跑出一個監控小視窗。
我的OnPaint也是用CPaintDC dc(this);取得裝置的CDC物件,然後呼叫一些dc->xxxxx之類的寫文字上去。不過我想這個可能不容易解決,只好繼續讓它保持在最上層好了。
另外可以再請教一點嗎?某些桌面便利貼軟體可以讓視窗背景色是半透明,但是前景文字是非透明的。自己也想試試看這樣子的顯示方式,於是我用SetLayeredWindowAttributes函式把視窗變成半透明樣式,但是前景文字也會跟著一起變半透明,不知道要用什麼方法解決?希望井先生能撥空解答我的疑問,感謝!!
其實這個我也想過, 只是我用很笨的方法
回覆刪除兩個視窗:
1. 一個顯示半透明背景
2. 另一個視窗的外框, 就是你要顯示字的形狀
然後兩個疊在一起.
很笨, 可是我想能 work.
相信一定有人有更漂亮的解決方法
您好:
回覆刪除再次謝謝囉。其實我也有想過把視窗的外框弄成文字的型狀,只是還是遭遇到一些問題。我原本想分成2步驟來做,第1步是:原本程式有裝置的dc,我另外建立了一個相容的dc2,在dc2畫完東西之後再BitBlt回dc,如果成功就能進行第2步,在dc2用HRGN的方式把文字的形狀剪下來,用SetWindowRgn設定dc的外框。但是我在第1步就失敗,dc仍然為空白,連字都沒有,所以第2步也就沒辦法試了。
如果你有遇過類似的狀況再看你有沒有解決方法,如果沒遇過也就不花你的時間了,我再自己研究看看就好了,謝謝