не може да промени реда на контролите на mfc

Имам диалогов прозорец със списъчно поле, плъзгач и бутон. Опитах се да променя цвета на фона, но не успях да го променя, така че си помислих, че ако добавя „контрол на картината“ като растерно изображение и го поставя на заден план, ще успея, но сега проблемът е, че „ контрол на картината" е над всички контроли.

Опитах се да променя контролата на раздела с Ctrl+d, но това не промени нищо. Също така се опитах да използвам SetWindowPos за отгоре или отдолу, но също така не промени нищо.

Забелязах, че ако щракна в местоположението на бутона, той се извежда отпред, както искам. Има ли някакъв начин да "щракате" всички контроли в началото? пропускам ли нещо, за да доведа контрола до върха?


person David    schedule 12.06.2013    source източник
comment
Сигурни ли сте, че сте управлявали правилния ред с Ctrl-D? Можете да редактирате .rc файла директно, за да сте сигурни, че досадната контрола е първата в списъка.   -  person Balog Pal    schedule 12.06.2013
comment
Опитах много опции с ctrl+d, но нищо не се промени   -  person David    schedule 12.06.2013
comment
Опитах се да редактирам директно rc файла и се получи!!! Tnx :-)   -  person David    schedule 13.06.2013


Отговори (2)


Ако трябва да промените цвета на фона на диалоговия прозорец, трябва да се справите с Съобщение WM_CTLCOLORDLG и връщане на манипулатора към четка (ако четката не е стандартен обект, уверете се, че сте изтрили четката след затваряне на диалоговия прозорец) -- или , можете да обработите съобщението WM_ERASEBKGND и сами изтрийте фона.

person Edward Clements    schedule 12.06.2013
comment
Вече пробвах двата метода и нищо не се случи. Предпочитам да разбера как да променя реда на контролите - person David; 12.06.2013
comment
Ако искате да продължите с реда на контролите, бих препоръчал казаното от Балог Пал по-горе: редактирайте .rc файла директно и преместете контролата на картината като първата контрола на диалоговия прозорец. Въпреки това се опитах да обработя съобщението WM_CTLCOLORDLG в обикновен диалогов прозорец About и наистина работи! CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { m_hbrBackground = CreateSolidBrush(RGB(255, 0, 0)); } CAboutDlg::~CAboutDlg() { DeleteObject(m_hbrBackground); } в WindowProc: if (message == WM_CTLCOLORDLG) return (LRESULT) m_hbrBackground; - person Edward Clements; 12.06.2013
comment
Статия на MSDN относно Промяна на реда на контролите в разделите - person Edward Clements; 12.06.2013
comment
Знам как да променя реда на разделите. Трябва да променя z реда на контролите. Опитах се да променя реда на разделите, защото прочетох, че по този начин променям и реда z - person David; 12.06.2013

Опитах се да променя контролата на раздела с Ctrl+D, но това не промени нищо. Също така се опитах да използвам SetWindowPos за отгоре или отдолу, но също така не промени нищо.

Ctrl+D ви отвежда в режим на пренареждане, но има по-надежден начин за проверка. Шаблонът на диалоговия прозорец е в текстова форма в .RC файл, където можете да прегледате реда на управление с текстов редактор и да сортирате редовете ръчно по желания от вас начин. Това ще бъде редът на създаване на контрола и редът на разделите също. Понякога е дори по-лесно да пренаредите контролите по този начин.

Нещо повече, когато приложението ви работи, инструментът Spy++ SDK може да изброява прозорците и отново ще ви даде ред на прозорците за проверка.

SetWindowPos с подходящи аргументи променя Z-реда на контролите и по време на изпълнение.

person Roman R.    schedule 12.07.2013