0

このコードは、「番号を入力してください」というテキストラベルとボタンが付いたウィンドウを表示します。

ボタンをクリックすると、テキストが「TEXT」に置き換えられます。動作しますが、最初のテキストの上に新しいテキストを書き込み/印刷します。だからその重複。

最初の文字列を上書きするのではなく、テキストの文字列を変更したいのですが、Windowsアプリケーション開発に慣れていないため、その方法がわかりません。

みんな助けてください。

全体のソースは次のとおりです。

#include <windows.h>
#include <iostream>


using namespace std;


enum { ID_LABEL = 1,ID_BUTTON0};

static  HWND static_label, button0;

HDC          hdc;
HBRUSH  NewBrush;
HINSTANCE g_hInst;


LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    LPCTSTR className = TEXT("myClass");
    WNDCLASSEX wc;

    wc.cbSize        = sizeof(wc);
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbWndExtra    = 0;
    wc.cbClsExtra    = 0;
    wc.lpfnWndProc   = WndProc;
    wc.hInstance     = hInstance;
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = TEXT("myClass");


    wc.hbrBackground  = (HBRUSH)(CreateSolidBrush(RGB(48, 38, 88)));

    wc.hIcon             = LoadIcon(NULL, IDI_APPLICATION);
    wc.hIconSm           = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor           = LoadCursor(NULL, IDC_ARROW);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, TEXT("ERROR! FAILED TO REGISTER CLASS!"), TEXT("FATAL ERROR!"), MB_IConerror | MB_OK);
        return 1;
    }

    HWND hwnd = CreateWindowEx(0, TEXT("myClass"), TEXT("WINDOW TITLE"), WS_OVERLAPPEDWINDOW, 450, 100, 500 + 7, 500 + 33 , NULL, NULL, hInstance, NULL);

    if(!hwnd)
    {
        MessageBox(NULL, TEXT("ERROR! FAILED TO CREATE WINDOW!"), TEXT("FATAL ERROR!"), MB_IConerror | MB_OK);

        return true;
    }  

    ShowWindow(hwnd, nShowCmd);                
    UpdateWindow(hwnd); 

    MSG msg;

    while(GetMessage(&msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}



LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_PAINT:
        {

        }

        case WM_CTLCOLORSTATIC:
        {
           SetBkMode((HDC) wParam, TRANSPARENT);        

           return (LONG) GetStockObject(NULL_BRUSH);
    }

    break;

    case WM_CREATE:
    {
        static_label = CreateWindow(L"Static",L"Please Enter A Number",WS_CHILD | WS_VISIBLE,35,15,175,25,hwnd,0, g_hInst,0);

        button0 = CreateWindow(L"Button",L"OK",BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE ,80,220,35,35,hwnd,(HMENU)ID_BUTTON0,g_hInst,0);   
      }

      break;

      case WM_COMMAND: //Command from Child windows and menus are under this message

      switch(wParam) //the ID is wParam
      {
         case ID_BUTTON0: //check for our button ID
         {
             SetWindowText(static_label,L"TEXT");

             break;
         }
      }//switch. 

  break;

  case WM_DESTROY: 
         PostQuitMessage(0);
         break; // pass to DefWindowProc(...) as well

      case WM_CLOSE:
         DestroyWindow(hwnd);
         break;
   } 

    return DefWindowProc(hwnd, msg, wParam, lParam);    
}
4

4 に答える 4

6

問題はここにあります:

case WM_CTLCOLORSTATIC:
{
   SetBkMode((HDC) wParam, TRANSPARENT);        
   return (LONG) GetStockObject(NULL_BRUSH);
}

このコードは、静的コントロールに、背景色なしでテキストを描画し、背景を再描画しないように指示します。したがって、新しいテキストは、新しい背景ではなく、古いテキストの上に描画されます。

透けて見えるカスタムの背景が必要な場合は、基になる親ウィンドウのその部分を無効にしWS_EX_TRANSPARENT、子の静的コントロールが最後に描画されるようにするなどの方法を使用する必要があります。そうすれば、新しいテキストを描画しようとするときまでに、新しい背景をペイントする必要があります。

これは、下にある親ウィンドウでは使用できないことを意味WS_CLIPCHILDRENし、再描画時にちらつきが増える可能性があることに注意してください。

于 2012-06-04T22:23:54.223 に答える
4

このコードを使用して、関数SetWindowTextの後にラベルを更新します。

SetWindowText(static_label,L"TEXT");         

ShowWindow(static_label, SW_HIDE);
ShowWindow(static_label, SW_SHOW);
于 2016-05-03T17:17:44.453 に答える
3

あなたのテキストは「静的」ウィンドウに表示されており、テキストが変更されることを期待していないため、適切に処理されません。コントロールを強制的に消去して再描画する必要があります。

RedrawWindow(static_label, NULL, NULL, RDW_ERASE);
于 2012-06-04T21:57:17.430 に答える
3

RedrawWindow(H_frame、NULL、NULL、RDW_INVALIDATE)は、WM_CTLCOLORSTATICによって引き起こされた変更を引き起こして、すぐに目に見える効果をもたらしたいときに機能しました。

以前、SendMessage(H_frame、WM_CTLCOLORSTATIC、0、(int)SpecificControlHandle)によって部分的な結果が得られましたが、呼び出された関数がGetWindowDCを実行して処理を行っていたため、部分的にしか機能しませんでした。

RedrawWindow(H_frame、NULL、NULL、RDW_INVALIDATE)メソッドの方がはるかに優れています。テキストのテキストと背景色(およびSetWindowLong(SpecificControlHandle、GWL_ID、SomeNewID)を使用したコントロールのID)を変更して、WM_CTLCOLORSTATICが送信された後にどのルートを取るかをプログラムに指示していました。 RedrawWindow(H_frame、NULL、NULL、RDW_INVALIDATE)、したがって私の投稿。STATICのIDを変更した後に機能する場合は、他の属性やスタイルなどを変更した後に機能するはずです。

于 2014-08-02T01:19:11.807 に答える