2016-04-01 22 views
0

これは私には好奇心です。STATICテキストのWM_SETTEXTは制御内容を更新しません。

私はこれを使用する場合:nextControlはSTATICコントロール(ラベル)です

Helpers.WinApi.SendMessage(nextControl, Helpers.WinApi.WM_SETTEXT, 0, "My String"); 

を、コントロールがすぐに更新されません。好奇心は、Altキーを押したときだけ、コントロールが変更されたテキストを表示することです。コントロールを強制的に更新すると、変更されたテキストが表示されません(たとえば、ウィンドウを最小化してから元に戻すなど)。

これは、STATICコントロールでのみ発生します。 EDITコントロールでは、それは起こりません。

どうすれば解決できますか?

私が集合した後、ラベルの幅を変更することで解決しているハイメ

答えて

0

。これは、テキストがラベルの幅よりも大きい場合は、カットされるため、必要でした。不幸なことに、静的コントロールが再描画され、WM_SETTEXTメッセージで設定されたテキストが表示されていました。

静的コントロールを拡大するためのコードは以下のとおりであった:STATICコントロールがSS_SIMPLEのスタイルを持っている場合は、この出来事の

     // Si es un label, debe agrandar el ancho para que se acomode a la cantidad de caracteres del control 
         System.Drawing.Size size = Helpers.WinApi.MeasureString(System.Drawing.Graphics.FromHwnd(hWnd).GetHdc(), formatted.ToString()); 
         Helpers.WinApi.RECT rect = new Helpers.WinApi.RECT(); 
         if (Helpers.WinApi.GetWindowRect(nextControl, out rect)) 
          Helpers.WinApi.MoveWindow(nextControl, rect.Left, rect.Top, rect.Right - rect.Left + size.Width, rect.Bottom - rect.Top, true); 
+0

UpdateWindow()を使用すると、強制的なウィンドウ再描画の同様の効果を得ることができます。 – bunglehead

+0

@bunglehead私はそうは思わない。全体のウィンドウが再描画されると(前景ウィンドウを最大化または変更するため)、UpdateWindowを自動的に呼び出す必要があります。私が質問したように、Altキーを押したときにのみコントロールがリフレッシュされます。好奇心。 – jstuardo

+0

私は静的コントロールウインドウ自体のUpdateWindow()を意味しますが、ダイアログ全体やこのスタティックな親のものではありません。私がControlSpyテストプログラムでこれを再現することができないという不思議な点は、バージョン5と6の両方が強制的なアップデートなしで直ちにアップデートされることです。 – bunglehead

0

一つの共通の原因です。たとえば、スタイルをSS_LEFTに変更すると、テキストの変更時に再描画が正しく行われます。 (たとえば、新しいテキストが古いテキストよりも短い場合、新しいテキストの右側に剰余文字は残されません)。

関連する問題