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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> static с заданным цветом фона 
:(
    Опции темы
Dimitry
Дата 14.5.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.3.2007

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



Мне нужно на диалоговой панели разместить прямоугольник (либо объект static) с заданным RGB цветом фона.
Код

void PaintWindow(HWND hCtrl,int iColor) {
    HBRUSH hBrush;
    HDC hDc;
    RECT rect;
    hDc=GetDC(hCtrl);
    GetClientRect(hCtrl,&rect);
    hBrush=CreateSolidBrush(iColor);
    hBrush=(HBRUSH)SelectObject(hDc,hBrush);
    DeleteObject(SelectObject(hDc,hBrush));
    ReleaseDC(hCtrl,hDc);
}

void PaintTheBlock(HWND hCtrl,int iColor) {
    InvalidateRect(hCtrl,NULL,TRUE);
    UpdateWindow(hCtrl);
    PaintWindow(hCtrl,iColor);
    InvalidateRect(hCtrl,NULL,TRUE);
}

BOOL CALLBACK AtributeDlgProc(HWND hDlgWnd, UINT DlgMes,
                              WPARAM wParam, LPARAM lParam) {
    static HWND hCtrlBlock;
    switch(DlgMes) {
    case WM_INITDIALOG:
        hCtrlBlock=GetDlgItem(hDlgWnd,IDD_PAINT);
        PaintTheBlock(hCtrlBlock,RGB(0,0,255));
        return TRUE;
    case WM_CLOSE:
        EndDialog(hDlgWnd,TRUE);
        return TRUE;
    }
    return FALSE;
}

Объект остается неизменным. Не пойму в чем дело.
Заранее спасибо.
PM MAIL   Вверх
dizzy1984
Дата 15.5.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

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



PM MAIL   Вверх
Dimitry
Дата 16.5.2007, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 17.3.2007

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



Мне, вообще, хотелось бы узнать, в чем моя ошибка (обращая внимание на выше указанный код). Если так вообще можно закрасить объект static.

Спасибо за внимание.

И дело в том, что в MFC я, еще пока, очень плохо разбираюсь. smile 
PM MAIL   Вверх
586
Дата 16.5.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dimitry @  16.5.2007,  01:41 Найти цитируемый пост)
И дело в том, что в MFC я, еще пока, очень плохо разбираюсь


Код
#include <windows.h>
#include "resource.h"

HBRUSH hbr;

int __stdcall MainDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  switch(uMsg)
  {
  case WM_CTLCOLORSTATIC:
    if(GetDlgCtrlID((HWND)lParam)==IDC_STATIC1)
    {
       // если текста в static'е нет, этот код можно уброать
       SetBkColor((HDC)wParam, /*цвет фона текста*/0xFF);
       SetTextColor((HDC)wParam, /*цвет текста*/0xFF0000);
       //
       return (int)hbr;
    }
    break;
  
  case WM_CLOSE:
      EndDialog(hWnd, 0);
      break;
  }

  return 0;
}

int __stdcall WinMain(HINSTANCE hinst, HINSTANCE, LPSTR, INT)
{
    hbr=CreateSolidBrush(/*цвет фона*/0xFF);
    DialogBoxParam(hinst, MAKEINTRESOURCE(100), 0, MainDlgProc, 0);
    DeleteObject((HGDIOBJ)hbr);
    return 0;
}

PM   Вверх
dizzy1984
Дата 16.5.2007, 06:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 675
Регистрация: 15.2.2007

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



В вашем коде я вижу 2 проблемных момента.
Во-первых, PaintWindow не делает ничего, хотя, судя по ее названию, она предназначается для закраски окна.
Код

hBrush=(HBRUSH)SelectObject(hDc,hBrush);
DeleteObject(SelectObject(hDc,hBrush));

Между ними как минимум должна стоять закраска, но и сами эти строки неправильные.
SelectObject возвращает дексриптор старого объекта вобранного в контекст, hBrush затирается.
Лучше сделать 
Код

hOldBrush = (HBRUSH)::SelectObject(hDc,hBrush);

Потом позднее
Код

::DeleteObject(hBrush);
::SelectObject(hDc,hOldBrush);

Второй раз вызывать SelectObject вообще не стоит.
Закрасить часть окна можно скажем с помощью Rectangle
Код

::Rectangle(hDc,10,10,100,100);

Второй момент в том что физию вам портит строка
Код

InvalidateRect(hCtrl,NULL,TRUE);

которая делает следующее.
Она добавляет всю клиентскю область к региону для последующей отрисовки которая происходит в ответ на сообщение WM_PAINT посланное сразу после того, как опустеет очередь сообщений, т.е практически после появляния на экране окна. Таким образом если бы вы имели счастье написать процедуру PaintWindow верно, вы бы все равно ничего не заметили, т.к фон окна почти сразу же был бы перерисован.
Ваш вариант будет работать вплоть до первого сообщения WM_PAINT (а скорее всего даже WM_CTLCOLOR), после которого фон перерисуется.
В windows для того что вы хотите есть сообщение WM_CTLCOLOR, которое посылается окну, непосредственно перед отрисовкой его фона. Т.е в самом нужном для вас месте. Вам нужно ответить на это сообщение и вернуть дескриптор кисти с заданным вами цветом. windows использет его для последующей отрисовки.

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

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


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

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


 




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


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

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