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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сменить кисть диалогового окна? 
V
    Опции темы
Тутанхамец
Дата 15.1.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Проблема в следующем.

Есть диалог, созданный функцией DialogBox. Хочу, чтобы он рисовался растровой кистью (то есть, которая получается из CreatePatternBrush). Пытаюсь это сделать так:

Код

... в процедуре окна диалога...

    case WM_INITDIALOG: 
        newbrush=CreatePatternBrush((HBITMAP)LoadImage(hInst, (LPCTSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,0));
        

        oldbrushlng=SetClassLong(hDlg,GCL_HBRBACKGROUND,(long)newbrush);
                                i=GetLastError();
                
        UpdateWindow(hDlg);

        MessageBox(hDlg,"dialog was init","qqqq",MB_OK);

    break;
    return TRUE;


В этом меня беспокоит:

1) Всё это не работает! smile Вместо лонга старой кисти, SetClassLong возвращает 0. Казалось бы, ошибка. Но GetLastError() тоже возвращает 0.

2) Если я изменю класс, как это отразится на диалоговых окнах других программ? Они тоже будут крашены под хохлому?

3) Нужно, чтоб изменение класса сразу же сказывалось на окне. Экспериментировал с обычным окном - изменения проявляются только после того, как сверну и разверну окно. Даже с UpdateWindow(). Хотя если изменение происходит обработчике WM_INITDIALOG, то возможно оно будет видно сразу при появлении...

Народ, у кого какие мысли?)





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


Ёжик
***


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

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



1) Старый браш нужно самому бать: GetClasslong(hwnd, GCW_HBRBACKGROUND);
2) Потом InvalidateRect(hwnd, NULL, TRUE);
PM MAIL ICQ   Вверх
Тутанхамец
Дата 15.1.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



До вообще-то старая кисть не очень-то и нужна... Важнее засандалить в класс окна новую. smile

Попробовал с InvalidateRect. Да, если окно обычное (не диалоговое), то всё рулит. Изменения возникают сразу же. Спасибо. Однако, диалоговое как было, так и осталось. Вот кусок процедуры диалогового окна:

Код

BOOL CALLBACK DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){
    HBRUSH newbrush;
    long oldbrushlng;

    switch(Msg){
    case WM_INITDIALOG: 
                    
        oldbrushlng=GetClassLong(hDlg,GCL_HBRBACKGROUND);
        newbrush=CreatePatternBrush((HBITMAP)LoadImage(hInst, (LPCTSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,0));
        
        SetClassLong(hDlg, GCL_HBRBACKGROUND, (long)newbrush);

//UpdateWindow(hDlg);        

InvalidateRect(hDlg,NULL,TRUE);


    return TRUE;



Наличие или отсутствие UpdateWindow влияния не оказывает.

Такое чувство, что в этом виде изменение кисти вообще не предсмотрено. smile

Это, кажется, можно обойти, если создавать диалог через DLGTEMPLATEEX. Там задается класс окна. Но больно много возни потом с созданием кнопок и прочего...

Похоже, придется окну быть некрашеным. Или можно элемент управления Picture на весь диалог...

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


Ёжик
***


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

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



Цитата(Тутанхамец @ 15.1.2006, 18:41 Найти цитируемый пост)

До вообще-то старая кисть не очень-то и нужна... Важнее засандалить в класс окна новую. smile
Ну ты даешь! Старый браш надо обязательно возвращать на место, а созанный - удалять.
Блин! У тебя же диалог!
Код

BOOL CALLBACK DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{    
    HBRUSH newbrush;    
    long oldbrushlng;    
    switch(Msg)
    {    
    case WM_INITDIALOG:
           newbrush=CreatePatternBrush((HBITMAP)LoadImage(hInst, (LPCTSTR)IDB_BITMAP2,IMAGE_BITMAP,0,0,0));
            return TRUE;
    case WM_CTLCOLOR:
         switch(HIWORD(lParam))
         {
                  case CTLCOLOR_DLG:
                           return newbrush;
         }
    }
    return NULL;

Добавлено @ 19:52
Тут старый браш тебя не волнует.

Это сообщение отредактировал(а) Fixin - 15.1.2006, 19:51
PM MAIL ICQ   Вверх
Тутанхамец
Дата 16.1.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Yeeeaaah!! smile

Спасибо, друг! Закраска диалога через WM_CTLCOLORDLG работает в таком вот виде:

Код


BOOL CALLBACK DlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam){

    switch(Msg){
    case WM_INITDIALOG: 
    newbrush=CreatePatternBrush((HBITMAP)LoadImage(hInst, (LPCTSTR) IDB_BITMAP2,IMAGE_BITMAP,0,0,0));
//кисть глобальная. 
    return TRUE; 

case WM_CTLCOLORDLG:
      
          
  return (BOOL)newbrush;
    
case WM_CLOSE:
DeleteObject(newbrush);
EndDialog(hDlg,0);
return TRUE;

}

return FALSE;
}



А по поводу возвращения браша - я с API работаю пару недель всего. Палюсь, вероятно, на туфте. Вот не знаю, например, почему браши и битмапы надо возвращать на их место, а не уничтожать по отдельности. Умные люди зачем-то возвращают:

Код


// вот допустим... где-то в оконной функции...

    case WM_PAINT:

        
hBitmap=LoadImage(NULL,"eleph.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

GetObject(hBitmap, sizeof(BITMAP), &Bitmap);
        
hDC=BeginPaint(hWnd, &PaintStruct);
        
hCompatibleDC=CreateCompatibleDC(hDC);

hOldBitmap=SelectObject(hCompatibleDC,hBitmap);

GetClientRect(hWnd, &Rect);
    
StretchBlt(hDC,0,0,Rect.right, Rect.bottom, 
    hCompatibleDC,0,0,Bitmap.bmWidth, 
    Bitmap.bmHeight, SRCCOPY);

DeleteObject(hBitmap);

SelectObject(hCompatibleDC, hOldBitmap);

DeleteDC(hCompatibleDC);
                    
EndPaint(hWnd, &PaintStruct);

return 0;


Но почему нельзя сделать вот так:

Код


// после StretchBlt

DeleteDC(hCompatibleDC);

DeleteObject(hOldBitmap);
                    
EndPaint(hWnd, &PaintStruct);



Ну, или не с битмапом, а с брашью сделать так же. Что тогда? В памяти что-то останется? На глаз, вроде, работают оба варианта...

Это сообщение отредактировал(а) Тутанхамец - 16.1.2006, 09:15
PM MAIL   Вверх
SergeCpp
Дата 16.1.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Вот так я делал, когда нужно было изменить в классе что-нибудь.

Код

BOOL LifeView::PreCreateWindow( CREATESTRUCT& CreateStruct )
{
    if( !CScrollView::PreCreateWindow( CreateStruct ) )
    {
        return FALSE;
    }

static const char( * s_pLifeViewClass )( NULL );

    if( !s_pLifeViewClass )
    {
        WNDCLASSEX wcx = { sizeof( WNDCLASSEX ) };

        ::GetClassInfoEx( ::GetModuleHandle( NULL ), CreateStruct.lpszClass, &wcx );

        wcx.lpszClassName  = "LifeViewClass";
        wcx.hbrBackground  =  NULL;
        wcx.style         &= ~CS_DBLCLKS;
        wcx.style         |=  CS_OWNDC;

        ::RegisterClassEx  ( &wcx );
        s_pLifeViewClass   =  wcx.lpszClassName;
    }

    CreateStruct.lpszClass = s_pLifeViewClass;

    return TRUE;
}

PM MAIL WWW ICQ   Вверх
Тутанхамец
Дата 16.1.2006, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Спасибо, учту. smile Хотя с ООП мне пока тяжеловато. Это ведь, насколько я понял, для MFC?
PM MAIL   Вверх
SergeCpp
Дата 16.1.2006, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



Да, прога для MFC.

Если нужно, могу выслать всю — пиши ПМ или на почту.
PM MAIL WWW ICQ   Вверх
Тутанхамец
Дата 16.1.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

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



Да нет, спасибо. Суть я понял, но пока с азами классов и MFC не разберусь, мне с нее пользы не много будет. smile
PM MAIL   Вверх
SergeCpp
Дата 17.1.2006, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

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



А ты её в отладчике погоняешь, и понимание быстрее придёт...

Удачи!

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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