Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заставить окно (или часть) перерисоваться 
:(
    Опции темы
Ibragim
Дата 29.7.2005, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Всем ночи доброй.
Такой вот вопрос: есть кусок кода

Код

if (FocusedLeft->Next() != NULL) 
{
FocusedLeft = FocusedLeft->Next();
UpdateWindow(hLeftWnd);


по этой обработке, по идее, переносится отображние фокуса на другой элемент (мой, я там сам все в WM_PAINT перерисую).

Так вот, корректно перерисует он только в том случае, если я, например, спрячу и покажу окно, или закрою его окном другого приложениея, и т.д. А мне нужно сразу. Как сказать - "возьми и перерисуйся"?
Добавлено @ 01:19
а, и еще: есть окно
Код


hLeftWnd = CreateWindow("RJ-Panel","Root", WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CAPTION|WS_TABSTOP|WS_GROUP,
                            0,0,0,0,hMainWnd,GetMenu(hMainWnd),hInst,NULL);
SetFocus(hLeftWnd);


Можно ему как-то сказать подсветить синим заголовок - что оно активно? Заголовок хоть убей серый, неактивный.
Заранее спасибо.

Это сообщение отредактировал(а) Ibragim - 29.7.2005, 01:17
PM MAIL   Вверх
chaos
Дата 29.7.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



1) сделай так:
Код

if (FocusedLeft->Next() != NULL) 
{
    FocusedLeft = FocusedLeft->Next();
    InvalidateRect(hLeftWnd, NULL, TRUE);

2) за место сет фокус попробуй воспользоваться SetActiveWindow
PM WWW   Вверх
Ibragim
Дата 29.7.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Спасибо, 1) - без коментариев, все прекрасно тут же заработало.

... а вот 2) не помогает smile
если не делаешь SetFocus - окно вообще не ловит сообщения, а SetActiveWindow ни к чему не приводит - никаких изменений. Может, лажа где-то в WS_XXX ?
PM MAIL   Вверх
chaos
Дата 29.7.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



Цитата(Ibragim @ 29.7.2005, 01:16)
а, и еще: есть окно
Код


hLeftWnd = CreateWindow("RJ-Panel","Root", WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CAPTION|WS_TABSTOP|WS_GROUP,
                            0,0,0,0,hMainWnd,GetMenu(hMainWnd),hInst,NULL);
SetFocus(hLeftWnd);


Можно ему как-то сказать подсветить синим заголовок - что оно активно? Заголовок хоть убей серый, неактивный.
Заранее спасибо.

а про это по подробнее бы и коду побольше
PM WWW   Вверх
Ibragim
Дата 29.7.2005, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



C удовольствием:

Код

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
......
// Создаем главное окно приложения
hMainWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,CW_USEDEFAULT,
                        0, NULL, NULL, hInstance, NULL);
ShowWindow(hMainWnd, nCmdShow);
UpdateWindow(hMainWnd);
......
// Создаем левую панель
hLeftWnd = CreateWindow("RJ-Panel","Root", WS_CHILD|WS_VISIBLE|WS_BORDER|WS_CAPTION|WS_TABSTOP|WS_GROUP,
                            0,0,0,0,hMainWnd,GetMenu(hMainWnd),hInst,NULL);
// Говорим ей  - давай, становись активной
SetFocus(hLeftWnd);
SetActiveWindow(hLeftWnd);
// Ну это просто чтобы размеры панели корректно отобразить
PostMessage(hMainWnd, WM_SIZE, 0, 0);

// И вот после этого всего все равно активное (синее) окошко главного окна, а hLeftWnd по-прежнему серое, хотя сообщения WM_KEYDOWN отлавливает hLeftWnd, то есть как-то оно все-таки активно :) ... наполовину :)


Если нужно, вот классы окон:

Код

    WNDCLASS wc;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(hInstance, szAppName);//IDI_MAINICON);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) (COLOR_WINDOW);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;

    WNDCLASS wpc;
    wpc.style = CS_HREDRAW | CS_VREDRAW;
    wpc.lpfnWndProc = (WNDPROC)PanelProc;
    wpc.cbClsExtra = 0;
    wpc.cbWndExtra = 0;
    wpc.hInstance = hInstance;
    wpc.hIcon = NULL;
    wpc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wpc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wpc.lpszMenuName = NULL;
    wpc.lpszClassName = "RJ-Panel";

PM MAIL   Вверх
Romikgy
Дата 29.7.2005, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



А если после
Цитата(Ibragim @ 29.7.2005, 12:48)
SetFocus(hLeftWnd);

ShowWindow(hLeftWnd, SW_RESTORE); // ну или SW_SHOW
по идее должно помочь.


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Rrader
Дата 29.7.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 3
Всего: 191



Цитата

SetFocus(hLeftWnd);

SetForegroundWindow(hLeftWnd);


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
chaos
Дата 29.7.2005, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



вот посмотри решение:
сделал я следуюющее: создал дав независимых окна(не установленно свойство WM_CHILD и тп)
послетого как создал делаю SetParent
Код

#include <windows.h>

char name1[] = "wnd1";
char name2[] = "wnd2";

HWND hWnd1, hWnd2;
HINSTANCE hInst;
WNDCLASS wnd1, wnd2;

LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK WndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    hInst = hInstance;

    wnd1.cbClsExtra = 0;
    wnd1.cbWndExtra = 0;
    wnd1.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    wnd1.hCursor = LoadCursor(NULL, IDC_ARROW);
    wnd1.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wnd1.hInstance = hInstance;
    wnd1.lpszClassName = name1;
    wnd1.lpszMenuName = NULL;
    wnd1.style = CS_HREDRAW | CS_VREDRAW;
    wnd1.lpfnWndProc = WndProc1;

    wnd2.cbClsExtra = 0;
    wnd2.cbWndExtra = 0;
    wnd2.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
    wnd2.hCursor = LoadCursor(NULL, IDC_ARROW);
    wnd2.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wnd2.hInstance = hInstance;
    wnd2.lpszClassName = name2;
    wnd2.lpszMenuName = NULL;
    wnd2.style = CS_HREDRAW | CS_VREDRAW;
    wnd2.lpfnWndProc = WndProc2;

    if (!RegisterClass(&wnd1))
    {
        MessageBox(NULL, "Create wnd1 ERROR!!!", "ERROR", MB_OK);
        return FALSE;
    }

    if (!RegisterClass(&wnd2))
    {
        MessageBox(NULL, "Create wnd1 ERROR!!!", "ERROR", MB_OK);
    }


    hWnd1 = CreateWindow(
                    name1, name1,
                    WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    CW_USEDEFAULT, CW_USEDEFAULT,
                    NULL, NULL, hInstance, NULL);
    if (NULL == hWnd1)
    {
        MessageBox(NULL, "Create hWnd1 ERROR!!!", "ERROR", MB_OK);
        return FALSE;
    }

    ShowWindow(hWnd1, nShowCmd);
    UpdateWindow(hWnd1);


    hWnd2 = CreateWindow(
                name2, name2,
                WS_CLIPCHILDREN | WS_VISIBLE|WS_BORDER|WS_CAPTION|WS_TABSTOP|WS_GROUP,
                0, 0,
                100, 100,
                NULL, NULL, hInst, NULL);
    if (NULL == hWnd2)
    {
        MessageBox(NULL, "Create hWnd2 ERROR!!!", "ERROR", MB_OK);
    }
        
    ShowWindow(hWnd2, SW_SHOW);
    UpdateWindow(hWnd2);

    SetParent(hWnd2, hWnd1);
    MSG msg;
    while (GetMessage(&msg, NULL, 0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc1(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}

LRESULT CALLBACK WndProc2(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }

    return 0;
}


если не понравится решение, попробуй почитать сдесь:
http://www.lcard.ru/~nail/frolov/bsp/v17/ch1.htm#ch1_1
PM WWW   Вверх
Ibragim
Дата 29.7.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Спасибо за помощь всем откликнувшимся, трудовая ночь начинается, буду попробовать. Сегодня напишу, что получилось. smile


PM MAIL   Вверх
Ibragim
Дата 29.7.2005, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



Да,
chaos, спасибо, все заработало!!
сэнкс.
PM MAIL   Вверх
Ibragim
Дата 29.7.2005, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



господа, а не знаете - как запретить двигать и изменять размеры окна, но иметь у него CAPTION (ну, эдакую синюю или серую панельку с названием вверху)?
PM MAIL   Вверх
Fixin
Дата 29.7.2005, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Обрабатываешь сообщение WM_GETMINMAXINFO, в lParam - указатель на структуру MINMAXINFO. В ней ставь нужные размеры. Или сразу при обработке этого сообщения SetWindowPos(...);
PM MAIL ICQ   Вверх
Ibragim
Дата 30.7.2005, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 28.9.2004
Где: Киев

Репутация: нет
Всего: нет



а есть вариант просто убрать такую возможность в стиле окна? ну, например, чтобы пользователю нельзя было "ухватиться" за край окна?




PM MAIL   Вверх
Fixin
Дата 30.7.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Сейчас посмотрю...
PM MAIL ICQ   Вверх
Fixin
Дата 30.7.2005, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

Репутация: 8
Всего: 18



Ага, вот стиль окна:
Код
WS_OVERLAPPED| WS_CAPTION| WS_SYSMENU|WS_MINIMIZEBOX

PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.