Добрый день. У меня есть окно со списком и текстовое поле. Хочу что бы при клике на элемент списка, в текстовом поле появлялся аналогичный элементу списка текст. Все вроде бы отрабатывает, но текст в текстовом поле сразу не меняется. Сколько ни кликай по элементам в текстовом поле старая надпись. Однако, как только окно становиться неактивным, текстовое поле обновляется и все становиться ок. Пробовал добавлять 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;
}
Банальное добавление отладочной печати в ваш обработчик WM_COMMAND
показало бы, что он не вызывается вообще при смене выбора в списке.
Ваш список создан без стиля LBS_NOTIFY
. Поэтому никаких WM_COMMAND
при смене выбора он главному окну не шлет. Поэтому ваш обработчик смены текста даже и не вызывается.
Добавьте LBS_NOTIFY
при создании списка.
Эти манипуляции с WM_SETREDRAW
для статического контрола нинафиг не нужны. И инвалидировать после смены текста достаточно только сам контрол. Все окно инвалидировать не надо.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Не знаю как написать метод emplace для листаВот мой лист:
Кто подскажет как можно сделать такое мега менюСо скроллингом 1: http://www