2

背景色がユーザー入力の有効性に依存する編集コントロールがあります。

入力が有効な場合、編集コントロールはデフォルトの外観を維持する必要があります。そうでない場合、背景色は明るい灰色に変更されます。

ハンドラーで有効性をチェックしています。EN_UPDATE無効な場合はHWND、編集コントロールをに保存しvectorます。

ビジュアル スタイルが有効になっています。

問題は、マウス ポインターの位置を変更したときに発生します。それを説明しましょう:

  1. 編集コントロールをクリックして、無効な入力を入力します。

  2. マウス ポインターを別の場所に移動しましたが、編集コントロールにはまだフォーカスがあります。

  3. を押して無効な入力を削除しますbackspace

  4. 入力が有効になるとすぐに色が適切に変わりますが、境界線が太くなったり暗くなったりします。

これらの図は、問題を示しています。

データを入力する前にコントロールを編集します。 ここに画像の説明を入力

ユーザーが無効なデータを貼り付けたときの編集コントロール (マウス ポインターが灰色の領域にある): ここに画像の説明を入力

最後の文字はr.

マウス ポインターが編集コントロールのクライアント領域 (たとえば、ダイアログのクライアント領域) の外にあり、ユーザーがここを削除すると、次のようになります。rここに画像の説明を入力

太い境界線に注目してください。

マウス ポインタが編集コントロールの上に置かれると、適切に再描画されます。

関連するコード スニペットを次に示します (必要に応じて、小さなSSCCEを送信できます)。

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
    switch( LOWORD(wParam) )
    {
    case IDC_MYEDIT:
        {
            if( HIWORD(wParam) == EN_CHANGE )
            {
                if( /* invalid input */ )
                {
                    // store HWND into vector

                } 
                // InvalidateRect(...); // tried this too...
            }
        }
        break;

// minimal code snippet for WM_CTLCOLOREDIT
case WM_CTLCOLOREDIT:
    {
        if( /* this control is stored in vector */ )
        {
            //=== then this is invalid entry->paint it grey ===//

            // Needed SetBkMode for text's background transparency 
            SetBkMode( (HDC)wParam, TRANSPARENT ); 
            // return light gray brush 
            return (INT_PTR)( (HBRUSH)GetStockObject( LTGRAY_BRUSH ) );
        }
        else
            return DefWindowProc( ... );  // default processing
    }

どうすればこれを修正できますか?

4

2 に答える 2

0

私は自分の問題の解決策を見つけました。RedrawWindowフレームの代わりに追加しInvalidateRect て、フレームも再描画するように注文しました:

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
    switch( LOWORD(wParam) )
    {
    case IDC_MYEDIT:
        {
            if( HIWORD(wParam) == EN_CHANGE )
            {
                if( /* invalid input */ )
                {
                    // store HWND into vector

                }

                // after finishing validation, redraw window INCLUDING THE FRAME
                // This solves the problem with edges entirely

                RedrawWindow( (HWND)lParam, NULL, NULL,
                    RDW_ERASE | RDW_FRAME | RDW_INVALIDATE );
            }
        }
        break;
于 2014-05-08T06:37:38.823 に答える
-1

メッセージCTLCOLOR_MSGBOXの大文字小文字の扱いも試してください。詳細については、この MSDN の記事を参照してください。

MFC エディット コントロールの背景色を変更する方法

リンクにあるサンプルコードのスナップショット

  case CTLCOLOR_EDIT:
  case CTLCOLOR_MSGBOX:
      // Set color to green on black and return the background
         brush.
      pDC->SetTextColor(RGB(0, 255, 0));
      pDC->SetBkColor(RGB(0, 0, 0));
      return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
于 2014-04-30T04:19:41.377 に答える