Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CDialog


Автор: BBC 17.3.2005, 08:24
Подскажите, если не лень! В CView перерисовка окна после, например, минимизации осуществляется в OnDraw() а в CDialog где???

Автор: Nastya 18.3.2005, 09:22
OnPaint - перерисовка любого окна.
Прост В MFC когда приходить собщение WM_PAINT делается кое-что и вызывается OnDraw.
Если нужно обработать изменение размеров окна обрабатывай сообщение WM_SIZE.
Я правильно поняла вопрос ???

Автор: Guest 18.3.2005, 17:19
Спасибо за подсказку, проблема вот вчем:
устанавливаю иконку на контрол

HICON HicRing=AfxGetApp()->LoadIcon("Ring");
CWnd*Wnd=AfxGetMainWnd()->GetDlgItem(IDC_ANIMATE);
CDC *pDC=Wnd->GetDC();
pDC->DrawIcon(0, 0,HicRing );
Wnd->ReleaseDC(pDC);
pDC->DeleteDC();

окно свернул, иконка исчезла
Устанавливать ее в OnPaint() ?
И почему не работает SetIcon(HicRing, TRUE); ?

Автор: Nastya 18.3.2005, 18:59
А я не вижу сдесь SetIcon?

Автор: Coocky 18.3.2005, 21:04
Цитата
устанавливаю иконку на контрол

Цитата
окно свернул, иконка исчезла

В первый раз слышу smile
Вообще ты все делаешь через CDC.А с диалогом это только OnPaint прокатывает.Так как сказала Настя,
Цитата
OnPaint - перерисовка любого окна.

Даже если ты его свернешь,закроешь другим -всегда будет перерисовка.
Ты или рисуй все в OnPaint(),или пользуйся методами класса,которые присоединяют иконку или изображение smile (Если таковые имеются)

Автор: Guest 18.3.2005, 22:18
Я имел в виду вместо

/*CDC *pDC=Wnd->GetDC();
pDC->DrawIcon(0, 0,HicRing );
Wnd->ReleaseDC(pDC);
pDC->DeleteDC();*/

HICON HicRing=AfxGetApp()->LoadIcon("Ring");
CWnd*Wnd=AfxGetMainWnd()->GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(HicRing, TRUE); - не работает!!!

Я переодически меняю иконки в IDC_ANIMATE. При сворачивании окна они исчезают.
В OnPaint() их установку дублировать? Я пробывал - работает, но по моему с точки зрения
MFC это не совсем правильно. Как это предлагает делать МелкоСофт?

Автор: Coocky 18.3.2005, 22:28
Цитата
IDC_ANIMATE

Насколько я понимаю это ID элемента,относящегося к классу СStatic?
А ну ка попробуй сделать это с кнопочкой

CButton*Wnd=(CButton*)GetDlgItem(MY_BUTTON);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE); -
Только кнопку не забудь создать smile

Автор: Guest 19.3.2005, 15:08
Вообще то у меня IDC_ANIMATE - не StaticText а Picture, хотя со StaticText не работает тоже.
С кнопочкой проблем ни когда не было, только ей стиль Icon нельзя забывать ставить

CButton*Wnd=(CButton*)GetDlgItem(MY_BUTTON);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE);--работает, а

CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE);--
не работает!!!

Автор: Coocky 20.3.2005, 22:39
Дай мне время,ОК?Дам готовое...

Автор: Guest 29.3.2005, 16:41
Ну так почему же не работает
CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE);????

Автор: knave 29.3.2005, 17:16
Вью перерисовывать лучше всего в WM_ERASEBKGND - или чтото в этом духе.
Тогда нет никаких посторонних эффектов.

Автор: Lion 12.4.2005, 09:20
А так:
Код

HICON    hIcon=::AfxGetApp()->LoadIcon(IDI_ICON2);
CStatic *pStat=(CStatic *)GetDlgItem(ID_MY_ICON);
pStat->SetIcon(hIcon);


У меня иконки при минимизации не исчезают.

Автор: Step 13.4.2005, 12:55
Цитата(Guest @ 29.3.2005, 16:41)
Ну так почему же не работает
CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE);????


главное правильно задать вопрос....

а впоросов два
1. работает или нет?
2. елси работает то почему не вижу...
чето на философию потянуло...


короче,

СWND устанавливает иконку и отображает ее на титле в левом углу если подходит формат
т.е. нужно поставить false
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), false); и если у этого окна есть титл то иконка измениться.....


сетикон работает всегда для всех производных от внд, вопрос в тому куда производный внд ее выводит....


Автор: BBC 17.4.2005, 19:50
Сформулирую вопрос убого.
Как поставить иконку в необходимом мне месте диалогового окна. Только при ответах читайте,
что я уже делал выше, что бы не повторяться.

Step :
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), false);
//естественно пробовал, иконка не отображается

Lion :
HICON hIcon=::AfxGetApp()->LoadIcon(IDI_ICON2);
CStatic *pStat=(CStatic *)GetDlgItem(ID_MY_ICON);
pStat->SetIcon(hIcon);
// Это я тоже пробовал еще до вопроса в форуме. А у вас работает?

А вот код:

/*HICON HicRing=AfxGetApp()->LoadIcon("Ring");
CWnd*Wnd=AfxGetMainWnd()->GetDlgItem(IDC_ANIMATE);
CDC *pDC=Wnd->GetDC();
pDC->DrawIcon(0, 0,HicRing );
Wnd->ReleaseDC(pDC);
pDC->DeleteDC();*/

иконку отображает, но при сворачивании окна она исчезает. Как правильно ее установить с точки зрения MFC ? DrawIcon() в OnDraw() ?
Кстати, SetIcon() возвращает не 0, а иконки не видно.

Автор: Coocky 17.4.2005, 21:30
Цитата
но при сворачивании окна она исчезает

При любой перерисовке окна вызывается OnPaint,в WM_PAINT.Так что там рисуй

Автор: Lion 18.4.2005, 06:16
Цитата(BBC @ 17.4.2005, 16:50)
Lion : ....
// Это я тоже пробовал еще до вопроса в форуме. А у вас работает?

иконку отображает, но при сворачивании окна она исчезает.
.....

Да у меня работает и иконка не исчезает, при минимизации или перекрытия окна другим. Ставить можно в ЛЮБОМ месте (и с точки зрения MFC это правильно). Могу выслать работающий пример. smile

Я честно говоря вообще не понимаю, почему если у вас есть элемент CStatic в котором вы хотите менять иконки вам настойчиво советую приводить к указателю на CWnd? В общем это конечно не так важно, но для вашей задачи CStatic удобнее.


Автор: BBC 20.4.2005, 22:12
Уважаемые господа - программисты!
Я уже устал писать один и тот же код-

ни:

HICON hIcon=::AfxGetApp()->LoadIcon("Ring");
CStatic *pStat=(CStatic *)GetDlgItem(IDC_ANIMATE);
pStat->SetIcon(hIcon);

ни:

CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), TRUE);

ни:

CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
Wnd->SetIcon(AfxGetApp()->LoadIcon("Ring"), FALSE);

иконку на IDC_ANIMATE не У С Т А Н А В Л И В А Ю Т!

А :

CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
HICON hIcon=::AfxGetApp()->LoadIcon("Ring");
CDC *pDC=Wnd->GetDC();
pDC->DrawIcon(0, 0,hIcon);
Wnd->ReleaseDC(pDC);
pDC->DeleteDC();

УСТАНАВЛИВАЕТ! Почему?

Автор: Lion 21.4.2005, 07:18
Цитата(BBC @ 20.4.2005, 19:12)
Уважаемые господа - программисты!

Уважаемый BBC так вам выслать код или нет? smile
Цитата(BBC @ 20.4.2005, 19:12)

А :

CWnd*Wnd=(CWnd*)GetDlgItem(IDC_ANIMATE);
HICON hIcon=::AfxGetApp()->LoadIcon("Ring");
CDC *pDC=Wnd->GetDC();
pDC->DrawIcon(0, 0,hIcon);
Wnd->ReleaseDC(pDC);
pDC->DeleteDC();

УСТАНАВЛИВАЕТ!  Почему?


А "устанавливает" потому, что вы просто единократно получив контекст окна отрисовываете в нем иконку. И вполне логично, что при повторном перерисовывании окна (случай свертывания или частичного перекрытия окна) стандартная функция отрисовки рисует только то, что она знает о контролах на диалоге. На месте нарисованной вами иконки рисует бэкграунд диалога, т.к. CStatic в вашем случае пустой. smile

Автор: BBC 22.4.2005, 19:09
Если можно:[email protected]
DrawIcon() понятно. А SetIcon() почему не ставит?

Автор: Lion 25.4.2005, 09:48
Цитата(BBC @ 22.4.2005, 16:09)
Если можно:[email protected]
DrawIcon() понятно. А SetIcon() почему не ставит?


Ну это мне объяснить сложно т.к. у меня ставит. smile
Код после обеда вышлю.

Автор: BBC 27.4.2005, 23:05
Уважаемый Lion !
Действительно с CStatic работает!
И даже код которыя я пробовал и писал выше:

HICON hIcon=::AfxGetApp()->LoadIcon("Ring");
CStatic *pStat=(CStatic *)GetDlgItem(IDC_ANIMATE);
pStat->SetIcon(hIcon);

- сейчас прекрасно справляется с этой чертовой иконкой. Глюки какие то........... Косят, сволочи,
ряды наши.
Спасибо за помощь!

Автор: Lion 28.4.2005, 05:16
Цитата(BBC @ 27.4.2005, 20:05)
Уважаемый Lion !
...............................
Спасибо за помощь!

Незагде. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)