2013-02-01 38 views
0

我有一個很奇怪的問題。我在Win7平臺上使用D2007。windows的哪個外部函數啓動一個WM_SIZE?

我的應用程序在第一臺Win7機器(我的)上運行良好,但UI在第二個Win7系統(三星平板電腦)上沒有正確刷新它。

我在平板電腦上使用遠程調試。經過長時間的評估和調試後,我發現WM_SIZE沒有出現在我的其中一個框架中。每個框架包含在她的父母和Align = alClient

在我的機器上,此消息發送得很好,當然,UI具有正確的行爲。

Windows單元的哪個外部函數發送WM_Size消息代碼?


我會用更多的細節來解釋問題。

當應用程序被最大化或調整大小時,我看到兩臺Win7機器之間的UI刷新行爲不同。

一些框架正確調整大小,但其中一個不是。結構如下:

MainForm - >某些框架 - > PageControl - > TabSheet - > Frame1 - > Frame2。

需要注意的是:

  • 我的UI正確運行在大多數計算機。

  • 我使用標準的Windows機制

在這種結構中,所有的幀直到標籤頁包括被調整,但幀1不是。幀在運行時創建。

因爲我知道TabSheet的名稱,所以我可以在斷點處停下並查看WMSize。

我在TWinControl.AlignControls中使用了一些條件性的斷點並捕獲了Frame1的句柄。

Classes.StdWndProc上有一個斷點,我可以按照發送給Frame1.Handle的消息。

當一切都OK:

  • $ 0046:WM_WINDOWPOSCHANGING

  • $ 0083:WM_NCCALCSIZE

  • $ 0085:WM_NCPAINT

  • $ 0014:WM_ERASEBKGND

  • $ 0047:E WM_WINDOWPOSCHANGED

  • $ 0005:WM_SIZE

而當調整大小失敗:

  • $ 0046:WM_WINDOWPOSCHANGING

  • $ 0085:WM_NCPAINT

  • $ 0014: WM_ERASEBKGND

  • $ 0047:E WM_WINDOWPOSCHANGED

因爲,該代碼是相同的,操作系統是Win7的在這兩種情況下,我不明白的問題。 我只知道在第二種情況下絕不會發送兩條消息WM_NCCALCSIZEWM_SIZE

這就是爲什麼我尋找返回WM_SIZE響應的函數。

+3

WM_SIZE消息由系統窗口管理器發送。這是你的問題的答案,但很難看出它會如何幫助你。我想你提出了錯誤的問題。 –

+0

我注意到有時候有相同的行爲;我的哈克解決方案是在顯示後1秒內最大化我的窗口。你可以使用一個計時器。這個問題並沒有太深入。黑客行得通,對我很好。 –

+0

請看一下主題和窗口縮放(%75,%100,%125)。我有類似的問題,在我改變了主題(與我的相同)後,我的應用程序的比例因子達到了100%的要求。 –

回答

0

WM_SIZE在更改大小後發送到窗口。這意味着系統會在更改大小後自動將WM_SIZE發送到您的幀。要更新你的框架,我建議調用此一: + UpdateWindow API + YourFrame.Invalidate 或 YourFrame.Repaint

0

我給你我的反應,我不能張貼週五。我後來發現這個問題似乎來自於Win7/VCL D2007的一個bug。我嘗試用DXE3編譯的exe文件解決問題。

相關問題