Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
332 views
in Technique[技术] by (71.8m points)

c++ - WINAPI, old value in backround after RedrawWindow()

I'm beginner in WINAPI and I would like to ask you about help. I have main window with about 10 child's windows (edit boxes). I need click into 1 of them and see label (text) in another static box. The problem is that text is changed, the old text from previous action is drawn in the backround as you can see... enter image description here

It is still overdrafted until the main window is redrawed... I think it is not efficient to redraw main window each text change... Does anyone have experiance with this problem? Could you help me? Thank you very much!

void vytvor_edit(HWND* h_edit,unsigned short ID)
{
    *h_edit = CreateWindowEx(WS_EX_CLIENTEDGE,
        WC_EDIT,
        NULL,
        WS_CHILD | WS_VISIBLE | ES_LEFT | ((ID_MINDISP != ID)?ES_NUMBER:0),
        0, 0, 200, 25,
        h_hlavni,
        (HMENU)ID,
        GetModuleHandle(NULL),
        NULL);
    if (*h_edit == NULL)
        FatalAppExit(0, L"nepovedlo se vytvorit ovladani");
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(*h_edit, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
    oldProc = (WNDPROC)SetWindowLongPtr(*h_edit,
        GWLP_WNDPROC, (LONG_PTR)WindowProcEdit);
}

void vytvor_combo(HWND* h_combo,unsigned short ID)
{
    *h_combo = CreateWindowEx(WS_EX_CLIENTEDGE,
        WC_COMBOBOX,
        NULL,
        WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS,
        0, 0, 200, 250,
        h_hlavni,
        (HMENU)ID,
        GetModuleHandle(NULL),
        NULL);
    if (*h_combo == NULL)
        FatalAppExit(0, L"nepovedlo se vytvorit ovladani");
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(*h_combo, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
    
    /*oldProc = (WNDPROC)SetWindowLongPtr(*h_edit,
        GWLP_WNDPROC, (LONG_PTR)WindowProcEdit);*/
}

void vytvor_button(HWND hwnd, HWND* h_button,const wchar_t* nazev,HMENU proces)
{
    *h_button = CreateWindowEx(WS_EX_CLIENTEDGE,
        WC_BUTTON,
        nazev,
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        0, 0, 200, 50,
        hwnd,
        proces,
        GetModuleHandle(NULL),
        NULL);
    if (*h_button == NULL)
        FatalAppExit(0, L"nepovedlo se vytvorit ovladani");
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(*h_button, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);

    /*oldProc = (WNDPROC)SetWindowLongPtr(*h_edit,
        GWLP_WNDPROC, (LONG_PTR)WindowProcEdit);*/
}

void vytvor_button_kalibrace(HWND hwnd, HWND* h_button, HMENU proces)
{
    *h_button = CreateWindowEx(WS_EX_CLIENTEDGE,
        WC_BUTTON,
        NULL,
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | BS_OWNERDRAW,
        0, 0, 200, 200,
        hwnd,
        proces,
        GetModuleHandle(NULL),
        NULL);
    if (*h_button == NULL)
        FatalAppExit(0, L"nepovedlo se vytvorit ovladani");
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(*h_button, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);

}

void vytvor_static(HWND* h_edit, unsigned short ID)
{
    *h_edit = CreateWindowEx(WS_EX_CLIENTEDGE,
        WC_STATIC,
        L"Info text",
        WS_CHILD | WS_VISIBLE | SS_SIMPLE,
        0, 0, 200, 25,
        h_hlavni,
        (HMENU)ID,
        GetModuleHandle(NULL),
        NULL);
    if (*h_edit == NULL)
        FatalAppExit(0, L"nepovedlo se vytvorit ovladani");
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
    SendMessage(*h_edit, WM_SETFONT, (WPARAM)hFont, (LPARAM)TRUE);
}

wm_paint

void wm_paint(HWND hwnd) noexcept
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    Gdiplus::Graphics* g = new Gdiplus::Graphics(hdc);
    RECT rect;
    GetClientRect(hwnd, &rect);
    
    g->DrawImage(pBitMapL, rect.right/12, 2, rect.right / 3 , rect.bottom - vyska_ovladani);
    g->DrawImage(pBitMapR, (rect.right*7)/12, 2, rect.right / 3, rect.bottom - vyska_ovladani); 
    if (pBitDisp != NULL)
    g->DrawImage(pBitDisp, rect.right / 2, rect.bottom - vyska_ovladani+4, rect.right / 2 - 4, vyska_ovladani-10);
    
    g->DrawImage(pBitDisp, rect.right / 2, rect.bottom - vyska_ovladani + 4, rect.right / 2 - 4, vyska_ovladani - 10);
    
    EndPaint(hwnd, &ps);
    delete g;
}

and the rest

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEXW wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_DISPARITYLADIC));
    wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_DISPARITYLADIC);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

    return RegisterClassExW(&wcex);
}

//
//   FUNKCE: InitInstance(HINSTANCE, int)
//
//   ú?EL: Ulo?í popisova? instance a vytvo?í hlavní okno.
//
//   KOMENTá?E:
//
//        V této funkci ulo?íme popisova? instance do globální proměnné
//        a vytvo?íme a zobrazíme hlavní okno programu.
//




BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Ulo?í popisova? instance do na?í globální proměnné.

   h_hlavni = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);


   if (!h_hlavni)
   {
      return FALSE;
   }

   vytvorit_ovladani();

   ShowWindow(h_hlavni, SW_MAXIMIZE);
 
  
   UpdateWindow(h_hlavni);

   return TRUE;
}

//
//  FUNKCE: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  ú?EL: Zpracuje zprávy pro hlavní okno.
//
//  WM_COMMAND  - zpracování aplika?ní nabídky
//  WM_PAINT    - Vykreslení hlavního okna
//  WM_DESTROY  - vystavení zprávy o ukon?ení a návrat
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
    switch (message)
    {
    case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Analyzovat vybrané mo?nosti nabídky:
            switch (wmId)
            {
            case IDM_ABOUT:
                DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                break;
            case IDM_EXIT:
                SendMessage(hWnd, WM_CLOSE, 0, 0);
                break;
            case ID_SPOCITEJ:
            {
                SendMessage(hWnd, WM_PAINT, 0, 0);
                HANDLE h = (HANDLE)_beginthreadex(NULL, 0, vlakno_zpracovani, 0, NULL, NULL);
                CloseHandle(h);
            }
            break;
            case ID_NACTIKALIBRACI:
                nacti_kalibraci();
                break;

            default:
                return DefWindowProc(hWnd, message, wParam, lParam);
            }
        }
        break;
    case WM_PAINT:
        {
            wm_paint(hWnd);         
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_SIZE:
        posun_ovladani(hWnd);
        break;
    case WM_DRAWITEM:
        on_drawitem((DRAWITEMSTRUCT*)lParam);
        break;
    case WM_CLOSE:
        if (MessageBox(hWnd, L"probiha vypocet...chcete ukoncit?", L"Upozorneni", MB_YESNOCANCEL | MB_ICONQUESTION) == IDYES)
            return DefWindowProc(hWnd, message, wParam, lParam);
        else
            return 0;
        break;

    default:
        return DefWindowProc(hWnd, message, wParam, lParam);    }
    return 0;
}


LRESULT CALLBACK WindowProcEdit(HWND hWnd, UINT uMsg,
    WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_GETDLGCODE:
        return DLGC_WANTALLKEYS;
    
    case WM_SETFOCUS:
        unsigned int id =(unsigned int) GetMenu(hWnd);
        switch (id)
        {
        case ID_BLOCKSIZE:
        
            RECT rec;
            GetClientRect(h_static_infotext, &rec);
            BOOL ano;
            SetWindowText(h_static_infotext, L"BLOCK SIZE");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE );
        
        
            break;
        case ID_DISPMAXDIFF:
            SetWindowText(h_static_infotext, L"DISPARITY ROZDIL");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_FILTERCAP:
            SetWindowText(h_static_infotext, L"FILTER CAP");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_MINDISP:
            SetWindowText(h_static_infotext, L"MIN DISPARITY");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_MODE:
            SetWindowText(h_static_infotext, L"MODE");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_NUMDISP:
            SetWindowText(h_static_infotext, L"HODNOTA DISPARITY");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_P1:
            SetWindowText(h_static_infotext, L"HODNOTA P1");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_P2:
            SetWindowText(h_static_infotext, L"HODNOTA P2");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_SPECKLERANGE:
            SetWindowText(h_static_infotext, L"SPECKLE ROZSAH");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_SPECKLESIZE:
            SetWindowText(h_static_infotext, L"SPECKLE VELIKOST");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        case ID_UNIQRATIO:
            SetWindowText(h_static_infotext, L"UNIQ RATIO");
            RedrawWindow(h_static_infotext, 0, 0, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE);
            break;
        default:
            break;
        }
        
        break;
    }
    return CallWindowProc(oldProc, hWnd, uMsg, wParam, lParam);
}

// Obslu?ná rutina zprávy pro pole O produktu
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    switch (message)
    {
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;

    case WM_COMMAND:
        if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        {
            EndDialog(hDlg, LOWORD(wParam));
            return (INT_PTR)TRUE;
        }
        break;
    }
    return (INT_PTR)FALSE;
}


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

The problem is that Microsoft never anticipated the text in a static control changing, so they didn't implement a proper WM_ERASE to erase the static background. You can subclass the control and do it yourself, or you can draw over the static control a rectangle of the background color before changing the text.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...