C++ текст в окне не обновляется

240
17 сентября 2017, 01:08

Добрый день. У меня есть окно со списком и текстовое поле. Хочу что бы при клике на элемент списка, в текстовом поле появлялся аналогичный элементу списка текст. Все вроде бы отрабатывает, но текст в текстовом поле сразу не меняется. Сколько ни кликай по элементам в текстовом поле старая надпись. Однако, как только окно становиться неактивным, текстовое поле обновляется и все становиться ок. Пробовал добавлять UpdateWindow(hStatic) и иже с ними, но они отрабатывают так же после того, как окно станет не активным.

#include <windows.h>
#include <string>
#include <string>       
#include <sstream> 
#include <iostream>
#define ID_LIST 3000
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
    static HWND hStatic,hListBox;
    HINSTANCE hInstance;
    int wmId, wmEvent;
    int ultem;
    char Buf[80];
    char szTitle[]="текст";
    switch(Message) {
        case WM_CREATE:{
            hListBox=CreateWindow("listbox",NULL,WS_CHILD|WS_VISIBLE|LBS_WANTKEYBOARDINPUT|WS_VSCROLL,30,30,100,30,hwnd,(HMENU)ID_LIST,hInstance,NULL);
            SendMessage(hListBox, WM_SETREDRAW, FALSE, 0L);
            SendMessage(hListBox, LB_ADDSTRING, 0,(LPARAM)(LPSTR)"Первый");
            SendMessage(hListBox, LB_ADDSTRING, 0,(LPARAM)(LPSTR)"Второй");
            SendMessage(hListBox, LB_ADDSTRING, 0,(LPARAM)(LPSTR)"Третий");
            SendMessage(hListBox, WM_SETREDRAW, TRUE, 0L);
            InvalidateRect(hListBox, NULL, TRUE);
            hStatic=CreateWindow("static","текст",WS_CHILD|WS_VISIBLE,100,200,100,100,hwnd,(HMENU)0,hInstance,NULL);
            break;
        }
        case WM_COMMAND:{
            wmId    = LOWORD(wParam);
            wmEvent = HIWORD(wParam);
                ultem=(int)SendMessage(hListBox,LB_GETCURSEL,0,0L);
                if(ultem!=LB_ERR)
                    {
                    SendMessage(hListBox,LB_GETTEXT,ultem,(LPARAM)Buf);             
                    SendMessage(hStatic, WM_SETREDRAW, FALSE, 0L);
                    SendMessage(hStatic, WM_SETTEXT, 0,(LPARAM)Buf);
                    SendMessage(hStatic, WM_SETREDRAW, TRUE, 0L);
                    InvalidateRect(hStatic, NULL, TRUE);
                    }                   
            InvalidateRect(hwnd, NULL, TRUE);
            break;
        }
        case WM_DESTROY: {
            PostQuitMessage(0);
            break;
        }           
        default:
            return DefWindowProc(hwnd, Message, wParam, lParam);
    }       
    return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow)
{
    WNDCLASSEX wc; 
    HWND hwnd; 
    MSG msg; 
    memset(&wc,0,sizeof(wc));
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.lpfnWndProc   = WndProc; 
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszClassName = "WindowClass";
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    if(!RegisterClassEx(&wc)) {
        MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
    hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, /* x */
        CW_USEDEFAULT, /* y */
        640, /* width */
        480, /* height */
        NULL,NULL,hInstance,NULL);
    if(hwnd == NULL) {
        MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
        return 0;
    }
    while(GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg); 
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
Answer 1

Банальное добавление отладочной печати в ваш обработчик WM_COMMAND показало бы, что он не вызывается вообще при смене выбора в списке.

Ваш список создан без стиля LBS_NOTIFY. Поэтому никаких WM_COMMAND при смене выбора он главному окну не шлет. Поэтому ваш обработчик смены текста даже и не вызывается.

Добавьте LBS_NOTIFY при создании списка.

Эти манипуляции с WM_SETREDRAW для статического контрола нинафиг не нужны. И инвалидировать после смены текста достаточно только сам контрол. Все окно инвалидировать не надо.

READ ALSO
Написать метод emplace для контейнера list

Написать метод emplace для контейнера list

Не знаю как написать метод emplace для листаВот мой лист:

328
как сделать мега меню со скроллингом

как сделать мега меню со скроллингом

Кто подскажет как можно сделать такое мега менюСо скроллингом 1: http://www

209
Привязка к нажатой ссылке

Привязка к нажатой ссылке

У меня есть динамическое формирование списка с ссылками:

212